了解面向对象的机制(抽象、封装、继承和多态)并不意味着能设计好的面向对象软件。设计是源代码,一切除软件构造(使用编译器编译、链接及部署)外的工作例如发现职责、标识对象、设计对象协作关系、编码、测试等都属于设计过程。和所有人类有目的的行为一样,设计是一种艺术、是一种工程、是一种带有臆测性的行为,也是一种实验性的活动。将训练、努力工作、激发灵感和所有合理的技术综合运用。对于一个给定的问题,有很多有道理的解决方案,但只有几个好的方案。

什么是设计?传统过程(例如软件工程)认为设计应该是一个庞大的阶段并生产出太多难以阅读和理解的设计文档(文档并不能和代码对应,文档不具有性)。难道设计是一堆包含各种符号、UML图的文档吗?对此,Jack Reecves《什么是软件设计》是一篇里程碑式的文章,他认为用来描绘源代码的图示只是设计的附属物而不是设计本身。换言之,UML图也许描绘了设计的一些部分,但是它不是设计。

源代码是设计重要的表示。文档并非一无是处。除非必要不要花大量时间编制文档。设计是一个过程,而不是一个事件。为达到良好设计的调试也应属于设计。

敏捷设计强调设计应当保持尽可能简单、适当。它是一个持续的应用(设计) 原则、模式以及实践来改进软件的结构和可读性的过程。它致力于保持系统设计在任何时间都尽可能简单、干净以及 富有表现力。

拙劣设计的表现:

1.僵化性 (Rigidity):设计难以改变

2.脆弱性(Fragility):设计易于遭到破坏

3.牢固性(Immobility ):设计难以重用

4.粘滞性(Vuscosity):难以做正确的事情

5.不必要的复杂性(Needless Complexity):过分设计

6.不必要的重复(Needless Repetition):滥用鼠标(进行拷贝、粘贴)

7.晦涩性(Opacity):混乱的表达

上述的原则主要是指以下几个OOP设计原则:

1.单一职责原则(SRP,Single Resposibility Principle)

2.开放-封闭原则(OCP,Open-Close Principle)

3.Liskov替换原则(LSP,Liskov Principle)

4.依赖倒置原则(DIP,Dependicy Independent Priciple)

5.接口隔离原则(ISP,Interface Seperation Principle)
对以上原则的违背将直接导致拙劣设计。例如违反SRP会直接导致脆弱性(Fragility)等等。李建忠在《C#设计模式纵横谈》的第一部分指出,OOP设计的精髓是封装变化隔离变化。遵循OOP设计原则、采用已被证实的设计模式与实践是设计好的软件的根本。