《软件设计精要与模式 第2版》 - 书摘精要

(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 框架带来的最直接好处就是,缩短了整个项目开发的周期;

你可能感兴趣的:(设计模式,.net,C#)