首先说下《代码大全》这本书,此书可作为程序员的圣经,相信各个阶段的程序员看此书的收获都不会小。新手可以通过此书来提高自己的专业技能、学习项目开发的流程。经验丰富的程序员可以通过此书来提高自己的代码质量,检查自己的不足和bug。
但由于此书很多都是理论上的知识,具体还需要自己在工作上和实践中多敲代码多体会。与此书配套的书还包括《重构》、《设计模式》、《算法导论》等。
此轮的迭代收获最大的就是编写代码的质量,从三个方面入手:可以工作的类、高效的子程序和防御式编程。
一、可以工作的类:
看完《代码大全》发现自己以前写的类几乎都是面向过程在思考,并不属于OOP的思想。首先,类作为现实生活中的对象的映射,应该是被看做整体,没多余或者不属于此对象的元素。好比一匹马不可能有翅膀,所以“马”这个对象如果想上天至少需要两个对象——“飞机”和“马”。但是原来写代码的时候常常会在“马”这个类中加上“飞机”的元素,正常应该写两个类,然后调用。
一个高质量的类的内聚性一定非常好,没有多余的元素,也没有缺少的元素,不需要将它拆开,形成一个完整的抽象。
二、高效的子程序
如果说类是一个工厂的话,那子程序就是工厂上的每个机器,一个机器仅仅负责一件事。
此轮迭代中,针对缓存进行了很大部分的优化,其中需要:1、用户的菜单从缓存中获取,2、如果获取不到需要进数据库load数据,3、然后放入缓存,4、再从缓存中获取。
以前本人写的代码会在一个子程序中将234的具体细节全部实现,这样写虽然功能实现了,但是代码质量却非常低:
1、很不利于阅读。程序其实是给程序猿看的,根本不是给机器看的。臃肿的代码交给其它程序猿的话,对方很可能很难看懂。
2、不利于维护。很多的功能放在一起,如果其中某一块出现问题,那很可能也会牵扯带这个子程序其它的流程。
3、可以说不符合OOP的思想,因为没有一个机器可以直接造出一台汽车(原谅本人大学是机械专业的)。
后面修改代码,具体的细节改成:1、用户的菜单从缓存中获取,2、从数据库load数据,3、将数据放入缓存,4、从缓存中取数据。好处有以下几点:
1、这样代码结构很清晰,映射出编写此程序的程序员的思维也很清晰,阅读人员可以很快接受。
2、符合oop的思想,这些子程序每一个都只负责处理一件事,并且这些子程序很独立,即使脱离这个类,仍然能够保持自己的语义,不会因为环境变化而导致语义发生变化。
3、维护方便。如果某个地方出问题就只需要修改某一个子程序,不需要修改其它的部分,减少维护量。
三、防御式编程
许多的编程都应该按照此思想去写,这样才能减少崩溃的概率,让编写出的程序足够健壮。
private List<String> getOrgMenuIdsFromCache(String orgId) {
if (StringUtils.isEmpty(orgId))
return null;
//将数据库中的menuIds放入缓存,再返回这个缓存的menuIds
String menuIds = GlobalCacheUtil.getVarStringValue(OrgUtil.getOrgMenuIdsCacheName(orgId));
if (null == menuIds || StringUtils.isEmpty(menuIds))
menuIds = OrgUtil.getOrgMenuActionCache(orgId);
try {
return JSON.parseArray(menuIds, String.class);
} catch (Exception e) {
logger.error(menuIds);
logger.error("JsonUtil 解析json获取 data失败");
}
return null;
}
以上这段代码,很好的保持这种风格,在可能出现错误的位置都进行了判断。如果在此处出错也不会对整个系统产生什么大的影响。
当然,从结构的和风格上来看,代码还是有很多不足,比如子程序过长、不够紧凑、用的方法不够严谨、没有注意高扇入低扇出的要求等等。在以后的工作中会更加严谨的对待代码的编写。