190 likes | 297 Views
Chapter 11. 操作契约. 我们在哪儿. 目标. 确定系统操作 为系统操作创建契约. 为什么需要操作契约. 用例和 SSD 是用来描述系统行为的主要方式,在大多数情况下足以满足需求。 有时需要对系统行为进行更为详细和精确的描述 操作契约用于描述领域模型里对象的详细变化,作为系统操作的结果。. 什么是系统操作. 在 SSD 中定义了系统事件,而一个系统事件可以通过一个系统操作来实现。 将所有用例的系统操作的完整集合封装到一个类中,这个类定义了系统对外界的公共接口。. 系统操作处理输入的系统事件. 系统操作契约示例.
E N D
Chapter 11 操作契约
目标 • 确定系统操作 • 为系统操作创建契约
为什么需要操作契约 • 用例和SSD是用来描述系统行为的主要方式,在大多数情况下足以满足需求。 • 有时需要对系统行为进行更为详细和精确的描述 • 操作契约用于描述领域模型里对象的详细变化,作为系统操作的结果。
什么是系统操作 • 在SSD中定义了系统事件,而一个系统事件可以通过一个系统操作来实现。 • 将所有用例的系统操作的完整集合封装到一个类中,这个类定义了系统对外界的公共接口。
系统操作契约示例 • 操作: enterItem(itemID: ItemID, quantity: integer) • 交叉引用:处理销售用例 • 前置条件:有一个正在进行的销售 • 后置条件: • 创建了SaleLineItem的实例sli(创建实例) • sli与当前的Sale关联(形成关联) • sli.quantity赋值为quantity(修改属性) • 基于itemID的匹配,将sli关联到ProductionDescription(形成关联)
操作契约 • 系统操作可以进一步通过操作契约来说明。 • 操作契约包括前置条件和后置条件。 • 前置条件表述了操作前系统应该处于的状态 • 后置条件 • 表述了操作后,领域模型内对象状态的变化。领域模型状态的变化包括创建实例,形成或消除关联以及改变属性。 • 后置条件不是在操作过程中执行的活动,它们是对领域模型对象的观察结果。
示例:enterItem • 操作: enterItem (itemID: ItemID, quantity: integer) • 交叉引用:处理销售(用例) • 前置条件:存在一个正在进行销售 • 后置条件: • 创建了SalesLineItem的实例sli(创建实例) • Sli与当前Sale关联(形成关联) • Sli.quantity的值应该为quantity(修改属性) • 基于itemID的匹配,将sli关联到ProductDescription(形成关联)
契约的组成 • 操作:操作的名称和参数 • 交叉引用:会发生此操作的用例 • 前置条件:执行操作前,对系统或领域模型对象状态的重要假设。 • 后置条件:最重要的部分,表示完成操作后,领域模型对象的状态。
编写操作契约的步骤 • 从SSD中确定系统操作 • 如果系统操作比较复杂,其结果可能不明显,或者在用例中不清楚,则可为其构造契约 • 使用以下几种类别来描述后置条件 • 创建和删除实例 • 修改属性 • 形成和清除关联
一些准则 • 以过去时态表达后置条件,以强调它们是操作引起的可观察的结果。 • (较好)创建了SalesLineItem • (较差)创建SalesLineItem • 轻量级地书写后置条件。如果开发者在没有契约操作的情况下,能够准确地理解所要完成地工作,则没有必要编写契约。 • 书写后置条件时,在必要的情况下更新领域模型。
示例:makeNewSale • 操作:makeNewSale() • 交叉引用:处理销售用例 • 前置条件:无 • 后置条件: • 创建了Sale的实例s(创建实例) • s被关联到Register(形成关联) • s的属性被初始化(修改属性)
示例:makePayment • 操作:makePayment(amount:Money) • 交叉引用:处理销售用例 • 前置条件:当前有一个正在进行的销售 • 后置条件: • 创建了Payment的实例p(创建实例) • p.ammountTendered被赋值为amout(修改属性) • p被关联到当前的Sale • 当前的Sale被关联到Store(形成关联),将其加入到完成的销售日志中。
示例:endSale • 操作:endSale() • 交叉引用:处理销售用例 • 前置条件:当前有一个正在进行的销售 • 后置条件:sale.isComplete被置为true • 注意:涉及到领域模型的修改。
UML:操作契约和OCL • OCL是UML中定义的形式化的表示操作契约的语言。 • OCL很少被使用