面向对象的五大原则

1.单一职责原则
单一职责原则(SRP:Single responsibility principle)又称单一功能原则,面向对象五个基本原则(SOLID)之一。它规定一个类应该只有一个发生变化的原因。该原则由罗伯特·C·马丁(Robert C. Martin)于《敏捷软件开发:原则、模式和实践》一书中给出的。马丁表示此原则是基于汤姆·狄马克(Tom DeMarco)和Meilir Page-Jones的著作中的内聚性原则发展出的。
所谓职责是指类变化的原因。如果一个类有多于一个的动机被改变,那么这个类就具有多于一个的职责。而单一职责原则就是指一个类或者模块应该有且只有一个改变的原因。
2.里氏替换原则
里氏替换原则,OCP作为OO的高层原则,主张使用“抽象(Abstraction)”和“多态(Polymorphism)”将设计中的静态结构改为动态结构,维持设计的封闭性。“抽象”是语言提供的功能。“多态”由继承语义实现。
说白了就是子类继承父类等等..
3.依赖倒置原则
依赖倒置原则(Dependence Inversion Principle)是程序要依赖于抽象接口,不要依赖于具体实现。简单的说就是要求对抽象进行编程,不要对实现进行编程,这样就降低了客户与实现模块间的耦合。
也就是说不在依赖于一个具体的接口等,而是依赖于多个抽象的接口,不是具体的。
4.接口隔离原则
客户端不应该依赖它不需要的接口。一个类对另一个类的依赖应该建立在最小的接口上。
使用多个专门的接口比使用单一的总接口要好。
一个类对另外一个类的依赖性应当是建立在最小的接口上的。
一个接口代表一个角色,不应当将不同的角色都交给一个接口。没有关系的接口合并在一起,形成一个臃肿的大接口,这是对角色和接口的污染。
“不应该强迫客户依赖于它们不用的方法。接口属于客户,不属于它所在的类层次结构。”这个说得很明白了,再通俗点说,不要强迫客户使用它们不用的方法,如果强迫用户使用它们不使用的方法,那么这些客户就会面临由于这些不使用的方法的改变所带来的改变。
5.迪米特法则
迪米特法则可以简单说成:talk only to your immediate friends。 对于OOD来说,又被解释为下面几种方式:一个软件实体应当尽可能少的与其他实体发生相互作用。每一个软件单位对其他的单位都只有最少的知识,而且局限于那些与本单位密切相关的软件单位。
迪米特法则的初衷在于降低类之间的耦合。由于每个类尽量减少对其他类的依赖,因此,很容易使得系统的功能模块功能独立,相互之间不存在(或很少有)依赖关系。
迪米特法则不希望类之间建立直接的联系。如果真的有需要建立联系,也希望能通过它的友元类来转达。因此,应用迪米特法则有可能造成的一个后果就是:系统中存在大量的中介类,这些类之所以存在完全是为了传递类之间的相互调用关系——这在一定程度上增加了系统的复杂度。
有兴趣可以研究一下设计模式的门面模式(Facade)和中介模式(Mediator),都是迪米特法则应用的例子。
值得一提的是,虽然Ian Holland对计算机科学的贡献也仅限于这一条法则,其他方面的建树不多,但是,这一法则却不仅仅局限于计算机领域,在其他领域也同样适用。比如,美国人就在航天系统的设计中采用这一法则。
最少知识原则知道的越少越好。
6.开闭原则
开闭原则的英文定义如下:
Software entities like classes,modules,functions should be open for extension but closed for modifications
一个软件实体如类、模块和函数,应该对扩展开放,对修改关闭。
开闭原则是什么:
定义中的软件实体包括:项目或软件产品按照一定的逻辑规则画法的模块、抽象和类、方法
开闭原则对扩展开放,对修改关闭,并不意味着不做任何的修改。不做任何的修改是不可能的,低层次的模块发生变化,不管是修改还是扩展,高层次的模块由于有耦合,必然会进行或多或少的修改,否则低层次模块就是一个孤立无意义的代码块。
变化可以理解包含:逻辑变化、子模块变化、课件视图变化
为什么采用开闭原则:
1.考虑对测试的影响,采用开闭原则,那么进行了扩展不会影响原有的逻辑,在测试的时候只测试新增的代码即可,不用回归之前的,否则要将整个系统代码进行回归测试,极大地增加了测试成本。
2.开闭原则可以提高复用性:只有所有的逻辑都是原子逻辑组合来的,粒度才会更小,那么被复用的可能性才会更大。被复用,提高了开发效率,减少了代码量,修改的话只修改抽象出来的原子逻辑即可,不需要每个使用的地方都进行修改
3.提高维护性:维护人员只需要扩展类即可,而不需要修改类,减少了对原有代码完全得理解,提高维护效率。
4.面向对象开发的要求
如何使用开闭原则:
1.抽象约束
1)通过接口和抽象类约束扩展,对扩展进行边界限定,不允许出现在接口或抽象类中不存在的public方法
2)参数类型、应用对象尽量使用接口或者抽象类,而不是实现类
3)抽象层尽量保持稳定,一旦确定尽量不要修改,可以使用接口或者抽象类继承的方式,来进行扩展
2.元数据(metadata)控制模块行为
什么是元数据,元数据就是描述环境和数据的数据,简单的说就是配置参数,配置参数可以从缓存、数据库、配置文件中读取。
3.指定开发章程
在项目整个过程中,每个人都必须遵守的,章程要优先于约束,比如规定spring bean都是用注解,而不是使用配置文件
4.封装变化
封装变化包含两层含义:1.将相同的变化封装到一个接口或者抽象类中。2.将不同的变化封装到不同的接口或者抽象类中。

你可能感兴趣的:(面向对象的五大原则)