概念
产生代码差的原因,有两方面,第一方面是外部原因,第二方面是内部原因。外部原因主要有:项目排期急,没有多少时间去设计;资源短缺,人手不够,只能怎么快怎么来;紧急问题修复,临时方案快速处理……。内部原因主要有:自我要求不高;无反馈通道;
而解决代码差的根因主要是方法有三个:领域建模、设计原则、设计模式
分析阶段:当拿到一个需求时,先不要着急想着怎么把这个功能实现,这种很容易陷入事务脚本的模式。
分析什么呢?需要分析需求的目的是什么、完成该功能需要哪些实体承担,这一步核心是找实体。
领域模型主要是和产品和运营梳理业务模型,进行流程化优化,进而判断需求是否合理可行。
提升代码质量还有一个捷径,那就是要遵循七大原则,七大原则好比毛泽东农村包围城市指导方针。首先确定统一中国目标,然后是在统治力量薄弱的农村建立革命根据地,等革命队伍变大,建立农村包围城市的矩阵,最后采取不同摧毁策略对国民政府不同城市政权进行各个击破。
而设计原则又分为七个部分,分别是开闭原则、里式替换原则、依赖倒置原则、接口隔离原则、最小知识原则、单一职责原则和合成复用原则。
开闭原则
第一个设计原则是开闭原则,开闭原则简称OCP,正如英文定义的那样the open–closed principle, Entities should be open for extension, but closed for modification , 对扩展开放,对修改关闭。
这样做的目的是保护已有代码的稳定性、复用性、灵活性、维护性和可扩展性,同时又让系统更具有弹性。
Android需求发生变化的时候,不提倡直接修改Android基类源代码,尽量扩展模块或者扩展原有的功能,去实现新需求变更。
里氏替换原则
子类可以替换父类,子类对象能够替换程序中父类对象出现的任何地方,并且保证原来程序的逻辑行为不变以及正确性不会被破坏。
相当于子类可以扩展父类功能。继承是里氏替换原则的重要表现方式。里氏替换原则用来指导继承关系中子类该如何设计的。
依赖倒置原则
抽象不依赖于细节,而细节依赖于抽象。高层模块不能直接依赖低层模块,而是通过接口或抽象的方式去实现。
从定义也就可以看出来,依赖倒置原则是为了降低类或模块的耦合性,提倡面向接口编程,能降低工程维护成本,降低由于类或实现发生变化带来的修改成本,提高代码稳定性。
单一职责原则
第四个设计原则是单一职责原则,单一职责原则简称SRP, 正如英文The Single Responsibility Principle定义的那样,A class should have one, and only one, reason to change。
单一职责指的是一个类只能因为一个理由被修改,一个类只做一件事。不要设计大而全的类,要设计粒度小、功能单一的类。
接口隔离原则
第五个原则是接口隔离原则,接口隔离原则指的是接口隔离原则是指客户端不应该依赖于它不需要的接口。接口隔离原则简称ISP,正如英文定义的那样interface-segregation principle,Clients should not be forced to depend upon interfaces that they do not use. 客户端不应该被强迫依赖它不需要的接口。其中的 “客户端”,可以理解为接口的调用者或者使用者。
接口隔离原则是尽量将臃肿庞大的接口颗粒度拆得更细。和单一原则类似,一个接口,涵盖的职责实现的功能尽量简单单一,只跟接口自身想实现的功能相关,不能把别人干的活也涵盖进来,让实现者只关心接口独立单元方法。
接口隔离原则和单一职责原则的区别?
接口隔离原则和单一职责原则的区别有两个,第一,单一职责原则指的是类、接口和方法的职责是单一的,强调的是职责,也就是说在一个接口里,只要职责是单一的,有10个方法也是可以的。
第二,接口隔离原则指的是在接口中的方法尽量越来越少,接口隔离原则的前提必须先符合单一职责,在单一职责的前提下,接口尽量是单一接口。
最小知识原则
第六个设计原则是最小知识原则,最小知识原则简称LOD,正如英文定义的那样Law of Demeter
,a module should not have knowledge of the inner details of the objects it manipulates 。不该有直接依赖关系的类,不要有依赖;
有依赖关系的类之间,尽量只依赖必要的接口。最小知识原则是希望减少类之间的耦合,让类越独立越好,每个类都应该少了解系统的其他部分,一旦发生变化,需要了解这一变化的类就会比较少。
最小知识原则和单一职责的目的都是实现高内聚低耦合,但是出发的角度不一样,单一职责是从自身提供的功能出发,最小知识原则是从关系出发。
合成复用原则
最后一个原则是合成复用原则。合成复用原则简称CARP,正如英文定义的那样Composite/Aggregate Reuse Principle, try to use composite/aggregate *, *合成复用原则要求我们在软件设计的过程中,尽量不要通过继承方式实现功能和类的一些组合。
因为在 Java 只支持单继承的, C 、 C ++支持多继承。所以设计模式在 Java 这一块的规范,它是不提倡继承来解决问题的,所以更提倡是合成复用,一个类持有另外一个对象,把能力交给另外的对象去完成。
因为继承破坏了会继承复用的和破坏类的一个封装性,子类和父类耦合度会比较大,因此推荐使用合成复用原则
最小知识原则,如果因为手抖,可能会不小心改了父类,最小知识原则限制复用灵活性,合成复用原则可以维持类的封装性,降低类与类的耦合度,提高功能的灵活性。
合成复用原则可以将已知的对象和成员变量纳入新的对象和成员变量,方法里边去调用成员变量的具体的功能。就达成了一个合成复用原则。
单一职责原则告诉我们实现类要职责单一;
里氏替换原则告诉我们不要破坏继承体系;
依赖倒置原则告诉我们要面向接口编程;
接口隔离原则告诉我们在设计接口的时候要精简单一;
最小知识原则告诉我们要降低耦合;
合成复用原则告诉我们不要通过继承方式实现功能和类组合;
而开闭原则是总纲,告诉我们要对扩展开放,对修改关闭