在软件开发过程中,设计阶段往往被看作是编码之前的一个必要步骤,但很多人质疑在编码阶段严格实施设计是否值得。这种讨论引发了思考。来自土木工程背景,在那个领域,无论是估算、合同条款还是执行,如果没有详尽的设计,一切都无法正确完成。没有设计,无法建造新的、复杂的机器、桥梁或铁路系统。设计是将需求具体化的地方。真正的弱点在于没有清晰的设计,而缺陷通常在编码时显现出来。
设计应该对开发者来说是清晰的,他们需要根据设计来编写代码。仅仅绘制一些UML图来泛泛地解释如何处理问题是不够的。“一图胜千言”,但必须有人清楚地理解它,并将其转化为脚本中的“千言”。因此,决定专注于如何改进软件开发的设计阶段,而不是将其视为一种必要的恶。
确实,在许多项目中,到了编码阶段,设计与实际往往有很大的差距。这主要是因为只关注提供高层次的设计,而没有关注开发者需要什么来实现预期的输出。为了解决这个问题,需要在设计中加入更多的细节,而不是更少。精细的细节(问问建筑建筑师这意味着什么)应该被完成。
为了实现一个完善的设计,真正的需求是找到一种方法来测试设计,并证明它实现了应用程序需求和编码需求。毕竟,测试代码,为什么不测试设计呢?也许低层次的设计可以与测试用例进行比较。
为了确保更完整的设计,可以尝试以下一些方法,以适当的顺序进行:
伪代码的编写:通过这样做,设计者实际上是在尝试实现设计。在这个过程中,可以从编码的角度意识到设计的不足。即使是编程细节,如类字段、属性、常量、枚举器、助手/私有函数来执行特定任务,也可以在编写伪代码时被识别出来。实际上,在编码阶段,开发者大部分时间会编写特定语言的代码来实现伪代码。这意味着现在有一个两阶段的设计过程。首先,进行高层次的设计来实现总体架构。所以设计模式、识别领域实体、领域实体之间的关系以及所有正常的设计工作首先完成。然后,有经验的开发者会进一步设计,尝试为它实现伪代码。这可以被认为是一种单元测试。
创建可追溯性矩阵:将每个需求/特定规则映射到设计类/方法。这将有助于确保大多数问题在设计中已经被考虑。它也有助于识别遗漏的内容。创建流程图,并将流程图中的每个节点映射到设计元素。同样,这可能是一个两阶段的过程。首先,创建与业务相关的高层次流程图,并将高层次设计(抽象类或接口)映射到它。然后,创建较低层次的流程图,并将特定的具体类/方法映射到它。这可以被认为是一种集成测试。
文档:是的,这是一个繁琐的过程,但它确实在编写代码时消除了很多混乱。因此,每个类、变量、属性、方法和事件的存在/使用都被解释,以便编码者确切地知道如何处理它。这样,即使是新加入项目的开发者也可以在不需要详细了解业务流程和项目特定细节的情况下开始工作。
白盒测试:向参与项目的同行和开发者解释类支持的工作流/过程。这样,设计者就能更好地理解开发者的期望。
黑盒测试:让那些对项目了解不多的人阅读设计,解释他们从设计中理解了什么,以及他们将如何实现它。
最后但同样重要的是,确保编码不包含任何在设计中没有反映的重大内容。设计文档应该是编码的唯一参考。即使是项目中使用的其他编码组件、DLL等,也必须在设计中提及,参考特定的设计文档。