《编程匠艺》读书笔记之十一
第十三章 崇尚设计——如何创作出优秀的软件设计
- 成熟程序员的判断标准就是他或她的代码的设计质量。
- 一种错误的想法: 设计是一个需要在开始编写代码之前完成的阶段,这个阶段的成果就是某种形式的设计规范。其实编程本身就是一种设计活动。
- 编程的过程将检验初始的设计决策,并完成剩余的设计工作。编程是一种设计活动,它是一项富含创造性和艺术性的工作,而不是机械呆板的代码生成过程。
- 在编写代码之前先进行思考,创建一种条理分明的设计,否则,你最终会得到一堆混乱的代码。
软件设计的层次包括: - 系统体系结构。它是对系统整体的性能和特性影响最大,而对具体的代码行影响最小,它是最重要的设计步骤。
- 模块/组件。模块层次的设计很容易会显得比较模糊,从某种程度来说,“模块”根本就不存在,根据设计方法的不同,模块可能具有不同的含义,它可能是一段实现了一定逻辑的代码,也可能是一种物理单元,它还可能是一个类的层次结构。
- 类和数据结构。我们应该首先在纸上进行微观的设计,然后再通过键盘来实现。
- 函数。
- 几乎在所有的情况下,缺乏良好的设计最终所造成的代价,都要比为了良好的设计所付出的成本多得多。
可靠的设计,会使代码: - 易于编写。
- 易于理解。
- 易于修正。
- 存在bug的可能性小。
- 修改的弹性更大。
对于一个良好的软件设计,应该致力于以下这些问题: - 反复。迭代开发。
- 谨慎。不要一次进行过多的设计。
- 现实。描述性的设计过程不会总是或者每一次都能成功,更实际一些的方式是充分利用所有的方法,并且承认结果依赖于程序员的能力。
- 信息充分。必须充分理解你正在解决得问题的所有要求和处理原则,并理解正确的方案应该有哪些重要的品质。良好的设计过程是创造良好的设计的必要条件,但不是充分条件。
一个良好的软件设计,有以下品质: - 简洁。这是设计良好的代码最重要的一个特征。尽量编写虽然少但是功能完备的简单代码。使代码简洁是一项复杂的工作。
- 优雅。意味着你的代码不是形式古怪的,也不回卖弄聪明,或者过于复杂;良好的设计与平衡和审美密切相关。
- 模块化。高内聚,低耦合;设计内聚性强并且耦合性最小的模块,分解的结果必须是对问题空间的有效划分。
- 良好的接口。每个模块都会定义一个接口它会将内部的实现隐藏在这扇公共的大门之后;它是获取模块内部功能的唯一路径,它的质量决定了模块的质量。我们可以通过以下原则来判断一个接口的好坏:1. 划分,一个接口构成了一个连接点,同事也构成了使用方和实现方之间的一条分割线,设计良好的代码会清晰的定义角色和责任;2. 抽象,它将实际的内容组织在一个更简单的表现形式背后,可以帮助我们应对复杂的情况;3. 简练,接口使用一种简单的方式来代表大型操作的能力;4. 可替代性,如果一个接口的两种实现满足相同的契约,你就可以使用其中的一种实现来代替另外一种。
- 可扩展性。设计良好的代码允许更多的功能在必要时可以被插入到适当的位置中,我们可以通过软件框架来实现:动态加载的插件、顶端有抽象接口的认真设计的类层次结构、有用的回调函数构造以及功能很有逻辑并且可塑性很强的代码结构。以可扩展性为目标进行设计,但是不要过于宽泛。
- 避免重复。重复是优雅和简单设计的大敌。
- 可移植性。良好的设计不一定就是可移植的,这要取决于代码的要求,防止平台依赖性的方法有很多,但是为了不必要的可移植性而使代码的质量降低,这样的设计是糟糕的设计。谨慎的选择依赖于操作系统或依赖于特定硬件的代码部分的结构。常用的方法是创建一个平台抽象层。
- 符合语言习惯。
- 良好的文档化。良好的设计应该加以文档化,不要让读者自己去推断代码的结构。
- 良好的软件设计是富有美感的,为了创建这种数字艺术,需要大量的技术、经验和实践。
我们使用的设计方法主要包括: - 结构化设计。这种设计主要与功能分解有关,即将系统的功能分解为一系列更小一些的操作,结构化设计以“分治”思想为主要基础。
- 面向对象的设计。其焦点集中在系统中的数据,这种方法将软件设计为一些相互作用的独立单元,这种单元称为“对象”。
我们在进行软件设计时采用的工具包括: - 表示法。UML是目前最流行且定义良好的表示法,它提供了一种标准的方式,来对软件开发过程中产生的几乎每一个结果进行建模和文档化。
- 设计模式。
- 流程图。
- 伪代码。根据目前编程语言的发展,似乎伪代码不太流行了。
- 在代码中进行设计。
- CASE工具。可以进行正向工程或者逆向工程。
- 对设计工具和设计方法采取一种注重实际的态度,只有在它们真的有用的情况下再使用它们,不要称为工具的奴隶。
- 优秀代码的设计必定精良,它具有一种美感,能让人对其感觉良好。从根本上讲,良好的设计来源于优秀的设计人员,平庸的程序员不会作出卓越的设计。
- 一个项目越大,它所需要的体系结构设计就越多,低级的代码设计也会成比例增加。
- 即使你知道如何使用锤子,也不要将所有的问题都想象成钉子。
- 大多数人都是在不断试验和犯错误的过程中学习如何进行良好的软件设计的。
- 优秀的程序员:1. 希望他们接触过的任何东西都保持良好的状态;2. 认为编程是一种创造性的过程,并在他们的工作中加入艺术元素;3. 在开始编写代码之前,首先考虑代码的结构;4. 面对凌乱的代码,会觉得在开始对它们做任何额外工作之前,需要先进行一些清理和调整;5. 坚持不断的学习其他软件的设计,积累成功和失败的经验。
- 糟糕的程序员:1. 将越来越多的代码填入一个混乱的框架中,直到他们觉得已经做够了,然后就开始抱怨结果;2. 在处理晦涩难懂的代码时,注意不到糟糕的设计,也感觉不到有什么不对;3. 喜欢草草行事,然后就跑开,让别人来收拾烂摊子;4. 不欣赏也不尊重他正在处理的代码的内部设计,并以冷淡的态度来践踏这些设计。
作者:李潘
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。