java的设计原则在程序员写代码应该去掌握原则性的东西,这样才能使得自己的代码不会腐臭,都说好代码是“简约而不简单”,甚至还有人说封装、继承、多态只是入门, 重点是 OOD(面向对象设计)和设计模式背后的思想,思想,思想,那就一定要看看这设计模式,没有银弹,先来看看Java的六大心法,之后再看23种武功招式:
Single responsibility principle : 单一职责原则
Open/closed principle :开闭原则
Liskov substitution principle :Liskov里氏替换原则
Dependency inversion principle : 依赖反转原则
Interface segregation principle :接口隔离原则
Law of demeter :迪米特法则
一、先看单一职责原则,指的是一个类只负责一项职责:
我想开发中是不是可以将mvc这个设计模式看成是一个大的单一职责原则,
将运用程序分为三层:模型、视图、控制器,它们各自处理自己的任务。
大家都用官方语言表述,但是我怎么就觉得它是简单,方便。
告诉咱不要为了图代码量少,二将不同职责放入到一个类里面。
官方优点如下:
1.可以降低类的复杂度,一个类只负责一项职责,其逻辑肯定要比负责多项职责简单的多;
2.提高类的可读性,提高系统的可维护性;
3.变更引起的风险降低,变更是必然的,如果单一职责原则遵守的好,当修改一个功能时,可以显著降低对其他功能的影响。
需要说明的一点是单一职责原则不只是面向对象编程思想所特有的,只要是模块化的程序设计,都需要遵循这一重要原则。
二、开闭原则:看见一个解释开闭原则很好的例子 ,get到的点就是继承者可以用继承父类实现父类的抽象方法,扩展自己的能力,但是又是只是知道自己的东西,此外一概不知。咱尽量通过扩展来面对需求的更改或者系统的变化,尽量不要对原有内容修改。还有重要的一点是拒绝不成熟的抽象和抽象本身一样重要。
三、里氏替换原则
看完案例的俺发现如果B类继承A类,C类继承B类并且重写了父类的 方法就会使得这个方法不能有父类逇功效而是重写实现的功效,解决方案:当使用继承时,遵循里氏替换原则。类B继承类A时,除添加新的方法完成新增功能外,尽量不要重写父类A的方法,也尽量不要重载父类A的方法。用里面的一句话来说就是:子类可以扩展父类的功能,但不能改变父类原有的功能。
摘抄概念:
定义1:如果对每一个类型为 T1的对象 o1,都有类型为 T2 的对象o2,
使得以 T1定义的所有程序 P 在所有的对象 o1 都代换成 o2 时,程序 P 的行为没有发生变化,
那么类型 T2 是类型 T1 的子类型。
定义2:所有引用基类的地方必须能透明地使用其子类的对象。
问题由来:有一功能P1,由类A完成。现需要将功能P1进行扩展,扩展后的功能为P,
其中P由原有功能P1与新功能P2组成。新功能P由类A的子类B来完成,则子类B在完成新功能P2的同时,
有可能会导致原有功能P1发生故障。
解决方案:当使用继承时,遵循里氏替换原则。
类B继承类A时,除添加新的方法完成新增功能P2外,尽量不要重写父类A的方法,
也尽量不要重载父类A的方法。
四、依赖倒置原则
1、高层模块不应该依赖低层模块,二者都应该依赖其抽象
2、抽象不应该依赖细节
3、细节应该依赖抽象
依赖倒置原则用我的理解来说就是使用接口的好处是能够防止“依赖”(基础层)出现问题的时候导致“依赖者”(高层)出现问题。实现细节可能是多种多样的,将其抽象成接口会更加的稳定。其中是要求我们在写基础类的时候要有接口或者抽象类,也可以两者都有;在写变量的时候声明的类型尽量是接口或者是抽象类;使用继承的时候要又要防止重写父类的方法导致不能用,应该新增方法而不是重写。
五、接口隔离原则
1、客户端不应该依赖它不需要的接口;
2、一个类对另一个类的依赖应该建立在最小的接口上。
但A类依赖R接口中的某些方法,B类也依赖R接口的某些方法,之后C类实现该R接口的时候即便不需要A接口用过的方法,也是需要进行实现,这样R接口就过于的臃肿,实现其接口的类也实现了很多无用的方法。避免上述,应该使用单一的接口,细化接口。
六、迪米特法则
又被命名知道最少原则,为一个对象应该对其他对象保持最少的了解。为减少不必要的依赖,不要把不属于自己的类当成局部变量出现在类的内部。
从依赖者来说,只应该暴露应该暴露的方法,而对于依赖者来说只依赖应该依赖的对象。从案例中的确发现有些不应该暴露的如果暴露出去会导致后面的选择混乱,没有一个统一的直观的方法.通过使用迪米特原则该使用private就使用private,谁应该使用public才使用public,这样子可以减少不必要的依赖,可以使得代码更直观的.
收集了一篇比较好理解的文章:https://www.jianshu.com/p/14589fb6978e
概念总是要先知道,并且在实践中慢慢领悟.