在这篇文章中,我们将看看描述相同行为的不同规约,并讨论它们之间的权衡。我们将看三个维度来比较规约: 它有多大的确定性。这个规范是否只定义了一个对于给定输入的一个可能的输出是否允许实现者从一系列合法的输出中选择一个nbsp; 它是如何声明的。规范仅仅描述了输出应该是什么,还是明确地说明了输出是如何得来的nbsp; 它有多强。规约是有一小部分合法的实现方式,还是有很多实现方式
确定的规约与欠确定的规约
声明性的规约和操作性的规约
简单的说,操作性的给出该方法运行时的一系列步骤,一般为伪代码描述的操作。声明性额度规约没有给出中间步骤的详细信息。相反,它只给出最终结果的性质以及它与初始状态的关系。 几乎所有的情况下,声明性的规范更可取。它们通常更短,更容易理解,最重要的是,它们不会在不经意之间将我们方法实现的细节暴露给客户端。例如,当我们想查找数组中额度某一个元素时,我们不会在规约中写下”遍历数组直到他找到这个值“,因为该规约说明搜索过程从数组索引低的位置到数组索引高的位置,然后将最低的索引返回。 对于一个给定的规约,我们可以将它描述成多种形式,具体使用哪一种取决于程序员自己
强的规约和弱的规约
也可以被替换为
他的后置条件变强了
用图形表示规约
规约在所有可能的实现的空间中定义了一个区域。一个给定的实现要么按照规范行事:满足前提条件,隐含条件和后置条件,则它在该规约的区域内,否则它在该规约的区域外。
如何设计一个好的规约
规约应该是紧密结合的
除了使用了全局变量和打印而不是返回之外,规范是不连贯的,它执行两个不同的事情,计算单词并找出最长的单词。将这两种任务分离为两种不同的方法将使它们变得更简单(易于理解)并且在其他情况下更有用(准备改变)。
调用的结果应该是信息性的
考虑下边一个方法的规约,该方法将一个值放入一个映射中,其中键的类型为K,值的类型为V:
规约应该足够强大
规约也应该足够薄弱
考虑下边一个需要打开文件的方法的规约
规约应尽可能使用抽象类型
总结
声明性规范在实践中是最有用的。先决条件变强使客户端的选择更加艰难,但明智地应用它们是软件设计师的重要工具,并且允许实现者做出必要的假设。
文章知识点与官方知识档案匹配,可进一步学习相关知识Java技能树首页概览91528 人正在系统学习中
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!