一、理想的设计特征:
1、最小的复杂度。要避免做出“聪明的设计”,因为“聪明的设计”常常都是难以理解的,应该做出简单且易于理解的设计
2、易于维护。请时刻想着这些维护程序员可能会就你写的代码而提出的问题。
3、松散耦合。通过应该类接口中的合理抽象,封装性及信息隐藏等原则,设计出互关联尽可能最小的类。
4、可扩展性。你可以改动系统的某一部分而不会影响到其他部分。
5、可重用性。意味着所设计的系统的组成部分能在其他系统中重复使用。
6、高扇入。高扇入就是说让大量的类使用某个给定的类,即设计工具类。
7、低扇出。低扇出就是说让一个类里少量或适中地使用其他类。
8、可移植性。
9、精简性。意味着设计出的系统没有多余部分。
10、层次性。意味着尽量保持系统各个分解层的层次性,使你能够在任意的层面上观察系统,并得到某种具有一致性的看法。
11、标准技术。要尽量用标准化的,常用的方法,让整个系统给人一种熟悉的感觉,不然会让人看的一塌糊涂。
二、设计的层次
第一层:软件系统
第二层:将系统分解为子系统或包,这一层次设计的主要成果是识别出所有的主要子系统,如数据库、用户界面、业务规则、报表引擎等。并清楚定义各子系统如何使用其他子系统。应尽量减少子系统间的通信。
第三层:分解为类。这一层应识别出系统中所有的类,以及确定好接口。
第四层:分解成子程序。这一层把每个类细分为子程序。
第五层:子程序的设计。这一层为每个子程序布置详细的功能。
三、找出现实世界中的对象
在确定设计方案时,首选且最流行的一种做法便是辨识现实世界中的对象以及人造的对象。
使用对象进行设计的步骤是:
1、辨识对象方法和数据
2、确定可以对各个对象进行的操作。
3、确定各个对象能对其他对象进行的操作。
4、确定对象的哪些部分公用,哪些私用。
5、定义每个对象的公开接口。
四、形成一致的抽象
基类和接口是一种抽象,它使你能集中精力关注一组派生类所具有的共同特征,并在基类的层次上忽略各个具体派生类的细节。就如我们看到的房子,而不必关心它的砖瓦,房子便是一种抽象。
五、使用封装实现细节
六、信息隐藏
信息隐藏主要分为两大类:
1、隐藏复杂度。这样就不用再去应对它,如算法的实现。
2、隐藏变化源。这样当变化发生时,其影响就能限制在局部范围内,如类成员变量的修改,比如要修改Student类的name,修改setName()方法里的代码就比到修改student.name=xxx好。以及一些常量值,PI = 3.1415就比到处使用3.1415修改的方便。
七、找出容易发生改变的区域
好的程序设计所面临的最重要挑战之一就是适应变化。下面是几种应对措施:
1、找出看起来容易变化的项目。发的需求应该包含一份潜在变化的清单。
2、把容易变化的项目分离出来。把第一步中找出的容易变化的组件单独划分成类,或者和其他容易同时发生变化的组件划到同一类中。
3、把看起来容易变化的项目分离出来。设法设计好类之间的接口,使其对潜在的变化不敏感。设计好类接口,把变化限制在类中内部,且不会影响外部。
以下是一些容易发生变化的区域举例:
1、业务规则。
2、硬件依赖性。
3、输入输出。
4、非标准的语言特性。
5、困难的设计区域和构建区域。
6、状态变量。
7、数据量的限制
八、预料不同程序的变化
找出容易发生变化的区域的一个好办法是:首先找出程序中可能对用户有用的最小子集。这一子集构成了系统的核心,不容易发生改变,接下来,用微小的步伐扩充这个系统。这里的增量可以非常微小,小到看似微不足道。当你考虑功能上的改变时,同时也要考虑质的变化。通过首先定义清楚核心,你可以清楚哪些组件属于附加功能,这时就可以把它们提出出来,并把它们的可能改变隐藏起来。
九、保持松散耦合
松散耦合设计的目标是创建出小的、直接的、清晰的类或子程序,使它们与其它类或子程序之间的关系尽可能地灵活。请尽量使你创建的模块不依赖或者很少依赖其他模块。让模块之间的关系像商业合作者一样彼此分离,而不是像连体婴儿那样紧密相连。
衡量模块之间耦合度时可采用的标准:
1、规模:指的是模块之间的连接数。
2、可见性:指两个模块之间的连接的显著程度。如通过参数传递数据是一种明显连接,通过全局变量使另一模块使用数据则是鬼鬼崇崇的做法。
3、灵活性:指模块之间的连接是否容易改动。
十、查阅常用的设计模式
设计模式精炼了众多现成的解决方案,可用于解决很多软件开发中最常见的问题。
常用的设计模式有:适配器(Adapter)、桥接(Bridge)、装饰器(Decorator)、外观(Facade)、工厂方法(Fatory Mehtod)、观察者(Observer)、单例(Sigleton)、策略(Strategy)以及模板(Template)等。
十一、设计实践
当你首次尝试得出了一个看上去足够好的设计方案后,请不要停下来!第二个尝试几乎肯定会好于第一个。而你也会从每次尝试中都有所收藏,这有助于改善整体设计。
十二、分而治之
把程序分解为不同的关注区域,然后分别处理每一个区域
十三、自上而下和自下而上的设计方法
自上而下的设计从某个很高的抽象层次开始,你写出出基类或其他不那么特殊的设计元素。在开发这一设计的过程中,你逐渐增加细节的层次,找出派生类,合作类以及其他更细节的设计元素。自下而上则相反,从具体的系统功能逐渐抽象出基类。
十四、建立试验性原型
建立原型指的是“写出用于回答特定设计问题的、量最小且能够随时扔掉的代码”。千万不要将它当成项目的一部分,因此为了能够避免将它添加进项目中,建议使用其他语言来描述。
十五、合作设计
向别人请教,开会向别人过一遍你的想法,安排一次检查等。
记录你取得的设计成果。