京口新闻网

2016.8.12  星期五

程序员如何识别和处理代码中坏掉的部分

对于程序员来说,代码优化是一个无止境的工作内容,而今天我们就通过案例分析来了解一下,如何识别代码中的不好的部分,下面就一起来了解一下具体情况吧。程序员如何识别和处理代码中坏掉的部分1.重复代码简单的复制/粘贴,或者无意间添加了相同逻辑的代码都是有可能的导致重复代码出现的。那么为什么重复的代码是一种坏味道?明显的就是重复的代码容易造成修改时的遗漏,修改遗漏导致一个问题需要修改多次才能才能确定终修改完成。如果有一部分修改了,另外一部分没有修改且没有被发现,日后再遇到感觉类似,实则不同的代码会花费大量的时间确定业务上的需求,实现上应该如何处理。重复代码这类坏味道产生的成本很低,但是带来的影响却是很大。如何解决重复代码问题?SimpleDesign为我们提供了参考参考原则:“通过测试,揭示意图,消除重复,少元素”。如果重复代码发生在一个类中,且两段代码完全重复,可以借助ExtractMethod(提炼函数)这个重构手法来消除重复;提炼函数时IDE一般都会自动提示是否同时修改重复的代码,减少重构的工作量。如果重复代码发生在一个类中,且两段代码之后部分重复。那么可以将部分重复的代码通过ExtractMethod的手法,提炼到单独的方法中,并替换掉部分重复的代码。如果重复的代码在不同的类中,且这些类是兄弟类,可以使用PullUpMethod,将重复的代码提炼到父类,并让原本的类继承父类。如果重复的代码在不同的类中,且这些类之间关联性不大,那么可以ExtractClass,将重复的挪动到一个新的类中,原本出现重复的地方来调用这个新产生的类的方法。消除重复之后,检测代码表达的意图是否准确、完成,ExtractMethod时可以通过良好的方法名来解释提炼的函数的作用和意图。2长函数顾名思义,长度过长的函数。其中包括两种情况,横向过长,纵向过长。为什么长函数是一种坏味道?横向过长时,往往一眼无法快速了解该行代码要表达的意思和中间的过程。当出现Bug定位问题时也不容易一次性定位到问题所在。纵向过长时,往往会感觉某个函数内部逻辑复杂、晦涩难懂。修改代码中也会因为无法照顾到要修改的方法中的其他行代码,而顾此失彼,终导致难度难修改。经过多次修改后甚至原有的基本结构都会遭到破坏,导致后续修改难度逐渐增加。3过大的类顾名思义就是一个类做了太多的事情。SOLID原则告诉我们类的职责应该是单一的,而一个过大类很可能意味着承担了多个/多类职责。过大的类为什么是一种坏味道?由于过大的类承担了过多的职责,很容易导致重复代码且重复代码不容易被发现,而这往往是坏味道的开始。如果过大的类对外提供服务发生了变动,并不容易快速响应这样的变化,可以对比一下一个小而职责单一的类中进行修改方便还是在多很多职责。当过大的类因为某个地方发生变化,很可能导致不相关的调用方的代码也会发生变化,这是一种耦合性的表现。当过大的类被继承时很可能导致其他的坏味道,例如遗留的馈赠。因此,保持小而职责单一的类将会对系统的设计有很大的帮助。当然也可以参考SimpleDesign,避免过度设计的前提下保持简单的设计。如何解决过大的类的代码坏味道?观察这个过大的类的属性,看是否有关联的几个属性能够代表一定的业务意思,如果可以使用ExtractClass,将这几个属性挪动到一个新的类中,并将相关操作挪动到新的类中。循环往复,这样一个大的类能够拆分成多个小的且职责较为单一的类。观察这个大类中的方法,看是否存在兄弟关系的方法,如果有可以使用ExtractSubclass(提炼子类)的方法,将相关方法提炼到子类中,并考虑使用继承父类还是面向接口使用ExtractInterface(提炼接口)。这样相似行为的行为聚集在一个类中,拆分到多个类中,并可以进一步和方法的调用发来解耦。进一步观察剩余类的行为,如果这些行为在处理一类事情,那么可以停止了,在处理多类事情,可以按照处理逻辑的类型进一步拆分。简而言之,使用一个亘古不变的法则:分治法。将过大的类,拆分成多个职责单一的小类,手段是ExtractClass,ExtractSubclass,ExtractInterface。【免责声明】本文系本网编辑部分转载,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。如涉及作品内容、版权和其它问题,请在30日内与管理员联系,我们会予以更改或删除相关文章,以保证您的权益!更多内容请在707945861群中学习了解。