架构师训练营 - 第二周学习总结
本周主要讲的是框架设计的设计原则和设计模式。
软件设计的“臭味”
僵化性
脆弱性
牢固性
粘滞性
不必要的复杂性
不必要的重复性
软件设计的最终目的
易扩展
健壮性
可移植
易维护
对象
具有状态、行为和标识。
状态:表明每个对象都可以由自己的数据。
行为:表明每个对象可以产生行为。
标志:表明每个对象都区别于其它的对象。(唯一地址)
面向对象编程的描述
万物皆为对象。
程序是对象的集合,通过发送消息来告知彼此要做的事情。
每个对象都有自己的由其它对象所构成的存储。
每个对象都拥有其类型。
某一个特定类型的所有对象都可以接受同样的消息。
面向对象编程三要素(特征)
封装性:隐藏实现接口;定义接口。
继承性:is-a 关系;has-a 关系。
多态性:后期绑定;向上转形(up casting)
充血模型:
充血模型是指大多业务逻辑和持久化放在领域对象里面,service 层只是简单封装部分业务逻辑以及控制事务、权限等。
优点:是面向对象,业务逻辑符合单一职责。
缺点:划分业务逻辑会很含糊,不好管理与拆分模块。
贫血模型:
贫血模型是指领域对象里只有 get 和 set 方法(POJO),所有的业务逻辑都不包含在内而是放在 service 层。
优点:系统的层次结构清楚,各层之间单向依赖。
缺点:没有真正面向对象编程。
面向对象设计的目的
强内聚,低耦合,使系统易扩展、更健壮、可移植、更简单。
面向对象设计的六大原则
开闭原则(OCP-Open/Closed Principle)
依赖倒置原则(DIP-Dependency Inversion Principle)
Liskov 替换原则(LSP-Liskov Substitution Principle)
单一职责原则(SRP-Single Responsibility Principle)
接口分离原则(ISP-Interface Segregation Principle)
合成复用原则(Composite Reuse Principle)
开闭原则-OCP
对修改是封闭的,对扩展是开放的。
实践原则的关键:抽象!
好处:增强了系统健壮性。
依赖倒置原则-DIP
高层模块不能依赖底层模块,而是大家都依赖于抽象。 抽象不能依赖于实现,而是实现依赖于抽象。
即先定义接口,再进行实现;高层模块不直接 new 底层模块,而是通过构造器注入、注解注入等方式将底层模块引入调用,并且要求高层模块定义注入的底层模块是其接口,在外部注入时,才将实际需要用到的实现类注入。
实现原则的关键:接口,依赖被动注入!
好处:增强了系统的可扩展性、可维护性与可测试性。
Liskov 替换原则-LSP
子类型必须能够替换掉它们的基类型。例,父类为会飞的鸟,分别有麻雀、鸵鸟继承了这个父类, 那么对于鸵鸟来说,这个父类就是不适合的。
实现原则的关键:对于子类来说,父类的方法没有不适合的。
重构方向:抽取共性到基类;改成组合。
好处:符合 OCP,增强系统的可扩展性、健壮性。
单一职责原则-SRP
又称为“内聚性原则”,即一个类,只执行一个职责,只能有一个引起它的变化的原因。
实现原则的关键:在做模型设计时,确定明确对象以及相关职责。
好处:增强系统的可移植性、健壮性。
接口分离原则-ISP
不应该强迫客户程序依赖它们不需要的方法。
实现原则的关键:针对不同客户,切割出不同的接口类;针对不同的用户,对接口类实现并封装以适配不同的客户。
好处:系统接口发生变动时,不会影响所有客户。
合成复用原则-CRP
优先使用组合/聚合的方式,而不是使用继承。
基本能理解,希望自己能吸收并引用到实际项目中去。
评论