开发时一般对架构的设计都会要求满足一些原则,以便更好的扩展和维护。
下面就是架构设计时的7大原则。
1、开闭原则 (Open Close Principle OCP)
开闭原则要求对扩展开发,对修改关闭。在实际的开发中,产品一定不会是最先预想的样子,而在需要增加修改功能时,不需要更改原有的代码逻辑,降低耦合提高复用性。
在设计开发时,尽量不要在多处出现相同代码,尽可能将一个臃肿的逻辑分离为多个方法逻辑使用,降低粒度提高复用性。
2、里氏代换原则 (Liskov Substitution Principle LSP)
里氏代换原则中最重要的是,父类调用的地方替换为子类对功能和逻辑不受任何影响,而子类可以添加新的方法实现功能的扩展。
遇到一个问题:多态是否违背了该原则?
A1:如果针对继承而言,父类的方法就是为了给所有子类共享使用的,那么父类的方法就不应改变,子类通过新添加方法来扩展功能,由于子类继承父类方法,所以调用父类方法的地方替换为子类,逻辑不变,满足里氏替换原则,提高复用。
A2:如果针对多态而言,子类就是为了重新实现定义父类的方法,所以父类可以定义为抽象类,定义抽象方法,子类去重新定义这z些抽象方法,而抽象类不可以被实例化,所以不存在子类替换父类的情况,如果父类定义为普通基类,会出现不满足LSP的情况。
如果要满足LSP,尽量从抽象类和接口继承。
3、依赖倒转原则 (Dependence Inversion Principle DIP)
高层次的模块不应该依赖低层次模块,抽象不应该依赖细节,高层底层模块和细节都依赖于抽象,也就是面向接口编程。避免模块之间有很强的依赖关系,尽可能解耦,通过接口或抽象类实现。
4、接口隔离原则 (Interface Segregation Principle ISP)
客户端依赖什么接口就提供什么,将多余的去除,保证接口的细化。
类之间的依赖关系应该建立在最小的接口上,尽量使接口中的方法尽量少,不要违背单一职责原则。
5、单一职责原则 (Single Desponsibility Principle SRP)
保证接口类按照职责划分,保证只有一个改变的原因,降低修改成本。如果一个类有多于一个动机被改变,这个类就多于一个职责。
6、迪米特法则(Demeter Principle)
也叫最少知道原则,一个类尽可能少的与其他类之间存在依赖关系,保持低耦合度。
如果耦合度高,一个类发生改变时,另一个类影响也大。
对于被依赖的类,尽量将逻辑封装在类的内部,只提供public方法
7、合成/聚合复用原则
在一个新的对象里使用以后的对象,使之成为新对象的一部分。
聚合:表示整体与部分的关系,比如一个班级类,拥有学生类。班级的存在与否不影响学生,学生还可以被别处引用。
合成:部分与整体的生命周期相同,新的合成对象拥有组成部分的支配权,包括创建和销毁。
Q:合成聚合复用和继承复用的优缺点?什么时候使用?
A1:在代码设计上,尽量使用合成聚合复用,可以降低耦合性,可以在运行时动态进行。
A2:合成聚合复用
优点:1、黑箱复用,成员对象的内部实现细节新对象不可见。
2、支持包装,所需依赖较少。
缺点:需要管理的对象较多
继承复用
优点:在子类进行修改和扩展较为方便。
缺点:1、因为父类的方法和熟悉对子类完全暴露,所以不利于封装。
2、如果父类的实现发生改变,子类也需要改变。
3、父类继承的实现是静态的,不够灵活。