频道栏目
读书频道 > 软件开发 > 其他综合 > UML精粹:标准对象建模语言简明指南(第3版)
3.9 约束规则
2012-09-10 11:08:03     我来说两句
收藏   我要投稿
在紧迫的时间压力下,程序员很难通过紧跟技术创新的脚步来享受软件工程领域的最新成果。正因如此,殿堂级大师Martin Fowler这本旨在帮助专业人士提升效率的图书一问世,立即给软件工程社区带来巨大震撼。其前两...  立即去当当网订购

画类图时,你正在做的大部分事情都是表明约束。图3.1指出一个Order(订单)只可以由一名Customer(顾客)来下。这个图也意味着每个Line Item(订单行条目)是分开考虑的:你说Order 上有“40个棕色的装饰品、40个蓝色的装饰品和40个红色的装饰品”,而不是“120个东西”。此外,图中还说Corporate Customer有信用额度,但Personal Customer没有。

关联、属性和泛化的基本构造已经详细描述了许多重要的约束,但它们还不能表达每一个约束。这些约束依然需要捕获;类图是做这件事情的好地方。

UML允许你使用任何东西来描述约束,唯一的规则是你要把它们放进花括号({})中。你可以使用自然语言、编程语言或UML提供的形式对象约束语言(OCL)[Warmer and Kleppe]。OCL基于谓词演算。使用形式表示法避免由于含糊的自然语言造成误解的风险。然而,这也引进了由于作者和读者没有真正理解OCL导致误解的风险。因此除非读者熟悉谓词演算,否则我建议使用自然语言。
可选的做法是,你可以通过把名称放在前面,后面跟着冒号来命名约束。例如,{不允许乱伦:丈夫和妻子不能是兄妹、姐弟}。

按契约设计

按契约设计是由Bertrand Meyer [Meyer]开发的设计技术。该技术是他所开发的Eiffel语言的中心特性。不过,按契约设计不是Eiffel独有的,它是一项有价值的技术,可以用于任何编程语言。

按契约设计的核心是断言。断言(assertion)是一条决不应该为假的布尔陈述,因此,为假的唯一原因是存在bug。通常,断言只在调试期间检查,不在生产执行期间检查。事实上,程序决不应该假设断言正在被检查。

契约设计使用3种特定的断言:后置条件、前置条件和不变式。前置条件和后置条件应用于操作。后置条件(post-condition)陈述操作执行后世界看起来应该像什么样子。例如,我们定义数字上的操作“求平方根”,后置条件的形式为input = result * result,result 是输出,input是输入值。后置条件是说我们做什么而不说我们怎么做的一种有用的方式。换句话说,就是将接口从实现分离。

前置条件(pre-condition)陈述我们期望在执行操作前世界是什么样子。我们可以定义“求平方根”操作的前置条件为input > = 0。这样一个前置条件说明了在负数上调用“求平方根”是一个错误,这样做的结果没有定义。

乍一看,这看起来是个坏主意,因为我们应该把一些检查放在某些地方,以确保“求平方根”被适当地调用。重要的问题是谁负责这样做。

前置条件显式指出调用者负责检查。没有这个显式的责任陈述,我们可能检查得太少——因为双方都假设对方负责——或太多——双方都检查。太多检查是坏事,因为它会导致许多重复的检查代码,大大增加程序的复杂度。显式指出谁负责,有助于减少复杂度。由于这样一个事实,即断言通常在调试和测试期间检查,调用者忘记检查的危险减少了。

从前置条件和后置条件的这些定义,我们可以看到术语异常(exception)的强定义。在满足前置条件时,操作被调用,然而返回值如果没有满足后置条件,异常会发生。

不变式(invariant)是关于类的断言。例如,Account类可能有不变式balance == sum(entries.amount())。对于类的所有实例来说,这个不变式“总是”为真。在这里,“总是”意味着“无论何时,只要对象身上可以发生操作调用”。

本质上,这意味着不变式添加到与给定类的所有公开操作相关联的前置条件和后置条件上。在方法的执行期间,不变式可以变为假,但当任何其他对象能够对接收者做任何事情时,不变式应该被重建为真。

断言在子类化中扮演了独一无二的角色。继承的危险之一是你可以重定义子类的操作,和超类的操作不一致。断言减少了这样的危险。类的不变式和后置条件必须应用于所有子类。子类可以选择加强这些断言,但不能减弱。另一方面,前置条件不能被加强,但可以被减弱。

乍一看这有点奇怪,但重要的是允许动态绑定。根据可替换性原则,你应该总是能够像对待超类的实例一样对待一个子类对象。如果一个子类加强了其前置条件,超类操作应用到子类时会失败。

您对本文章有什么意见或着疑问吗?请到论坛讨论您的关注和建议是我们前行的参考和动力  
上一篇:3.8 依赖
下一篇:3.10 何时使用类图
相关文章
图文推荐
排行
热门
最新书评
文章
下载
读书
特别推荐

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训 | 举报中心

版权所有: 红黑联盟--致力于做实用的IT技术学习网站