一、理想的设计特征
- 最小的复杂度
**
-
易于维护
-
松散耦合
松散耦合意味着在设计时让程序的各个组成部分之间关联最小,合理抽象、封装及信息隐藏等原则。
-
可扩展性
-
可重用性
-
高扇入
让大量的类使用某个给定的类。意味着设计出的系统很好的利用了在较低层次上的工具类。
- 低扇出
让一个类少量或适中地使用其他的类。高扇出(超过7个)可能变得过于复杂,无论考虑某个子程序调用其他子 程序的量,还是考虑某个类使用其他类的量,低扇出的原则都是有益的。
-
可移植性
-
精简性
-
层次性
-
标准技术
要尽量使用标准化、常用的方法,让整个系统给人一种熟悉的感觉。
二、设计构造块:启发式方法
1.使用对象进行设计的步骤
- 便是对象及其属性(方法(method)和数据(data))
- 确定可以对各个对象进行的操作
- 确定各个对象能对其他对象进行的操作(包含和继承)
- 确定对象的哪些不分对其他对象可见——哪些部分可以公用的,哪些是私用的
- 定义每个对象的公开接口
2.抽象
抽象是一种能让你在关注某一概念的同事可以放心地忽略其中一些细节的能力。基类就是一种抽象,他使你能集中精力关注一组派生类所具有的共同特征,并在基类层次上忽略各个具体派生类的细节。
3.封装
封装是说,不只是让你能用简化的视图来看复杂的概念,同时还不能让你看到复杂概念的任何细节。你能看的到的就是你能——全部——得到的。
4.继承
当多个对象有相同的和不同的属性和方法时:抽象封装出相同的,然后继承基类,再写不同的。
继承的好处
- 在于它能很好地辅佐抽象的概念。抽象是从不同的细节层次来看对象的。
- 继承能简化编程的工作。
5.信息隐藏
信息隐藏是软件的首要技术使命中格外重要的一种启发式方法,因为它强调的就是隐藏复杂度。
秘密和隐私权
在设计一个类的时候,一项关键性的决策就是确定类的哪些特征应该对外可见,哪些特性隐藏起来,仅仅是内部使用。类的接口应该尽可能少的暴露内部工作机制。
6.保持松散耦合
耦合度表示类与类之间或者子程序与子程序之间的紧密程度。耦合度设计的目标是创建出小的、直接的、清晰的类或子程序,是它们与其他类或子程序之间关系尽可能的灵活,这就被称作“松散耦合”。
耦合标准
衡量模块之间的耦合度标准:
- 规模:这里的规模指的是模块之间的连接数。对于耦合度来说,小就是美,因为只要做很少的事情,就可以把其它模块与一个有着很小的接口模块连接起来。
- 可见性:两个模块之间的连接的显著程度。
- 灵活性
耦合的种类
7.查阅常用的设计模式
常见的设计模式:
| 模式 | 描述 |
|---|---|
| Abstract Factory(抽象工厂) | 通过指定对象组的种类而非单个对象的类型来支持创建一组相关的对象 |
| Adapter(适配器) | 把一个类的接口转变成另一个接口 |
| Bridge(桥接) | 把接口和实现分离开来,使它们可以独立地变化 |
| Composite(组合) | 创建一个包含其他同类对象的对象,使得客户代码可以与最上层对象交互而无需考虑所有的细节对象 |
| Decrorator(装饰器) | 给一个对象动态地添加职责,而无须为了每一种可能的职责配置情况去创建特定的子类(派生类) |
| Facade(外观) | 为没有提供一致接口的代码提供一个一致的接口 |
| Iterator(迭代器) | 提供一个服务对象来顺序地访问一组元素中的各个元素 |
| Observer(观察者) | 是一组相关对象相互同步,方法是让另一个对象负责:在这组对象中的任何一个发生改变时,由它把这种变化通知给这个组里的所有对象 |
| Singleton(单例) | 为有且仅有一个实例的类提供一种全局访问功能 |
| Strategy(策略) | 定义一组算法或者行为,使得它们可以动态地相互替换 |
| Template Method(模板方法) | 定义一个操作的算法结构,但是把部分实现的细节留个子类(派生类) |
设计模式的好处:
- 通过提供现成的抽象来减少复杂度
- 通过把常见解决方案的细节予以制度化来减少出错:找现成的模式解决方案
- 通过提供多种设计方案而带来启发性的价值
- 通过把设计对话提升到一个更高的层次上来建华交流
8.其他的启发方法
高内聚性
内聚性源于结构化设计,并且经常与耦合度结合在一起讨论。内聚性指的是类内部的子程序或者子程序内的所有代码在支持一个中心目标上的紧密程度。
构造分层结构
分层结构指的是一种分层的信息结构。就是分层,类似于MVC(个人理解)