软件构造 复习笔记三

ADT和OOP的相关

数据类型
——基本数据类型:有值无ID,不可变(不能赋值为null)
——对象数据类型:有值有ID

静态,动态数据类型检查
——静态:编译阶段的检查,切入点“类型”,语法错误,类名函数名错误,参数数目类型错误,返回值类型错误
final变量不可变
——动态:运行阶段的检查,切入点“值”,非法参数,越界,空指针

改变一个变量:将该变量指向另一个存储空间
改变一个变量的值:向该变量空间中写入一个新的值

不可变量:final

  1. 变量值不可变
  2. 方法不能override
  3. 类不能有子类
  4. 引用不能改变

不可变对象:一旦被创建,始终指向同一个对象 - 安全性高,避免出现越界,溢出等错误
可变对象:可以修改其中的值和引用 - 性能好,适用共享数据

precondition:requires对用户要求(@params)
postcondition:effects对开发者要求(@return @throws)
注:

  1. 除非post中要求,否则不应该修改输入参数
  2. pre满足,post必须满足;
    pre不满足,post可以做任何事情

可变方法的规格说明
如果没有明确说明,则默认输入值是不可变的,可变带来巨大的麻烦。通过情况, 除非另有说明,保持不可变 ,不对输入进行修改。
可变对象使简单的契约变复杂
对可变对象的多引用,需要程序维护其一致性。此时约定不再是单纯的在调用者和实现者之间维持, 需要程序中每处的对其调用都有良好的行为 。**可变使对象具有全局属性,**导致难于理解和确保正确性。可变的优点是性能和便利,但是需要额外的确保无措的成本。
可变对象降低了修改自由!!
可变对象使调用者和实现者的规约更加复杂,降低了双方修改的自由。

spec强度:
pre更弱,post更强,则spec更强

确定的spec:给定一个pre-condition,输出唯一且明确
不确定的spec:同一个输入可以导致多种输出

操作式spec:伪代码形式,较为完备地描述了算法程序
声明式spec:没有中间描述,只有初始——终止

spec的图形表示
表示方法的实现
区域表示spec的全部方法
更强的spec?更少的方法实现?更小的区域

spec的设计——容易理解,内聚

测试和验证规格说明

正式的规格说明——JML
在这里插入图片描述
文本规格说明——Javadoc
在这里插入图片描述

spec强弱比较
如果S2的**前置条件更弱,后置条件更强,**则比S1更强,所以满足S2的实现可以用于满足S1,并且这个替换是安全的。

图表规约
每个点代表一个实现,一个规格说明定义了一个区域,其中包含的点为其实现。一个实现或者满足规格说明(区域内),或者不满足(区域外);
当S2强于S1时,它在该图中定义了一个较小的区域; 较弱的规范定义了一个更大的区域;
加强后置条件,意味着对输出要求更多,实现自由变少 。 弱化前置条件,实现中需要处理更多的情况;
上述两点使可满足的实现变少(点变少),故规格说明越强,区域越小。
在这里插入图片描述

ADT(Abstract Data Type)
数据抽象:由一组操作所刻画的数据类型,与内部的具体实现无关
ADT的特征:不变量,表示泄露,抽象函数,表示不变量,通过封装来避免客户获取内部表示

设计ADT
(1)设计简洁,一致的操作
(2)支持所有的操作
(3)要么具体,要么抽象
ADT表示独立性
(1)客户使用时,无需考虑内部实现问题
(2)ADT内部变化不影响外部spec和外部变化

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值