芗城网站建设公司,wordpress部份变英文,如何自己免费制作网站,网页设计代码html个人简介0 引言 单一职责原则#xff1a;类应该只有一个改变的理由#xff1b; 开放-封闭原则#xff1a;类应该对扩展开放#xff0c;对修改关闭#xff1b;
迪米特原则#xff1a;只和朋友交谈#xff1b;
里氏替换原则#xff1a;子类可以扩展父类的功能#xff0c;但不能…0 引言 单一职责原则类应该只有一个改变的理由 开放-封闭原则类应该对扩展开放对修改关闭
迪米特原则只和朋友交谈
里氏替换原则子类可以扩展父类的功能但不能改变父类原有的功能
接口隔离原则不能强迫用户去依赖那些他们不使用的接口
依赖倒转原则针对接口编程不针对实现编程
组合/聚合复用原则多用组合少用继承。
1 单一职责原则SRP
它的准确解释是就一个类而言应该仅有一个引起它变化的原因[ASD]。即永远不要让一个类存在多个改变的理由。
如果一个类具有一个以上的职责那么就会有多个不同的原因引起该类变化而这种变化将影响到该类不同职责的使用者不同用户
一方面如果一个职责使用了外部类库则使用另外一个职责的用户却也不得不包含这个未被使用的外部类库。 另一方面某个用户由于某个原因需要修改其中一个职责另外一个职责的用户也将受到影响他将不得不重新编译和配置。这违反了设计的开闭原则也不是我们所期望的。
如果你能想到一个类存在多个使其改变的原因那么这个类就存在多个职责。
2 开放-封闭原则OCP
开放-封闭原则是说软件实体类、模块、函数等等应该可以扩展但是不可修改。[ASD]
扩展开放某模块的功能是可扩展的则该模块是扩展开放的。软件系统的功能上的可扩展性要求模块是扩展开放的。 修改关闭某模块被其他模块调用如果该模块的源代码不允许修改则该模块修改关闭的。软件系统的功能上的稳定性持续性要求模块是修改关闭的。
原因稳定性。开闭原则要求扩展功能不修改原来的代码这可以让软件系统在变化中保持稳定。 扩展性。开闭原则要求对扩展开放通过扩展提供新的或改变原有的功能让软件系统具有灵活的可扩展性。遵循开闭原则的系统设计可以让软件系统可复用并且易于维护。
开闭原则的实现方法
为了满足开闭原则的对修改关闭原则以及扩展开放原则应该对软件系统中的不变的部分加以抽象在面向对象的设计中
可以把这些不变的部分加以抽象成不变的接口这些不变的接口可以应对未来的扩展接口的最小功能设计原则。根据这个原则原有的接口要么可以应对未来的扩展不足的部分可以通过定义新的接口来实现模块之间的调用通过抽象接口进行这样即使实现层发生变化也无需修改调用方的代码。
接口可以被复用但接口的实现却不一定能被复用。 接口是稳定的关闭的但接口的实现是可变的开放的。 可以通过对接口的不同实现以及类的继承行为等为系统增加新的或改变系统原来的功能实现软件系统的柔性扩展。
3 迪米特原则最少知道原则)LoP
迪米特法则LoD如果两个类不必彼此直接通信那么这两个类就不应当发生直接的相互作用。如果其中一个类需要调用另一个类的某一个方法的话可以通过第三者转发这个调用。[JDP]
迪米特法则的目的在于降低类之间的耦合。由于每个类尽量减少对其他类的依赖因此很容易使得系统的功能模块相互独立相互之间不存在依赖关系。
应用迪米特法则有可能造成的一个后果就是系统中存在的大量的中介类这些类只所以存在完全是为了传递类之间的相互调用关系—这在一定程度上增加系统的复杂度。
4 里氏替换原则(LSP)
所有引用基类的地方必须能透明地使用其派生类的对象。里氏替换原则是对开闭原则的扩展它表明我们在创建基类的新的子类时不应该改变基类的行为。
也就是说只有满足以下2个条件的OO设计才可被认为是满足了LSP原则
不应该在代码中出现if/else之类对派生类类型进行判断的条件。派生类应当可以替换基类并出现在基类能够出现的任何地方或者说如果我们把代码中使用基类的地方用它的派生类所代替代码还能正常工作。
里式替换原则的引申意义子类可以扩展父类的功能但不能改变父类原有的功能。
具体来说
子类可以实现父类的抽象方法但不能覆盖父类的非抽象方法。子类中可以增加自己特有的方法。当子类的方法重载父类的方法时方法的前置条件即方法的输入/入参要比父类方法的输入参数更宽松。当子类的方法实现父类的方法时重载/重写或实现抽象方法的后置条件即方法的输出/返回值要比父类更严格或相等。 5 接口隔离原则ISP 不能强迫用户去依赖那些他们不使用的接口。换句话说使用多个专门的接口比使用单一的总接口总要好。
它包含了2层意思
接口的设计原则接口的设计应该遵循最小接口原则不要把用户不使用的方法塞进同一个接口里。如果一个接口的方法没有被使用到则说明该接口过胖应该将其分割成几个功能专一的接口。接口的依赖继承原则如果一个接口a继承另一个接口b则接口a相当于继承了接口b的方法那么继承了接口b后的接口a也应该遵循上述原则不应该包含用户不使用的方法。 反之则说明接口a被b给污染了应该重新设计它们的关系。 如果用户被迫依赖他们不使用的接口当接口发生改变时他们也不得不跟着改变。换而言之一个用户依赖了未使用但被其他用户使用的接口当其他用户修改该接口时依赖该接口的所有用户都将受到影响。这显然违反了开闭原则也不是我们所期望的。
总而言之接口分隔原则指导我们
一个类对一个类的依赖应该建立在最小的接口上建立单一接口不要建立庞大臃肿的接口尽量细化接口接口中的方法尽量少 6 依赖倒转原则(DIP)
赖倒转原则原话解释是抽象不应该依赖细节细节应该依赖于抽象这话绕口说白了就是要针对接口编程不要对实现编程。
A. 高层模块不应该依赖于低层模块二者都应该依赖于抽象 B. 抽象不应该依赖于细节细节应该依赖于抽象
C.针对接口编程不要针对实现编程。
在高层模块与低层模块之间引入一个抽象接口层。 High Level Classes高层模块 -- Abstraction Layer抽象接口层 -- Low Level Classes低层模块
抽象接口是对低层模块的抽象低层模块继承或实现该抽象接口。
这样高层模块不直接依赖低层模块而是依赖抽象接口层。抽象接口也不依赖低层模块的实现细节而是低层模块依赖继承或实现抽象接口。
7 组合/聚合复用原则即组合优于继承
尽量使用组合/聚合不要使用类继承。
聚合表示整体与部分的关系表示“含有”整体由部分组合而成部分可以脱离整体作为一个独立的个体存在。组合则是一种更强的聚合部分组成整体而且不可分割部分不能脱离整体而单独存在。在合成关系中部分和整体的生命周期一样组合的新的对象完全支配其组成部分包括他们的创建和销毁。
只有当以下的条件全部被满足时才应当使用继承关系
1派生类是基类的一个特殊种类而不是基类的一个角色也就是区分Has-A和Is-A。只有Is-A关系才符合继承关系Has-A关系应当用聚合来描述。
2永远不会出现需要将派生类换成另外一个类的派生类的情况。如果不能肯定将来是否会变成另外一个派生类的话就不要使用继承。
3派生类具有扩展基类的责任而不是具有置换掉override或注销掉Nullify基类的责任。如果一个派生类需要大量的置换掉基类的行为那么这个类就不应该是这个基类的派生类。
4只有在分类学角度上有意义时才可以使用继承。 参考面向对象设计的七大设计原则详解_面向对象的八大设计原则-CSDN博客