软件构造课程一点小笔记

之前一直忘记写博客,
记录一些小笔记放在这里。
软件构造一二章笔记:

基本数据类型:存储在栈 只有值 没有id

对象数据类型:存储在堆 既有ID,也有值(S1 S2 内容相同,但存储在不同空间,如果S1==S2 就返回false(-128-127))。

继承:有严格的约束。如果B继承了A,那么任何一个B都是A, A的集合包含B的集合。

数据类型检测:

静态类型检测: 编译阶段进行检查。(语法错误,类名函数名错误,参数数目错误,参数类型错误,返回值类型错误)

动态类型检测:运行时检测某一个值是否出错,只有运行时才可以知道(非法的参数值,非法的返回值,越界,空指针)

动态类型检测>>静态>>无检查

mutability and Immutability

可变性和不可变性

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

改变一个变量:将该变量指向另一个值的存储空间。

String是不可变的

StringBuilder是可变的

不变性: 一旦被创建,始终指向同一个值/引用 。想让变量的值改变,要改变变量的引用。

final:无法改变变量的指向/引用,但指向的值可以变

fina类无法派生子类。无法继承

immutable类中不包含任何改变类中属性的方法 安全,

mutable:效率高,适合在多个模块间共享数据

risks:不安全。任何模块都可修改。 多个引用指向一个变量,

List是mutable (-5,-3)使用一次绝对值求和,然后就被改变了 ,再次求和,List已经被变了。

Date是mutable变量,返回引用,改变后就把原引用改变了。

LacalDateTime为immutable。

Defensive copying 防御性拷贝

返回一个全新的copy对象 缺点:浪费内存

snapshot diagram

Build time-Run time

code

规约spec:

判断行为等价性

前置条件:使用方法满足的条件

后置方法:完成方法时满足的条件。

前置满足,后置一定满足。

前置不满足,输出什么都是正确的。

/** 表示规约,生成文档会特殊处理(两个*)

@param:前置条件。不用写类型

@return:返回值

@throws:抛出异常等

(@requires @effects不包含此语法)

确定性

陈述性

规约的强度,

判断哪个规约更好

如何比较两个spec,

如果强度S2>=S1,S2前置条件更弱,后置条件更强,(或者等于)

就可以用S2替换S1;

spec变强,更放松的前置条件+更严格的后置条件

判断后置条件是否增强要在原前置条件下。

前置弱了。后置也弱了。无法比较。不存在替换关系。

确定的规约:

欠定的规约:同一个输入可以有多个输出,有确定的实现。

更强的后置条件意味着实现的自由度降低了。

更弱的前置条件意味着要处理更多的可能输入,实现的自由度低了。

好的方法设计~对方法的spec的设计

spec单一简单易理解

再规约里使用抽象类型,可以给方法的实现体和客户端更大的自由度。

不限定太强的precondition,而在postcondition种抛出异常:输入不合法。

尽可能早的在根源处判断。

是否使用前置条件取决于:1.check的代价

2,方法的使用范围。

如果在类的内部使用该方法,可以不使用前置条件。

如果在其他地方public,要使用前置条件。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值