软件构造期末复习2
复习ADT与OOP题目时的一点整理,记录下我个人角度的易错点与反思
-
行为等价性
可以是针对方法的、也可以是针对对象的,别死板。
-
错误说法:若在方法的 post-condition中声明"client端不能修改该方法所返回的变量",可以减少该方法的潜在bug
本来觉得读起来问题不大,但是答案认定为错。我估计依据是原来ppt的表述是也可能产生许多潜在bug。(如果不是为了做题没必要抠太细)
- immutable的ADT的rep
关于rep的严格定义没有找到,但是根据实验指导书大概可以理解为成员属性类型及其数值吧(常见说法:不要改变原有rep)
正确说法:一个 immutable的ADT其rep可以是 mutable的
理解为成员属性类型可以是可变类型的,比如Lab3的VoteItem类
正确说法:除了初始化, Immutable的类中一定不能存在其他任何改变rep的方法
eg: 一个表示分数的类,rep里有两个int,表示分子分母,创建时被初始化为了2和4,但是在调用Observer观察时被化简成了1和2,在外界看来它所 表达的都是1/2,没有区别。但是不要改原来的数据域,即便表达的抽象含义没改。
思考:rep 与 R 区别
- R空间A空间解释函数AF
R空间是ADT的内部表示的空间,
A空间是ADT能够表示的存在于实际当中的对
象。
ADT的开发者关注的是R空间,client关注的是A空间。
注意:spec不能暴露实现细节,不应该暴露局部变量,也不应该暴露私有的数据域(R的数值),A的数值当然可以暴露给客户。
- 表示泄露
我原本以为表示泄露就是client拿到数据域并修改的已然结果,但是做题后发现表示泄露指的是潜在危险。
表示泄露的定义:client可以拿到数据域的本身或别名。一旦表示泄露,client就有可能无意间改动数据,
eg:如果在设计中,要求一个ADT是Immutable的,而如果它出现了表示泄露,就有可能违反Immutable的原则。
正确说法:只要有 public的field,就定有表示泄露
解释:client可以拿到数据域的本身
错误说法:只要有非final的field,就定产生表示泄露
解释:与client拿到数据域的本身或别名无关