1. 单一职责
一个类应当只负有单一的职责。
为什么?因为如果类负有了两个职责,那么其中一个职责变化很有可能会影响另一个职责的正常运行,并且会影响类的复用等一系列的问题。
反例:A 类功能含有链接数据库,查询员工。
方案:上面 A 类两个职责分别建立一个类:数据库操作类、员工操作类。
2. 开闭原则
即软件实体应尽量在不修改原有代码的情况下进行扩展。
反例:功能是显示各种类型的图表,如饼状图和柱状图等。
实现:有显示图表类 ChartDisplay ,饼图类 PieChart ,柱图类 BarChart 。
在 ChartDisplay 的 display 方法中,根据类型判断调用 PieChart 类的 display 还是 BarChart 的 display。
下次如果多了折线图类,那么就需要在 ChartDisplay 中添加代码判断是否是折线图类去调用折线图类的 Display,这样就破坏了开闭原则。
方案:方法不止一种,就 php 而言,可以使用静态绑定。其他的可以使用依赖注入模式。
3. 里氏替换原则
子类可以扩展父类的功能,但不能改变父类原有的功能。
子类可以实现父类的抽象方法,但不能覆盖父类的非抽象方法。
子类中可以增加自己特有的方法。
当子类的方法重载父类的方法时,方法的前置条件(即方法的形参)要比父类方法的输入参数更宽松。
当子类的方法实现父类的抽象方法时,方法的后置条件(即方法的返回值)要比父类更严格。
4. 依赖倒置
高层模块不应该依赖低层模块,二者都应该依赖其抽象;抽象不应该依赖细节;细节应该依赖抽象。
面向接口编程。
业务逻辑层相对于数据层是高层模块,尽量不要让业务逻辑层依赖数据层,
可以在数据层抽象出一个接口,让业务逻辑层依赖于这个抽象接口。
反例:子类依赖低层类 A,有一天需要修改成子类依赖低层类 B,这时候就要修改大量代码。
方案:低层类 A 抽象出一个接口。让子类去依赖这个接口。以后要依赖低层类 B,只要 B 实现这个接口即可满足。
5. 接口隔离
顾名思义,接口需要隔离,为什么需要隔离,因为我们要将臃肿的接口拆分成最小接口。
如果不是最小接口,就需要去实现他们不需要的接口。
6. 最少知道
类与类之间的关系越密切,耦合度越大,当一个类发生改变时,对另一个类的影响也越大。
网友评论