第十九计:避免类的臃肿
在我接触过的大部分项目中,总会有一个“大胖子“类特别惹眼,一般来说,这“大胖子“实际上是整个系统的核心类之一,之所以“胖“,主要原因是很多人都会把自己需要的函数加到这个类中,却没有人主动请缨来为它“减肥“。可以通过以下几种方式来为它“瘦身”:
1、按照某种特性(如功能、类型等)将这个类拆分成多个类。
2、合并冗余函数,保持函数粒度的最小化。
3、去除重复代码。
如果实在不能再“瘦”了,那就通过实现相应的接口,让它“看上去很瘦“,举个例子:
public class BigBoy{
public void foo1();
public void foo2();
public void foo3();
public void foo4();
public void foo5();
public void foo6();
public void foo7();
public void foo8();
public void foo9();
// 还有很多...
}
这个类有很多函数,这让类的使用者很头疼,没办法,它不能再“瘦“了,不过,我们可以根据某种特性把这些函数抽象成多个接口,例如foo1、foo2、foo3可以抽象成一个接口:
public interface LittleBoy{
public void foo1();
public void foo2();
public void foo3();
}
然后让BigBoy实现这个接口,并提供一个将BigBoy变成LitterBoy的函数:
public class BigBoy implements LittleBoy{
public LittleBoy asLittleBoy{)
return this;
}
public void foo1();
public void foo2();
public void foo3();
public void foo4();
public void foo5();
public void foo6();
public void foo7();
public void foo8();
public void foo9();
// 还有很多...
}
第二十计:保持代码风格的一致性
程序员或多或少都有各自的代码风格,当我们看和自己风格不同的人写的代码时都觉得有点别扭,甚至会影响读代码的流畅性,记得以前有个同事把for语句当if语句用,像下面这样,太个性了,看他的代码真有点头疼。
for(;value>10;){
...
}
整个程序保持一致的代码风格还是比较重要的,如果看着就像一个人写那就太到位了,所以,最好能在项目初期就统一程序的命名规范、通过逻辑处理规范、注释规范等。
第二十一计:成员变量要封装
大部分情况下,类中的成员变量都应该被声明为私有的,为那些需要被其他类访问的变量增加set或者get函数。如果成员变量声明为公有的,那么类就失去了对它们的控制权!封装成员变量有以下几个好处:
1、在为成员变量赋值时进行有效性校验或其他预处理操作。
2、在返回成员变量的值时进行二次包装,当该变量不可用或未初始化时返回默认值。
为成员变量分别增加set和get函数是一件挺繁琐的事情,很多人嫌麻烦,觉得公有成员变量更方便,不过从可维护性和可扩展性的角度看,添加set和get是值得的,Eclipse中可以自动生成set和get函数的,非常方便。
第二十二计:用自注释性变量代替复杂条件
嵌套层次较深的IF判断、没有注释的复杂条件大大增加了程序的逻辑复杂性,严重降低代码的可读性。对于子条件较多的条件判定,可以为各个子条件引入具有自注释性的临时变量来降低复杂性。例如下面是判断登录用户是否能进入网站的后台管理界面:
if(userName!=null && userName.equals(name) && (userState != INACTIVE || userState != DELETE) && userPassword!=null && userPassword.equals(password) && (userGroup == "Manager" || userGroup == "Root")){
...
}
下面是修改后的版本:
boolean isUserNameValid = userName!=null && userName.equals(name);
boolean isUserActive = userState != INACTIVE || userState != DELETE;
boolean isUserPasswordCorrect = userPassword!=null && userPassword.equals(password);
boolean isUserHasAuth = userGroup == "Manager" || userGroup == "Root";
if(isUserNameValid && isUserActive && isUserPasswordCorrect && isUserHasAuth){
...
}
第二种方式不仅使条件判断更具有可读性,还能重用子条件。
第二十三计:避免重复代码
重复代码是破坏程序可维护性的重量级选手之一,大量的重复代码会使代码量膨胀,修改重复的代码也很繁琐,改了一处后必须同时修改和它重复的代码,因此非常引入Bug,当有人修改了某处代码而忘记修改其他除重复的代码,那么Bug就出现了。所以,一旦要拷贝某段代码,请先考虑把这段代码通用化。
第二十四计:增加注释
记得在第一个公司工作的时候,公司很多程序员的代码注释率在40%左右,一般都是先写注释,然后紧接着写代码,因为注释也是一种文档。很多人觉得写注释浪费时间或者没有必要,所以他们的代码中没有绿色,或者只是星星点点,如果代码有一定的复杂性,那么其他人看这部分代码可能会比代码作者要费劲的多,注释就是帮助别人快速理解自己写的代码。
ref:http://blog.csdn.net/m13666368773/article/details/7473781
分享到:
相关推荐
重构----改善既有代码的设计(完整中文扫描版PDF)
重构,其实很简单,它的目的就是让程序变得更容易被理解,更具有可维护性,结构更合理。
重构----改善既有代码的设计(By Martin Fowler) 非常经典的一本书!
重构----改善既有代码的设计 怎么写好一个类,怎么重构已有代码,运用多中重构代码的方法,去改善代码结构。
代码重构 C++ 36计 摘抄至http://www.cnblogs.com/west-link/archive/2012/04/16/2446878.html,自行整理出文档,以便后用。
重构不是一项靠着天分挥洒的艺术,而是一项工程。重构是一种有纪律的,经过训练的,有条不紊的程序整理方案,可以将整理过程中不小心引入错误的机率降到最低
参考资料-云服务重构新零售--2017阿里巴巴商业服务生态白皮书.zip
基于Mojolicious框架对pfqq项目进行的重构Mojo-Webqq-master.zip
是一个非常好的讲解重构的资料,简单可读,容易理解,值得朋友们参考
vr技术与信息传播模式重构-网络传播-通信传播.pdf
相空间重构C-C法,含数据 。。
技术重构社会供应链-未来科技趋势白皮书100页.pdf
【面向3D图像重构的100G-FMCW-MIMO雷达】
有色金属行业钴:供需重构,行业反转-20190924-国泰君安-34页.pdf
思想的传承、决裂与重构(上)--《德意志意识形态》创作前史研究.docx
本书讲述重构,即在不改变软件现有功能的基础上,通过调整程序代码改善软件的质量、性能,使其程序的设计模式和架构更趋合理,提高软件的扩展性和维护性。
ChatGPT快速流行重构AI商业模式-23020819页.pdf
思想的传承、决裂与重构(上)--《德意志意识形态》创作前史研究(1).docx