项目中正规的架构可能只是解决了系统级别的事项,大部分的设计工作会留到构建阶段去做。而有些大型项目中,设计可能会详细到能够让编码工作近乎机械化,但很少有如此完整的设计—程序员通常也要对部分程序进行设计,也许是正式的,也许不是。
然而设计过程是充满不确定性的,设计要具有探索性—“经验法则”或者“试试没准能行的办法”,而不是保证能产生预期结果的可重复的过程。设计过程总是伴随试验和犯错,没有任何设计或工具是用之四海而皆灵的。设计是在不断的评估、非正式讨论、写试验代码以及修复试验代码中演化和完善的!
设计的首要使命就是管理复杂度,所有的项目,设计的目标都是为了把复杂的问题分解成简单的部分。以简单性作为努力目标的设计方案对管理复杂度最有帮助。
高代价、低效率的设计源于三种根源:
- 用复杂的方法解决简单的问题
- 用简单但错误的方法解决复杂的问题
- 用不恰当的复杂方法解决复杂的问题
在软件开发过程中,任何其他技术目标都不如管理复杂度重要。众多的框架,其实也都是在为了把复杂的东西变得简单,让你能只需要关注特定的部分。
理想的设计特征:
- 最小复杂度
- 易于维护
- 松散耦合
- 可扩展性
- 可重用性
- 高扇入(让大量的类使用某个给定的类。这意味着设计出的系统很好的利用了在较低层次上的工具类)
- 低扇出(让一个类少量或适中的使用其他的类)
- 可以移植性
- 精简性
- 层次性
- 标准技术(尽量使用标准化的、常用的方法,让系统给人一种熟悉的感觉)
启发式设计:
找出现实世界中的对象
面向对象设计方法的设计步骤:
- 辨识对象及其属性(方法和数据)
- 确定可以对各个对象进行的操作
- 确定各个对象能对其他对象进行的操作
- 确定对象的那些部分对其他对象可见
- 定义每个对象的公开接口
这些步骤没有特定的顺序,它们也经常被反复执行。
形成一致的抽象
抽象是种能让你在关注某一概念的同时可以放心的忽略其中一些细节的能力—在不同层次处理不同的细节。我理解的抽象就好比分类一般,在每个层次寻找其共同点,比如说狗和猫,在不同的领悟有不同的分类,比如从生物领悟说,狗属于犬科,猫属于猫科,但不管犬科还是猫科,都属于哺乳动物,所以哺乳动物就是猫和狗的一种抽象。如果说在饲养方式上来说,猫和狗都属于宠物,所以宠物就是猫和狗的另一种抽象。在程序设计上,抽象可以体现在方方面面,接口,基类,对象都是抽象的体现。
封装实现细节
封装是说不只是让你能用简化的视图来看复杂的概念,同时还不能让你看到复杂概念的任何细节。你能看到的就是你能得到的全部。
当继承能简化设计时就继承
隐藏秘密㊙️
信息隐藏是结构化程序设计与面向对象设计的基础之一,结构化设计里面的“黑盒子”概念就是来源于信息隐藏。在面向对象设计中,它又引出了封装和模块化的概念,并与抽象的概念紧密相关。
找出容易改变的区域
- 找出看起来容易变化的项目
- 把容易变化的项目分离出来
- 把看起来容易变化的项目隔离开来
容易变化的区域
- 业务规则
- 对硬件的依赖性
- 输入和输出
- 非标准的语言特性
- 困难的设计区域和构建区域
- 状态变量
- 数据量的限制
保持松松散耦合
耦合度表示类与类之间或者子程序和子程序之间关系的紧密程度。耦合度的目标是创建出小的、直接的、清晰的类或子程序,使它们与其他类或子程序之间关系尽可能地灵活,这就称作“松耦合”。
查阅常用的设计模式
与完全定制的设计方案相比,设计模式提供了下列益处
- 设计模式通过提供现成的抽象来减少复杂度
- 设计模式通过把常见的解决方案的细节予以制度化来减少出错
- 设计模式通过提供多种设计方案而带来启发性的价值
- 设计模式通过设计对话提升到一个更好的层次上来简化交流
好的设计都是迭代的,你尝试设计的可能性越多,你的最终设计的方案就会变得越好。如果固执于某种单一方法会损害创新能力,从而损害你的程序。