一个类只负责完成一个职责或者功能。不要设计大而全的类,要设计粒度小、功能单一的类。单一职责原则是为了实现代码高内聚、低耦合,提高代码的复用性、可读性、可维护性。
不同的应用场景、不同阶段的需求背景、不同的业务层面,对同一个类的职责是否单一,可能会有不同的判定结果。实际上,一些侧面的判断指标更具有指导意义和可执行性,比如,出现下面这些情况就有可能说明这类的设计不满足单一职责原则:
软件实体(模块,类,方法等),应该对扩展开发,对修改关闭。
第一点是,开闭原则并不是说完全杜绝修改,而是以最小的修改代码的代价来完成新功能的开发。
第二点是,同样的代码改动,在粗代码粒度下,可能被认定为“修改”;在细代码粒度下,可能又被认定为“扩展”
子类对象能够替换程序中父类对象出现的任何地方,并且保证原来程序的逻辑行为不变及正确性不被破坏
子类的设计要保证在替换父类的时候,不改变原有程序的逻辑以及不破坏原有程序的正确性。
子类在设计的时候,要遵守父类的行为约定(或者叫协议)。父类定义了函数的行为约定,那子类可以改变函数的内部实现逻辑,但不能改变函数原有的行为约定。这里的行为约定包括:函数声明要实现的功能;对输入、输出、异常的约定;甚至包括注释中所罗列的任何特殊说明。实际上,定义中父类和子类之间的关系,也可以替换成接口和实现类之间的关系。
控制: 指的是程序执行流程的控制,反转指的是在没有使用框架前,程序员自己控制整个程序的执行,使用框架后,整个程序的执行流程可以通过框架来控制,流程的控制权从程序员反转到框架
实现控制反转的方法有很多,除了刚才例子中所示的类似于模板设计模式的方法之外,还有依赖注入等方法,所以,控制反转并不是一种具体的实现技巧,而是一个比较笼统的设计思想,一般用来指导框架层面的设计。
不通过new()的方式在内部创建依赖类对象,而是将依赖的类对象在外部创建好之后,通过创建函数,函数参数等方式传递(或注入)给类使用
通过依赖注入的方式来将依赖的类对象传递进来,这样提高了代码的扩展性,可以灵活的替换依赖的类。
高层模块不要依赖低层模块,高层模块和低层模块应该通过抽象来互相依赖,除此之外,抽象不要依赖具体实现细节,具体实现细节依赖抽象。
原文:https://www.cnblogs.com/jinlin/p/12050777.html