软件构造期末总结——第四、五、七(下)章笔记

写在前面:
虽然软件构造考试已经j结束很久了,然而现在我才有时间可以写博客。

第四章 数据类型和类型检验

有大题的一章
软件构造的理论基础——ADT
软件构造的技术基础——OOP

1. 数据类型

基本数据类型对象数据类型
8个:byte,short,int,long,float,double,char,boolean其他所有类型:类接口、数组、枚举等(包括String
只有值,无identity,与其他值无法区分,举个例子:int a =1,b=1;此时a=b成立既有值也有identity,举个例子String s=new(a),t=new(b);此时s=t不成立
不可变可变
栈中堆中
创建代价低创建代价高

注:
object是所有对象类型的父类,除object外所有类都有一个父类,如果未用extends显示则默认为object。

2. 静态、动态检查与静态、动态语言

检查

静态检查:检查的是类型并不考虑值,可以发现语法错误、类名/函数名错误、参数数目错误、参数类型错误,返回值类型错误等。
动态检查:是关于值的检查,可以发现非法参数值、非法返回值、数组越界、空指针等错误。

语言

静态语言:编译阶段进行类型检查。
动态语言:运行阶段进行类型检查。
注:Java是静态类型语言但它同时具有动态类型和静态类型检查。

3. Mutable与Immutable

赋值方式

改变一个变量:将该变量值指向另一个值的存储空间。
改变一个变量的值:直接改变值,当前值指向的存储空间直接写入一个新值。

final

final+类 无法派生子类
final+方法 方法无法被重写
final+变量 无法改变指向

不变对象:一旦被创建始终指向同一个值或引用。
可变对象:拥有方法可以修改自己的值。

4. 改变代码

(1)防御式拷贝,给客户端返回一个全新的Data对象

// 一个防御式拷贝的例子
return new Date(groundhogAnswer.getTime());

但大部分时候拷贝不会被客户端更改,可能造成大量的内存浪费。
(2)使用不可变类型
程序不同部分可以安全共享内存中的相同值,更少复制,更少内存空间。
(3)安全地使用可变类型
比如,局部变量可以使用可变类型,不会涉及共享,只有一个引用就会比较安全。

5. Snapshot diagram

其中被final修饰的要双线箭头,不可变类型要双圈,这个要画图有点不太好打出来,可以参考学部软件构造第一次讲座的PPT,我觉得非常好。

第五章 规约

规约:规约是客户端与实现者之间的契约,包含注释和方法名,其中方法名可以通过静态检测
客户端:输入满足前置条件
实现者:编写的程序应该满足后置条件的结果
注:前置条件不满足时,方法干啥都行。

// 标准的注释写法如下(应该是,这是我记在笔记本上的样子)
//如果错了不好意思
/**
@param:前置条件(参数)
@return:返回值
@throws:抛出的异常
**/
//我还看到过@effects,应该不太常用,指的是这个函数的影响

更强的规约:前置条件更弱,后置条件更强。
注:规约越强相当于给了客户端更大的自由度,客户喜欢更强的规约,但对实现者来讲,越强的规约越不好实现,所以对应的图中:更强的规约表现为更小的区域表示满足它的方法更少,强规约可以代替弱规约。

测试时不要违背规约的限制

设计好的规约
(1)内聚的:spec描述的功能应单一、简单、易理解。
(2)契约得足够强:用户出现某一情况应该知道到底做了什么,不能让用户猜。
(3)也得足够弱:比如打开一个文件有的时候会出错,不是程序造成的,而是系统造成的,给用户错觉,不管咋输入都能打开,那这个规约就太强了。
(4)要使用抽象类型:规约中不能暴露给用户代码信息,要使用抽象类型,这样可以给方法的实现体与客户端更大的自由度。

第七章 OOP面向对象的编程(下)

接上上条博客

5. object中的方法

equals()
object中的equals方法的默认效果是判断两个引用是否指向同一对象
一般来说用的时候需要重写。
这里也说一下判相等的问题:
== :判断两个引用是否指向同一对象,常见于基本数据类型
equals():通过对象的实际值判断是否等价
注意
StringBuilder equals()方法并没有重写
String重写了

hashCode():默认直接返回对象的地址,即:对象的哈希值相同当且仅当为同一个对象(引用一样)
(自定义等价规则时需要重写,这里计算哈希值时,要求等价对象有相同的哈希值,好的算法也应该使不等价的对象哈希值尽量不同)

toString():好像没啥可说的……

6. 设计好的类

(1)简单:不要所有的类都混在一起。
(2)安全:线程安全。写immutable的类,用好final、private,mutable的不要直接返回或外部引用进来,等等。

7. 等价性的问题

观察等价性:不改变状态的情况,某个时间点这2个对象用户看起来是否一样(值一样就一样)。
行为等价性:任何时间的情况下,都一样,指向同一对象。

注:对于客户端来说的等价性就是映射到相同的抽象值。

8.基本数据类型封装变成对象

举个例子

// 得到整数对象
Integer x = new Integer(3);

上述内容都是我笔记上记的内容,如有错误,敬请指正。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值