后置条件定义了您的应用程序(或对象,取决于抽象级别)在操作之后应该处于什么状态才能被视为成功。例如,对于该readEmployee
操作,后置条件是:
- 创建一个新
Employee
实例。
- 该
Employee
实例包含与数据库值匹配的属性。
- 数据库连接已关闭。
我喜欢将“前置条件”和“后置条件”分别视为您的应用程序在执行操作之前和之后的“心态”。可以想象,当您进行 DbC 时,这更像是一个思考过程,而不是编码练习。
(如果您进行单元测试,状态会清楚地表明您的测试需要涵盖哪些内容。基本上,您最终会测试应用程序的“心态”。)
有趣的是,如果您考虑 DbC 的反面,您会意识到要确定您的应用程序(或对象)应该公开哪些操作,只需列出它可以拥有的状态以及它如何在这些状态之间转换。进行这些转换所需采取的操作将成为您的操作,您不必费心实施不会导致任何所需状态的操作。因此,例如,您可能希望您的应用程序具有以下状态。
- 添加了员工详细信息 (S1)
- 已加载员工详细信息 (S2)
- 更新了员工详细信息 (S3)
- 删除员工详细信息 (S4)
以下状态转换是可能的。
- S1 -> S3(添加新员工,更新详细信息)
- S1 -> S4(添加新员工,删除员工)
- S2 -> S3(加载员工详细信息,更新员工详细信息)
- S2 -> S4(加载员工详细信息,删除员工)
- S4 -> S1(删除员工,添加新员工)
- S2 -> S1(加载员工详细信息,添加新员工)
- S3 -> S1(更新员工详细信息,添加新员工)
- S3 -> S2(更新员工详细信息,加载员工详细信息)
基于上述内容,您可以以只允许有效转换的方式编写操作,而其他任何事情都会导致错误。
不可能的状态转换:
- S4 -> S2(不能删除员工,然后加载他们的详细信息)
- S4 -> S3(不能删除员工,然后更新他们的详细信息)
状态建模可能是设计对象中最重要的部分,因此您提出了正确的问题。如果您想要关于状态建模的良好资源,请从 Sally Shlaer / Stephen Mellor获取Object Lifecycles Modeling the World in States 。这是一本相当古老的书,在亚马逊上几乎不花钱,但它介绍的原则构成了现代 UML 的基础——顺便说一下,书中使用的符号看起来一点也不像 UML。
我意识到我没有触及数据库状态,但在概念层面上,数据库层只是另一个状态系统,并且适用相同的原则。
我希望这很有用。