面向对象
1、面向对象基础
面向对象的目的是实现高内聚,松耦合的软件以应对变化。
传统oop三大原则:封装,继承,多态。
面向对象的精髓在于封装,封装对象的一切实现机制,只表现出对象的意图,实际上对象是有责任的实体,封装是隐藏一切,包括数据,设计细节,实现细节,派生类,实例化规则等。
1.1、分解对象
按责任分解对象,而不是按照传统(名词和动词)分解。
将问题领域分解为责任,责任即是对象意图,其实也是变化,发现变化并且封装它。不让一个类封装两个变化的事物,除非2个变化明确耦合在一起。
如何发现责任(变化)的地方?比如if/switch语句往往意味着变化,但比较通用的方法是CVA(共性和可变性分析),CVA分析矩阵,用行发现规则,用列发现特定情况,从而在分析中确定模式,获得高层设计。

发现变化的地方,就它封装为一个对象,让它对自己的行为负责;
松耦合是一种投资,处于对未来变动频度和幅度的预期,决定了我们需要划分类和对象的粒度,以及为此付出的代价;越是变动频繁和快速的系统,越需要更细的划分。
按责任(变化)进行松耦合设计,通常导致接口的激增。
1.2、设计对象
软件开发视觉,逻辑视觉:软件要负责做什么?规约视觉:怎么使用软件?(接口如何?) 实现视觉:如何履行自己的自责。

通常按照如下步骤构造软件,
a、先做一个初步设计,从概念视觉出发,定义共性,规划对象(抽象对象或接口)的意图,不关心具体细节
b、考虑对象如何协调工作,从规约视觉出发,考虑用什么接口来处理所有的责任,定义对象间的接口
c、实现这个设计,从实现视觉出发,考虑对于给定的变化,应该怎样根据给定的接口规约来实现具体的对象(派生类或实现)
按责任变化设计有如下原则:
1、针对接口编程,而不是针对实现进行编程,不过早关注细节
2、优先使用对象组合(聚集),而不是类继承,避免不必要的继承结构
3、考虑设计中什么是可以变化的,并对变化的概念进行封装(封装到一个单独的类,并将其包含在另一个类中),发现变化并将其封装。
1.3、设计原则
1. 单一职责原则(Single Responsibility Principle) 每一个类应该专注于做一件事情。
2. 里氏替换原则(Liskov Substitution Principle) 超类存在的地方,子类是可以替换的。
3. 依赖倒置原则(Dependence Inversion Principle)实现尽量依赖抽象,不依赖具体实现。
4. 接口隔离原则(Interface Segregation Principle)应当为客户端提供尽可能小的单独的接口,而不是提供大的总的接口。
5. 迪米特法则(Law Of Demeter)又叫最少知识原则,一个软件实体应当尽可能少的与其他实体发生相互作用。
6. 开闭原则(Open Close Principle)面向扩展开放,面向修改关闭。、7. 组合/聚合复用原则(Composite/Aggregate Reuse Principle CARP)尽量使用合成/聚合达到复用,尽量少用继承。原则: 一个类中有另一个类的对象。
1.4、包设计原则
不能在设计类之前试图设计包的依赖关系结构,它的依赖关系和应用程序的功能没有关系,而是应用程序的可构建性的映射图
包的内聚性原则包括:重用发布等价原则(REP)、共同重用原则(CRP)、共同重用原则(CCP)
包的耦合性原则包括:无环依赖原则(ADP)、稳定依赖原则(SDP)、稳定抽象原则(SAP)
1.4.1、重用发布等价原则(REP)
重用的粒度就是发布的粒度,相当于对象的接口隔离原则(ISP)
1.4.2、