第十九计:避免类的臃肿
在我接触过的大部分项目中,总会有一个“大胖子“类特别惹眼,一般来说,这“大胖子“实际上是整个系统的核心类之一,之所以“胖“,主要原因是很多人都会把自己需要的函数加到这个类中,却没有人主动请缨来为它“减肥“。可以通过以下几种方式来为它“瘦身”:
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),精彩不容错过。
重构----改善既有代码的设计 怎么写好一个类,怎么重构已有代码,运用多中重构代码的方法,去改善代码结构。
【代码重构36计】是关于提升代码质量与可维护性的策略集合,主要针对C++编程语言。重构的核心目标是使程序更容易理解、更便于维护,并优化其结构。以下是其中的五项重构策略: 1. **参数列表对象化**: 当函数的...
《重构》是一本深入探讨软件开发过程中的代码优化与改进的经典著作。重构,简单来说,是在不改变软件外部行为的前提下,对其内部结构进行改进,以提高代码的可读性、可维护性和可扩展性。这一过程并非依赖于个人天赋...
相空间重构C-C法,含数据 。。
重构是软件开发中持续改进代码质量的实践活动,它不改变程序的外部行为,而是让代码的内部结构变得更为合理、高效。Martin Fowler是重构领域中极具影响力的专家之一,他的著作《重构——改善既有代码的设计》被广泛...
"应用MATLAB实现连续信号的采样与重构仿真" MATLAB 是一款功能强大且广泛应用于工程领域的软件工具,MATLAB 的应用范围非常广泛,包括信号处理、图像处理、控制系统、机器学习等领域。该课程设计主要介绍了使用 ...
本书讲述重构,即在不改变软件现有功能的基础上,通过调整程序代码改善软件的质量、性能,使其程序的设计模式和架构更趋合理,提高软件的扩展性和维护性。
在编程领域,重构是一种优化软件设计的重要技术,它并不改变软件的功能,而是通过改进代码结构,使其更易于理解和维护。本项目"重构源代码C1-c++版本"是基于原书中的Java重构示例,转化为C++语言实现的实例。这为...
技术重构社会供应链-未来科技趋势白皮书100页.pdf
思想的传承、决裂与重构(上)--《德意志意识形态》创作前史研究.docx
ChatGPT快速流行重构AI商业模式-23020819页.pdf
通信行业春季投资策略:国之重器,重构5G真成长-0227-国泰君安-38页.pdf
思想的传承、决裂与重构(上)--《德意志意识形态》创作前史研究(1).docx
二维二进小波的快速分解与重构算法matlab实现-ex7-4.rar 使用matlab来实现非正交二次样条二维二进小波的快速分解和重构 编程实现例7.4中可分离二维二进小波的快速分解与重构算法 算法实现 使用matlab来实现...
### 可重构计算:理论与基于FPGA的实践 #### 引言 可重构计算(Reconfigurable Computing, RC)是一种结合了传统通用处理器的灵活性和专用硬件的高性能优势的技术。它通过在运行时动态地改变计算硬件的功能来实现...