在软件构造课程的第三章
Abstract Data Type (ADT) and Object Oriented Programming (OOP)
中主要分为五个子章节

  1. 3-1 Data Type and Type Checking 数据类型与类型检验
  2. 3-2 DesigningSpecification 设计规约
  3. 3-3 Abstract Data Type (ADT) 抽象数据类型
  4. 3-4 Object-Oriented Programming (OOP)面向对象的编程
  5. 3-5 Equality in ADT and OOP ADT和OOP中的“等价性”

下面我们边分别对这五个子章节进行总结

3-2 DesigningSpecification 设计规约

DesigningSpecification 设计规约又简称 spec

3.2.1 什么是spec?

一个方法的spec主要讨论方法的参数和返回值,但绝不能讨论方法的局部变量或方法类的私有变量
#软件构造 ADT与OOP的总结 (2)设计规约
这里给出一些例子来解释
例子1
#软件构造 ADT与OOP的总结 (2)设计规约
例子2
#软件构造 ADT与OOP的总结 (2)设计规约

3.2.2为什么要写spec?

编写程序时常常有两个目的:

  1. Communicating with the computer代码中蕴 含的“设计决策”:给编译器读
  2. Communicating with other people注释形式的“设计决策”:给自己和别人读
    所以说spec就是编程的时候提供给别人的一种文档形式的注释

3.2.3 spec的作用?

  1. Spec给“供需双方”都确定了责任,在调用的时候双方都要遵守 ,没规约,没法写程序;即使写出来,也不知道对错。
  2. Spec是 程序与客户端之间达成的一致 ,充当一种契约:类或方法的实现者负责履行契约,使用该方法的客户端可以依赖契约进行调用调用。
  3. Spec可以隔离“变化”(类的实现者可以修改实现的代码而无需告知客户端),只讲“能做什么”,不讲 “怎么实现”

3.2.4 spec大概包含什么?

  1. 输入/输出的数据类型
  2. 功能和正确性
  3. 期望的性能

3.2.5 spec的条件

规约的条件大概包含pre-condition 前置条件 ,post-condition 后置条件

1.前置条件:对客户端的约束,在使用方法时必须满足的条件
2.后置条件:对开发者的约束,方法结束时必须满足的条件

而对于spec,前置条件和后置条件必须满足契约,也就是如果前置条件满足了,后置条件必须满足;而如果前置条件不满足,则我们写的方法可做任何事情
对于一个spec,必须满足确定性,即是:
给定一个满足precondition的输入,其输出是唯一的、明确的,不能让客户端产生理解的歧义

3.2.6 spec的强弱

在编程的过程中常常会出现一些情况,需要我们用一个spec替换另一个,如何比较两个spec,以判断是否可以用一个spec替换另一个?

常常用这样的方法来判断
spec的强度S2>=S1

  1. S2的前置条件相对于S1的前置条件相等或者更弱
  2. S2的后置条件相对于S1的前置条件相等或者更强

此时,我们就可以用S2替代S1
使得 spec变强:更放松的前置条件+更严格的后置条件
而越强的规约,意味着implementor的自由度和责任越重,而client的 责任越轻。

**太弱的spec,client不放心、不敢用 (因为没有给出足够的承诺)

而太强的spec,在很多特殊情况下难以达到,给开发者增加了实现的难 度(client当然非常高兴)。**

下面举几个例子
#软件构造 ADT与OOP的总结 (2)设计规约
更强
#软件构造 ADT与OOP的总结 (2)设计规约
更弱
#软件构造 ADT与OOP的总结 (2)设计规约
但是需要注意的是:如果两个spec的前置条件或者后置条件没有一个是一样的,我们不能根据经验得出两者的强弱,因为两者是无法比较的。
就比如刚才那种情况中的S1与S3,前置后置均没有相同的,所以说是无法比较的

同样我们还可以用图的方式来比较
#软件构造 ADT与OOP的总结 (2)设计规约
更强的后置条件意味着实现的自由度更低了——>在图中的面积更小

更弱的前置条件意味着实现时要处理更多的可能输入,实现的自由度低了——>面积更小

一个完整的例子:
#软件构造 ADT与OOP的总结 (2)设计规约

相关文章:

  • 2021-10-29
  • 2021-10-11
  • 2021-05-12
  • 2021-10-16
  • 2021-10-11
  • 2021-09-29
  • 2021-10-08
  • 2022-01-15
猜你喜欢
  • 2021-05-18
  • 2021-08-21
  • 2021-10-02
  • 2021-12-25
  • 2021-10-30
  • 2021-10-21
  • 2021-04-07
相关资源
相似解决方案