代码的重构与设计

xiaoxiao2025-02-09  23

________________________________________ A、何为重构 对软件内部结构的一种调整,目的是在不改变[软件之可察行为]前提下,提高其可理解性,降低其修改成本。最主要的一点是:不改变[软件之可察行为]--就是不改变软件的功能。 B、代码de不合理设计 1、重复的代码--软件实现过程中,一个遵从一个理念,一个功能有且只实现一 duplicated code(重复代码)有三种情况:a、同个类中有俩个函数含有相同的表达式。--类中的俩个方法拥有相同部分的表达式。 解决方法:将相同部分的表达式提取出来作为一个方法,然后原来俩个方法调用提取出的方法。 b、继承于同一个类的俩个子类[兄弟类]拥有相同的表达式。 解决方法:将兄弟类中相同部分的表达式提取到父亲类方法中,使得俩个兄弟类共用这个方法。c、俩个毫不相关的类中出现相同的表达式。解决方法:新增一个class,将共用部分提取成新class的一个method。 重复代码例子:重构前 [img]http://dl.iteye.com/upload/attachment/177970/18229ba4-4c47-3da7-be09-e550d238d59a.jpg[/img] 重构后: [img]http://dl.iteye.com/upload/attachment/177968/202f94e5-af3c-3687-837d-52e187e90bc8.jpg[/img] 2、过长函数:程序越长越难理解,千万不要把自己的方法写得和面向过程一样,这样的方法除了你没有别的人可以看得懂。我见过一个函数长达2000行, 像这种方法没有人有兴趣去看里面实现了什么,甚至我们愿意把这些代码抛弃重新写个新的。问题:对于这种方法的测试用例不好写,并发生错误后寻找错误的时间较长。破坏程序的通用性和可读性。解决方法:把过长的方法提取成多个小的方法,每个方法都有明确的功能和含义。这样写的主要目的是让你的程序的可读性更高。 3、过大类:不要让一个类做太多的事情,其内部会出现太多的instance变量。问题:一个类过长其中很容易出现重复代码。解决方法:新建class,将大的class改成多个小的class。 4、过长参数列:将一个方法需要的参数一股脑的放进方法的参数列表中,使得你的方法参数列表过长。 问题:你的方法难以理解。 解决方法:把方法的参数封装成一个对象[参数对象]。 例子:修改前: [img]http://dl.iteye.com/upload/attachment/177980/c1f6563b-3275-3c01-9ded-6f1814ea21d1.jpg[/img] 修改后: [img]http://dl.iteye.com/upload/attachment/177978/c66cf73e-a819-3336-84af-9cc9f9bfce77.jpg[/img] 5、发散式变化:当系统需要修改时,我们就希望在系统中某一点进行修改 如果你的系统不能达到这个要求,说明你的类中出现了俩种方法之间关系紧密,可以通过提取method和class;来实现俩个方法的分离。 6、散弹式修改:与上个相仿,只是修改的地方出现在多个class中,这样你就可以通过移动method、field所在class来改变这个情况。 7、依恋情结:把你的方法放到正确的class中,很多时候我们在开发前期把method放在一个class中,随着开发的进行,发现另一个class和这个method过于密切,这时候,你就需要将method移动到新的class中。 8、数据泥团:在你的系统经常出现相同成群的数据项时,这些便是数据泥团了, 你应该把这个数据项封装成一个对象进行使用,记住你是在进行面向对象编程。 9、switch-case:不要使用过多的switch-case,switch-case本身就是重复。你可以使用策略模式和状态模式进行替换。(并不是所有的switch都是不好的) 10、平行继承体系:在你的继承体系中,如果你在为某个class添加一个subclass,而另一个class也为此要添加一个subclass。那样你的继承体系中就出现了平行体系啦。 11、多余类:当你使用了重构手法之后,你就有可能将一些类的大部分method、field 移除或者转移到其他类,这时候你可能会发现你的class所得不值其身价时,你就可以考虑将这个class移除。 12、未来性:企业是以盈利为目的的,你的软件开发不应该为了那些未来性的东西考虑太多, 因为你考虑的未来性的东西到最后项目终结也未必用得到,那样你的付出就不值得啦, 这些东西你必须剔除他。 13、混淆的暂时值域:临时变量,不要过多的使用临时变量,过多的临时变量使得你的程序很难了解,而且 对你的程序进行维护,你会为你过多的临时变量发疯。这里有一种临时变量是更让你发疯,就是一个临时变量被赋予不同含义的field,这样你的变量就更难懂啦。 14、中间转手人:对象的基本特征之一就是封装,对外部世界的隐藏风转往往伴随着委托。当你A class 要实现功能,A class就会调用B class的一些方法,而B class方法的实现是通过调用C class 的方法进行实现,而B class在其中并没有很大的功能只是充当一个委托的角色并且A class中一半以上的功能都要通过B class来实现,这时候你可以考虑移除B class 直接调用C class。 例子:action层调用middleMan和serivce层,我们发现middleman只是一个委托,在其类只是在service上一层代理而已,那么我们就可以将middleman直接去掉,让action层直接调用service层。 [img]http://dl.iteye.com/upload/attachment/177972/7f152efb-ffe6-39b3-8925-64002972c228.jpg[/img] [img]http://dl.iteye.com/upload/attachment/177974/83ade6c2-892f-36de-9134-d6cb295a659e.jpg[/img] [img]http://dl.iteye.com/upload/attachment/177976/3522dae7-608b-3f89-a5c5-3022561fc58d.jpg[/img] 15、异曲同工的类和方法:如果有俩个方法做同一件事,却有着不同的签名式,请rename method 、move method、delete method 去除多余的method。 16、不完善的程序库类:在系统开发通过中,你需要在一定的基础library上进行开发,而然这些library不可能能满足你的所有需要,你必须在这些library的基础上进行扩展。 17、拒绝的遗赠:subclasses应该集成superClass的函数和数据,当你新增一个subclass时,这个新加的subclass对superclass中的一些函数和数据不感兴趣,这是你就应该用push down method和push down field就是把方法和值域放入需要的subclasses中。 18、过多的注释:在系统开发过程中,你的程序的可读性和维护性不只是通过你的注释来表达你的意思,你应该规范自己的命名和field、method、class位置的安放,布局。如果你的注释过多就说你的程序中拥有太多的不合理之处需要进行重构。 总结:本书的所有内容来至:《改善既有代码的设计》。改变你的代码风格,带来不仅是代码的规范,还有你设计上的提升。第一次乱写的,请包涵。 相关资源:代码重构(C# & ASP.NET版),中文完整扫描版
转载请注明原文地址: https://www.6miu.com/read-5024380.html

最新回复(0)