面向对象原则
1单一职责原则SRP (single ResponSibility Principle)
1.类的复杂性降低,实现什么职责都有明确的定义
2.可读性提高
3.可维护性提高
4.风险降低
2.里氏替换原则
定义
Liskov Substituition Principle(LSP),里氏代换原则,很严格的原则,规则是“子类必须能够替换基类,否则不应当设计为其子类。”也就是说,子类只能去扩展基类,而不是隐藏或覆盖基类
前置条件:契约设计
就是想你要拿我的东西,得满足我的条件经过我的同意
1. 如果子类不能够完整的实现父类的方法,或者父类的某些方法在子类中已经发生畸变,则建议断开父子继承关系,采用依赖,聚合、组合等关系代替
2. 有子类出现的地方,父类未必可以出现()
3. 子类继承父类,是可以与父类的方法重载的,但是参数值一定要比原来的参数范围大,但是仍然也是调用父类的方法(如果小的话,就会引起混乱)
4. 重写或者显示父类的方法时输出结果可以被缩小
好处:
1.代码共享,减少创建类的工作,每个子类都有父类的方法和属性
2.提高代码的重用性
3.代码的可扩展性
4.提高产品或者项目的开放性
坏处:
1继承是入侵的,只要是继承,就必须有父类的方法和属性
2.降低代码的灵活性
3.增强了耦合性
3.依赖倒置原则
定义
Dependence Inversion Principle(DIP),依赖倒换原则,“设计要依赖于抽象而不是具体化”。换句话说就是设计的时候我们要用抽象来思考,而不是一上来就开始划分我需 要哪些哪些类,因为这些是具体。这样做有什么好处呢?人的思维本身实际上就是很抽象的,我们分析问题的时候不是一下子就考虑到细节,而是很抽象的将整个问题都构思 出来,所以面向抽象设计是符合人的思维的。另外这个原则会很好的支持OCP,面向抽象的设计使我们能够不必太多依赖于实现,这样扩展就成为了可能.
1高层模块不应该依赖低层模块
2. 抽象不应该依赖细节
3.细节应该依赖抽象
在java语言中的表现
1. 模块之间的依赖通过抽象发生,实现类之间不发生直接依赖关系,其依懒关系是通过接口或抽象类产生的
2. 接口或抽象类不依赖实现类
3. 面向接口编程
好处:
1. 减少类的耦合性
2. 提供系统的稳定性
3. 降低并行开发带来的风险
4. 提高代码的可读性和可维护性
4.接口隔离原则
定义
Interface Segregation Principle(ISP),接口隔离原则,“将大的接口打散成多个小接口”,这样做的好处很明显。
两种接口:
1.实例接口(类)
2.类接口(用interface)
1.客户端不应该依赖他不需要的接口
2.类之间的依赖关系应该建立在最小接口上(接口要纯洁)
3.接口要高内聚(高内聚就是提高接口,类,模块的处理能力,减少对外的交互)
(不讲条件,立刻完成任务)
最佳实践
1. 一个接口只服务于一个子模块或者业务逻辑
2. 通过业务逻辑去压缩接口中的public方法,经常回顾接口,瘦接口
3. 已经被污染的接口尽量去修改,若修改风险大,则采用适配器模式进行转化处理
4. 了解环境,拒绝盲从(根据需求去设计)
5.迪米特法则(最少知识原则)
Law of Demeter or Least Knowlegde Principle(LoD or LKP),迪米特法则或最少知识原则,这个原则首次在Demeter系统中得到 正式运用,所以定义为迪米特法则。它讲 的是“一个对象应当尽可能少的去了解其他对象”。也就是又一个关于如何松耦合(Loosely-Coupled)的法则
1. 只和朋友交流(朋友:对象和对象之间有耦合关系就叫做朋友关系)
2. 和最近的朋友交流(要保持距离,朋友妻不可欺)
3. 自己的就是自己的(如果一个方法放在本类中,既不产生类间关系,也对本类不产生负面影响,那么就放置在本类中)
4. 谨慎使用Serrializable
6开闭原则
Open-Close Principle(OCP),开-闭原则,讲的是设计要对扩展有好的支持,而对修改要严格限制。这是最重要也是最为抽象的原则,基本上我们所说的Reusable Software既是基于此原则而开发的。其他的原则也是对它的实现提供了路径。
什么是软件实体:
1. 项目或者软件产品按照一定的逻辑划分的模块
2. 抽象和类
3. 方法