(P15)
面向对象思想包括三个核心要素,即“封装”(Encapsulation)、“继承”(Inheritance)与“多态”(Polymorphism),它将面向对象技术推到了思想的境界;
(P17)
“封装变化”需要与“抽象”相结合,遵循“面向接口编程”的思想,如此才能做到对扩展开放;
(P18)
“封装变化”是设计模式的核心思想;
(P21)
抽象的类型,可以因为实现的不同而体现为不同的类型,从而执行不同的功能;
“多态”有机地将“封装”、“继承”与“抽象”结合起来:
—— 利用“封装”的原理,定义了对象类型;
—— 通过“继承”保证不同类型之间的关系;
—— “抽象”则提供了对象多态的能力;
(P22)
“多态”保证了程序的灵活性,因为它将对象形态的决定权交给了调用者;
调用者可以根据系统需求,创建不同类型的实例,只要该实例被统一抽象为相同的父类型;
(P23)
“多态”决定了接口实现的可替代性,它使得扩展成为可能;
对象的“封装”、“继承”与“多态”保证了对象的高内聚与低耦合,有利于软件模块的可复用,保证了程序的可扩展,这正是面向对象思想体现在软件设计中的最大优势;
软件设计需要经验的积累,不过有时还得需要那么一点灵感;
面向对象设计的原则是对面向对象思想的提炼,它比面向对象思想的核心要素更具可操作性,但与设计模式相比,却又更加的抽象,是设计精神要义的抽象概括;
(P24)
对象的高内聚与细粒度有利于对象的重用;
(P28)
“对扩展开放”的关键是“抽象”,而对象的多态则保证了这种扩展的开放性。开放原则首先意味着我们可以自由地增加功能,而不会影响原有系统。这就要求我们能够通过继承完成功能的扩展。其次,开放原则还意味着实现是可替换的。只有利用抽象,才可以为定义提供不同的实现,然后根据不同的需求实例化不同的实现子类;
(P29)
“开放封闭原则”还可以统一起来理解。由于我们对扩展实现了开放,才能够保证对修改是封闭的。开放利用了对象的抽象,封闭则在一定程度上利用了封装。最佳的做法仍然是要做到分离对象的变与不变,将对象不变的部分封装起来,并遵循良好的设计原则以保障接口的稳定;至于对象中可能变的部分,则需要进行抽象,以建立松散的耦合关系;
(P31)
抽象属于高层,细节属于低层,低层依赖于高层,而不是高层依赖于低层;
“依赖倒置原则”与“面向接口编程”的思想不谋而合;
GOF 在《设计模式》一书中旗帜鲜明地提出了面向对象设计的首要原则,那就是“针对接口编程,而不是针对实现编程”;
(P34)
面向对象设计原则是面向对象思想的体现:
—— “单一职责原则”与“接口隔离原则”体现了“封装”的思想;
—— “开放封闭原则”体现了对象的“封装”与“多态”;
—— “Liskov 替换原则”是对对象“继承”的规范;
—— “依赖倒置原则”是“多态”与“抽象”思想的体现;
(P35)
设计模式是“封装变化”思想的最佳阐释;
“抽象”没有具体的实现,就代表了一种无限的可能性,使得扩展成为可能;
(P36)
“继承”的耦合度要强于“组合”(“合成”或“聚合”);
优先选择“对象”的“组合”,而不是“继承”,即“合成”/“聚合”复用与原则;
为了进一步降低“组合”关系的耦合度,还应该遵循“依赖倒置原则”,对要组合的类进行“抽象”;
(P47)
一个外部具体对象的引入,必然会给一个模块带来与外部模块之间的依赖;
(P49)
模块与模块间之所以产生依赖关系,正是因为有具体对象的存在;
使用硬编码方式创建一个对象,必然会带来对象之间的具体依赖;
(P53)
在 .NET 中,虽然可以利用<section></section>对配置文件进行分节,但终究不够直观;
(P54)
实现“依赖注入”的前提是“面向接口编程”,而辅助的技术则是利用“反射技术”;
(P66)
“重构技术”涵盖了软件工程、面向对象设计、设计模式、单元测试等技术;
(P67)
“测试驱动开发”强调快速实现功能,再以“重构”改善代码的结构;
(P73)
当一个对象承担了过多的责任时,就有必要考虑对其进行职责划分,除非该对象是一个用于协调对象关系的类;
“测试驱动开发”与“重构”密不可分。“测试驱动开发”是一种演进的设计方式,程序结构的设计根据测试用例的驱动,随时可能会修改,此时我们就需要学会利用“重构”的利器。在“重构”的时候,仍然不能放弃“测试驱动开发”,并利用“单元测试”工具保证程序的可靠性以及“重构”的正确性;
(P139)
“集合”是一个管理和组织数据对象的数据结构;
“集合对象”除了能够存储数据外,还必须提供访问其内部数据的行为方式,这是一种遍历机制;
“集合对象”拥有两个职责:一是存储内部数据;二是遍历内部数据;
(P145)
.NET 框架中的所有集合均实现了 IEnumerable 接口,如果是泛型集合,则在实现了 IEnumerable 接口的同时,还实现了 IEnumerable<T> 接口;
(P156)
“面向接口编程”是面向对象编程思想中最重要的一个原则;
根据“封装变化”的原理,对易于变化的部分进行抽象,定义为接口(注:并非语法意义上的接口,而是指公开给调用方的外部定义);
(P161)
“委托”可以看做是模式中的惯用法 —— “委托链”用在“观察者模式”中,可以简化对被观察者列表的操作;“委托链”还可以用于“命令模式”,甚至于“职责链模式”中;
(P203)
在面向对象设计中,复用对象的方法除了“继承”,还可以采用“组合”;
(P345)
分层架构可以达到如下目的:分散关注、松散耦合、逻辑复用和标准定义;
(P362)
在没有 ORM 框架的情况下,使用辅助类是一个比较好的策略,利用它来完成数据库基本操作的封装,可以减少很多与数据库操作有关的重复代码,这体现了对象复用的原则;
(P364)
没有“抽象”,就意味着程序是僵化难以扩展的;没有“封装”与“继承”,就意味着程序无法重用;
(P367)
应用 ORM 框架带来的最直接好处就是,缩短了整个项目开发的周期;