一、为什么要重构? 一个新开发的项目,如果开发人员水平不太差,代码不会太难看懂。首先,要明确一点,并不是代码写得越难懂你越牛逼。同样复杂度的功能,越简单易懂的代码越好。当然,有经验的程序员,会选用最合适的数据结构和算法;最合适的设计模式和架构。但是随着年月的增长,功能不断迭代,甚至开发人员换了一茬又一茬,代码慢慢出现腐朽的味道。这时候我们应该明确另一个观点,持续重构,避免重写,重新设计和重写不能成为重构的代言词。重写的风险是很大的,除非时间足够,并且你对此项目了如指掌。
当代码越来越腐朽的时候,就像一座摇摇欲坠的大厦,你还继续加东西,无异于给骆驼添加稻草。这时候你会发现,想加一点代码,要动几个地方;删改代码牵一发而动全身;项目规模继续膨胀,冗余代码随处可见。这时候,就意味着重构的时机到了。重构就是对软件内部结构的一种调整,目的是在不改变软件可观察行为的前提下,提高其可理解性,降低其修改成本。
二、如何重构?
重构的方法有很多,这里重点说几种,快速修复项目的严重设计缺陷:
1、数据与UI分离。很多代码,ui界面和数据类解析、算法等混在一起,很难读懂,并且后期拓展性很差,换一种数据来源或者换一种UI显示方式,要理解和修改的地方很多,而且容易改错。重构方法:1)如果数据解析种类比较多,可以考虑用策略模式。2)如果解析比较简单,可以单独写一个数据解析类。3)更通用的方法,类中比较独立的方法改为static方法,使用工具类维护。
2、多态取代条件。如果使用条件,那么功能增加后,类的代码会越来越多。如何简单快速地改为多态?举个例子,如果一个类中包含语文、数学、英语三个科目:原来的类名为Study,代码有五千行。我们把Study变为抽象父类,把和具体科目关联的代码抽取到三个子类中,变为四个类:Study -> Study 、 StudyCn、StudyEn、StudyMath。然后我们把原来的方法改为抽象方法:
1)一个方法只有if else 可以直接变为抽象方法,子类基础它。
2)如果还有公共代码,需要写一个新的抽象方法。
最后,我们的代码Study两千行,StudyCn、StudyEn、StudyMath各1000行。虽然看起来代码数量没变化,但是逻辑清晰了很多,我如果再增加物理、化学、生物......我只需要新增一个类。我如果想改语文的代码,我只需要阅读1000行代码而不是五千行。这种个人、团队的开发效率的提升可想而知。
3、其他原则:1)观察属性、方法或类,如果可以抽象为一类事物,归纳提炼它们。2)用封装控制可见度,接口越少越好。3)消除依赖,使代码高内聚低耦合。4)使用常量代替魔数。常量尽量提炼到一个类下,甚至一个包下。以免要改常量到处找。5)不确定时,偏向使用组合而不是继承。