在软件构造课程的第三章
Abstract Data Type (ADT) and Object Oriented Programming (OOP)
中主要分为五个子章节
- 3-1 Data Type and Type Checking 数据类型与类型检验
- 3-2 DesigningSpecification 设计规约
- 3-3 Abstract Data Type (ADT) 抽象数据类型
- 3-4 Object-Oriented Programming (OOP)面向对象的编程
- 3-5 Equality in ADT and OOP ADT和OOP中的“等价性”
下面我们边分别对这五个子章节进行总结
3-2 DesigningSpecification 设计规约
DesigningSpecification 设计规约又简称 spec
3.2.1 什么是spec?
一个方法的spec主要讨论方法的参数和返回值,但绝不能讨论方法的局部变量或方法类的私有变量
这里给出一些例子来解释
例子1
例子2
3.2.2为什么要写spec?
编写程序时常常有两个目的:
- Communicating with the computer代码中蕴 含的“设计决策”:给编译器读
- Communicating with other people注释形式的“设计决策”:给自己和别人读
所以说spec就是编程的时候提供给别人的一种文档形式的注释
3.2.3 spec的作用?
- Spec给“供需双方”都确定了责任,在调用的时候双方都要遵守 ,没规约,没法写程序;即使写出来,也不知道对错。
- Spec是 程序与客户端之间达成的一致 ,充当一种契约:类或方法的实现者负责履行契约,使用该方法的客户端可以依赖契约进行调用调用。
- Spec可以隔离“变化”(类的实现者可以修改实现的代码而无需告知客户端),只讲“能做什么”,不讲 “怎么实现”
3.2.4 spec大概包含什么?
- 输入/输出的数据类型
- 功能和正确性
- 期望的性能
3.2.5 spec的条件
规约的条件大概包含pre-condition 前置条件 ,post-condition 后置条件
1.前置条件:对客户端的约束,在使用方法时必须满足的条件
2.后置条件:对开发者的约束,方法结束时必须满足的条件
而对于spec,前置条件和后置条件必须满足契约,也就是如果前置条件满足了,后置条件必须满足;而如果前置条件不满足,则我们写的方法可做任何事情
对于一个spec,必须满足确定性,即是:
给定一个满足precondition的输入,其输出是唯一的、明确的,不能让客户端产生理解的歧义
3.2.6 spec的强弱
在编程的过程中常常会出现一些情况,需要我们用一个spec替换另一个,如何比较两个spec,以判断是否可以用一个spec替换另一个?
常常用这样的方法来判断:
spec的强度S2>=S1
- S2的前置条件相对于S1的前置条件相等或者更弱
- S2的后置条件相对于S1的前置条件相等或者更强
此时,我们就可以用S2替代S1
使得 spec变强:更放松的前置条件+更严格的后置条件
而越强的规约,意味着implementor的自由度和责任越重,而client的 责任越轻。
**太弱的spec,client不放心、不敢用 (因为没有给出足够的承诺)
而太强的spec,在很多特殊情况下难以达到,给开发者增加了实现的难 度(client当然非常高兴)。**
下面举几个例子
更强
更弱
但是需要注意的是:如果两个spec的前置条件或者后置条件没有一个是一样的,我们不能根据经验得出两者的强弱,因为两者是无法比较的。
就比如刚才那种情况中的S1与S3,前置后置均没有相同的,所以说是无法比较的
同样我们还可以用图的方式来比较
更强的后置条件意味着实现的自由度更低了——>在图中的面积更小
更弱的前置条件意味着实现时要处理更多的可能输入,实现的自由度低了——>面积更小
一个完整的例子: