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