软件设计精要与模式-----读书笔记

发布时间 2024-01-06 20:55:04作者: 普信男孩阿洲

第一章
设计没有标准,如果一定要一个标准,那就是快捷,适用,优雅。 

通常的说,设计分为计划设计和演进设计。(茅草屋与园林)
演进设计,一不小心容易重构;计划设计,一不小心容易过度。
合理的设计是需要的,如果摒弃设计模式,无疑是放弃站在巨人肩膀眺望远方的机会,而选择吃力的踮起脚尖,最后失去的是更远处的美景。

软件开发中,唯一不变的是变化,变化是常态。
追求简单系统的有效性。

重要的不是你记住了多少种设计模式的名称,而在于付诸实践的运用。
文武之道,一张一弛,一个技术团队如果没有时间用于技术的积累和沉淀,迟早会分崩离析。
如果从纯技术的角度看,重构非但必然,而且重要。
重构--改善既有代码的设计一书总结了许多条款,条款确实很重要,然而更重要的是学会它,然后忘记它。
在面向对象的世界里,UML的地位弥足轻重,甚至被称为是软件设计的一场革命。
在软件设计阶段,UML的作用任然无可替代。
演进设计和敏捷开发降低了UML的重要性,但UML的价值却不可抹杀,尤其是他有助于设计思想的交流和理解。
测试驱动开发如屹立不倒的基石,基于一个前提,我们不能在一开始就获得正确的设计。

第二章
面向对象的精要,在于“一切皆为对象”的本质。
面向对象包括三个核心要素,Encapsulation,Inheritance,Polymorphism,只有真正理解了这三个要素才算得上掌握了面向对象的精髓。
量避免将具体类对象作为传递参数,而应传递其抽象对象,更好地是传递接口。
根据不同情况创建不同类型的方式,工厂模式是最拿手的。
封装变化是设计模式的核心思想。
第三章
面向对象---------->设计原则---------->设计模式。
1单一原则:“一个类,应该只专注做一件事和仅有一个原因引起变化”。
唯有单一才能高内聚唯一专注才能保证细粒度,从而提高了类的复用;减少了对象之间的依赖,保证了低耦,容易扩展。
一个庞大的对象承担了太多职责,当客户需要该对象的某一个职责,就不得不将所有的执着都包含进来。
单一并非极端,而是用极端的方式重点强调。
2开闭原则:
修改分两个层次:一是对抽象定义的修改,如对外公开的借口,我们要保证接口的稳定。
一般的设计原则之所以强调方法参数尽量避免基本类型,原因正在于此。
二是对具体实现的修改。慎之又慎,做到完全封闭几乎不可能。
开放的关键是抽象,多态保证了扩展的开放。
开闭可以统一起来理解,由于我们开放了扩展,才能保证对修改的封闭。
开放利用了抽象,封闭利用了封装。
3Liskovt替换原则:子类能够完全替换父类。
4依赖倒置原则:高层模块不应该依赖底层模块,二则都应该依赖抽象。
例如,业务逻辑层对象就不应该之间依赖数据访问层,而应该依赖数据访问层的抽象接口。
这一原则体现了软件设计对“间接”的追求。依赖倒置与“面向接口编程”不谋而合。
是面向对象设计的首要原则。
5接口隔离原则:“使用多个专门的借口比使用单一的总接口好”。细粒度保证稳定,正如单一职责那样。
我们可以通过接口的继承,实现对总接口的定义。例如.NET框架中IList的定义:
public interface IEnumerable{IEnumerator GetEnumerator();}
public interface ICollection:IEnumerable{void CopyTo(Array array,int index);}
public interface IList:ICollection,IEnumerable{int Add(object value);void Clear();bool Contains(object value);…}
从某种程度上讲,接口隔离可以看做是接口层的单一原则。
概括的说,五大原则仍然是面向对象的体现。单一与接口隔离体现封装,Liskov体现继承,开闭体现多态和封装,
依赖倒置体现多态与抽象。

封装的理解

(1)什么是封装?合理的隐藏和公开。隐藏保护了对象的隐私,公开让类不至于老死不相往来。

(2)为什么要封装?好处是什么?安全、灵活、易维护。

(3)封装的本质是什么?封装的本质就是封装变化。封装变化是设计模式的核心思想。

(4)封装的原则?合理的封装应该符合职责单一原则,职责单一责任少,对内达到高内聚,对外达到低耦合,以最大的灵活适应无尽而又可爱的变化,所谓以不变应万变。
(5)既然封装的是变化,怎么封装变化?根据可预见的变化和不可预计的变化,对应的有演进式设计和计划式设计。封装变化,首先要发现变化点,寻找变化点!找到了变化点之后,如何处理变化呢?得到变化点,就应该面向抽象或接口编程,设计模式则是重要方法。