软件构造 第三章

软件构造的第一章讲了软件的质量目标,而第二章主要讲了软件的开发过程和版本控制工具,所以在第三章主要内容就是如何去实现不同的质量目标。
这一章的要点在于静态和动态类型检查,snapshot图的绘制以及集合类表示数据类型。
在java中,有两种数据类型,一种是基本数据类型,一种是面向对象数据类型,对于面向对象的数据类型,也就是我们构建的那些类。
在java中,有些类与类之间有继承的关系,也就是子类可以继承父类的属性或者方法,java中实现继承的关键字是extend。
Java可以对对象的类型进行检测,类型的检测分为静态类型检测与动态类型检测,静态类型检测是在编译的阶段检查的,不需要运行程序,而动态类型检测需要运行程序。这些静态类型检测可以避免将错误带入运行阶段,保证程序的正确性和健壮性。而java是一种静态类型检测的语言,也就是说在运行的时候不会进行动态类型检测。静态类型检测是一种关于类型的检测,不考虑值的问题,而动态类型检测是一种关于值的检测。
在java中,对于变量的改变有两种,一种是再开辟一个内存区域,一种是直接改变存储区域的内容。前者是immutability也就是不可变性,就例如java中的final,就是限定了变量的指向不能被改变。还有String也是一种immutable的数据类型。与String对应的,StringBuilder 则是一种mutable的数据类型。
immutable类型和mutable类型在多个引用时有明显区别,immutable类型在修改的时候会产生大量的临时拷贝,而java是有自动的垃圾回收机制的,所以不可变数据类型的效率比较低,而mutable类型则不会创建多个内存空间,所以可以提高效率,而且有利于多个模块共享数据。
但是我们应该优先使用不可变类型,因为不可边类型简单而且节省了频繁复制的代价。
final对于对象的限定是指引用不可改变,并不是指向的值不可改变。所以可以通过final和immutable变量同时限制使得变量永远不可改变。
对于函数和方法,我们要先定义一个方法,然后在另外一个函数里对这个方法进行相应的调用。静态方法不需要设置对象,而非静态的需要设置一个对象才能进行调用。
对于规约,是一种程序与客户端之间达成的一致,它明确了双方的责任,还定义了正确实现的含义,所以调用的时候双方都要遵守。
契约中明确了前置条件也就是用户输入,还有后置条件也就是程序输出,如果用户输入满足了也就是前置条件满足了,那么后置条件必须满足,如果前置条件没有满足,那么后置条件也是无需满足的。而且规约也可以拿来判断两个方法的行为等价性,这是站在用户的层面来判断的,所以单在代码的层面是无法判断的,我们需要根据spec来判断,所以在编写程序之前是要明确spec的。
另外除非后置条件里有声明,否则不应该改变输入的参数,否则会出现很多问题。而且尽量不应该使用可变对象,为了防止多个引用和别名问题。
规约有几个特性,例如确定性,也就是输出是否确定,然后是陈述性,即是否声明性规约,然后是强度,也就是判断规约是否可以替换,当S2的前置条件比S1更弱的时候,而且S2的后置条件比S1要强的时候,就说明S2的强度比S1要强,就可以用S2来替代S1 。
一个好的规约应该是功能单一的,简单,易理解的。而且应该是高内聚的。它同时应该内容丰富,足够强也不能太强,如果在规约内使用抽象类型,那么对于用户和实现的自由度都能大大提高。规约中是否有前置条件取决于1.check的代价。 2.方法的使用范围,如果是private的方法,那么可以不使用前置条件,而在方法内部各个地方check,如果是public的方法,那么我们必须使用前置条件。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值