HIT软件构造课程复习——第三章ADT&OOP第二节设计规格说明

主要内容:

1.规格说明,前置/后置条件


2.行为等价性

3.规约的强度

一、规格说明,前置/后置条件

1.documentation

包括类层次结构和已实现接口的列表,直接子类,类的描述,构造器摘要,方法摘要列(出了我们可以调用的所有方法),每种方法和构造函数的详细描述。

记录假设:

向下写入变量的类型会记录一个关于它的假设:例如,这个变量总是引用一个整数。-ava实际上在编译时检查这个假设,并保证在您的程序中,没有任何地方违背了这个假设。声明变量Final也是一种文档形式,它声称变量在其初始赋值之后永远不会改变。因为编程中充满了假设,如果我们不把它们写下来,我们就不会记住它们,其他需要阅读或修改我们的程序的人也不会知道它们,他们得猜。

2.Specification and Contract

规范是团队合作的关键。在没有规范的情况下,不可能分派实现方法的责任。规范充当契约:实现者负责履行合同,使用该方法的客户端可以依赖契约。与真正的法律合同一样,规范对双方都提出了要求:当规范有前提条件时,客户也有责任。准确的规格说明利于确定错误的责任和位置。规范对方法的客户端是好的,因为它们节省了读取代码的时间。通过对输入的限制说明,省略掉一些耗时的检查工作,提升效率。该契约充当客户端和实现者之间的防火墙。此防火墙导致解耦,允许独立地更改单元代码和客户端代码,只要更改符合规范。

3.规格说明的结构:前置/后置条件

方法的规格说明由几个部分组成:

-前置条件,由关键字requires声明

-后置条件,由关键字effects声明

-异常行为:如果违反先决条件会怎么样

前置条件是对客户的义务。它是调用方法的状态的一个条件。后条件是方法实施者的一项义务。如果该先决条件对调用状态有效,则该方法必须服从后置条件,方法是返回适当的值、抛出指定的异常、修改或不修改对象。等等。总体结构是一个逻辑蕴含:如果在调用方法时前提条件仍然有效,那么当方法完成时,后置条件必须保持不变。如果在调用方法时前提条件不成立,则实现不受后置条件的约束。它可以自由地做任何事情,包括不终止,抛出一个异常,ret。任意的结果,任意的修改等。

静态类型声明实际上是方法的先决条件和后置条件的一部分,这个部分由编译器自动检查和执行。合同的其余部分必须在该方法之前的注释中加以描述,并且通常有人工来检查并保证它。

参数由@param子句描述,结果则由@return和@throws子句描述。

e.g.

如果没有明确说明,则默认输入值是不可变的,对可变对象的多引用,需要程序维护一致性,此时合同不再是单纯的在客户和实现者之间维持,需要每一个引用者都有良好的行为,可变对象使得客户端和实现者之间的契约变得更加复杂,减少了客户端和实现者改变的自由。换句话说,使用允许更改的对象会使代码更难更改。


二、行为等价性

要确定行为等价性,问题在于我们是否可以用一个实现代替另一个实现。

这两个方法不仅有不同的代码,而且实际上有不同的行为。但是,当Val恰好是数组的一个索引上时,这两个方法的行为是相同的。为了能够将一个实现替换为另一个实现,并且要知道什么时候是可以替换的,我们需要一个规范,来说明客户所要求的内容,也就是前置条件和后置条件。

ps.规格说明不应讨论方法的局部变量或方法类的私有字段。




三、规约的强度

如何比较两种规范的行为以确定用新规范取代旧规范是否安全?

如果S2强度大于等于S1,那么s2的前提条件比s1弱或等于s1,对于满足S1前提条件的状态,S2的后条件大于或等于S1。那么,满足S2的实现也可以满足S1,并且在程序中用S2替换S1是安全的。

削弱前提条件:对客户提出更少的要求永远不会使他们感到不安。

加强后条件,这意味着作出更多的承诺。

猜你喜欢

转载自blog.csdn.net/qq_38828473/article/details/80715076