- 先谈谈java语言的四大特性
- 封装:数据隐藏和数据访问保护,对外暴露有限的可供访问的调用
- 抽象:隐藏方法的具体实现,调用者只需关心提供了哪些方法和这些方法的定义,不需要关心这些方法如何实现的,Java中常用接口和抽象类来做抽象
- 继承:你的就是我的,顾名思义,某些对象和抽象定义具有相同的共性,可以通过继承,来实现属性和方法的复用(着重如何简单实现)
- 多态:对象和抽象可以有多个子类,此时父类应用可以指向多个子类对象(着重调用方如何调用的问题),增加功能的可扩展性和维护性
- 基于接口而非实现编程的好处
- 调用者不用关心功能怎么实现的,只关心接口约束
- 抽象和接口可以使人有预先整体设计能力,使代码更有结构型
- 接口抽象一般是稳定的,而实现是随时改变的,使人更能专注实现开发
- 能写出更有扩展性、维护性、灵活性的代码
- 接口更好的暴露设计功能,但又更好的隐藏实现设计细节
- 多用组合少用继承
- 乱用继承,可阅读性差,可维护性差
- 组合可以减少复杂性,相互组合实现相同的上层业务逻辑,可阅读性好
- 组合不是功能之间的简单嵌套调用,而是用面向对象和接口编程的思想做更简单的设计,从而提高阅读性和可维护性
- 提倡充血模式开发,而非贫血模式
- MVC中,业务层更多的像面向过程编程,业务方法放了所有的业务逻辑,这样如果代码量大的话,维护成本很大,这种就是常见的贫血模式
- 业务层采用面向对象思想层层抽离,并基于接口编程,这样的代码更灵活,更易读和维护
- SOLID原则
- 单一职责原则(SRP):类和接口对应单一功能
- 开闭原则(OCP):对扩展开放,对修改关闭
- 里氏替换原则(LSP):子类对象能够替换程序中父类对象出现的任何地方,并且保证原来程序的逻辑行为不变以及正确性不被破坏(和多态是有区别的)
- 接口隔离原则(ISP):调用者不应该被强迫依赖它不需要的接口(强制调用者实现,可以延伸到方法的隔离)
- 依赖反转原则(DIP):高层模块不要依赖低层模块,高层模块和低层模块应该通过抽象来互相依赖。抽象不要依赖具体实现细节,具体实现细节依赖抽象
- KISS原则
代码设计尽量简单,在满足业务的情况下,没必要追求底层或者负载的编码。当然如果业务需要考虑到性能等方面,使用底层复杂编码是满足kiss原则的
- YAGNI原则
不要做过度设计,在满足当前业务下,做适量设计就可以了,千万不要费时去考虑将来可能存在的虚无缥缈的情况
- DRY原则(代码重复方面原则)
需要编写满足语义功能不重复的代码
需要编写满足代码执行不重复的代码
尽量编写代码逻辑不重复的代码
逻辑重复,但语义功能不重复,不违反,相反就违反;代码执行重复也算违反
- 迪米特法则(LOD)
不该有直接依赖关系的类/模块之间,不要有依赖;有依赖关系的类/模块之间,尽量只依赖必要的接口/抽象/组件



