软件构造博客三----软构笔记

目录

四.数据类型和类型检验

主要内容

1.编程语言的数据类型

java数据类型比较

2.静态数据类型检查/动态数据类型检查

3.可变性和不可变性

4.Snapshot diagram as a code-level, run-time, and moment view

5.Complex data types: Arrays and Collections

6.Useful immutable types

五.设计规约

1.Functions & methods in programming languages

2.Specification: Programming for communication

(1) Documenting in programming

(2) Specification and Contract (of a method)

(3) Behavioral equivalence

(4) Specification structure: pre-condition and post-condition


四.数据类型和类型检验

主要内容

·数据类型基本知识,静态/动态类型检查

·可变/不变的数据类型

·可变数据类型的危险性

·不变数据类型的优越性

·用Snapshot图理解数据类型

·用集合类表达复杂数据类型

·了解空引用的危害并避免

1.编程语言的数据类型

数据类型指的是一组值以及可以对其执行的操作。

例如:boolean类型包括true和false;int类型表示整数等。

变量指的是用特定数据类型定义,可存储满足类型约束的值。

java的基本数据类型:int,long,boolean,double,char。

java的对象数据类型:String,BigInteger等。

在java语言中,基本数据类型使用小写,对象数据类型以大写字母开头。

java数据类型比较

对象类型形成层次结构:根类型是Object类。

Boolean,Integer等类型是将基本类型包装而成的。通常是在定义容器类型的时候使用它们(容器类型操作的元素要求是对象类型,所以需要对基本数据类型进行包装,转换为对象类型),所以一般情况下,要尽量避免使用(会降低性能)。

调用的时候一般可以自动转换。

操作符:=,+,-,*,/等。使用规则遵循数学规则。

操作是接受输入和输出的函数:作为前缀中缀后缀运算符;作为对象的方法;作为函数。

2.静态数据类型检查/动态数据类型检查

Java是一种静态类型语言,所有变量的类型在编译时已知,因此编译器可以推导表达式类型。静态检查也就是IDE会在编译阶段进行类型检查。(动态类型语言会在运行阶段进行类型检查)

静态检查在程序运行之前自动发现;动态检查在代码执行过程中自动检查。

静态检查可在编译阶段发现错误,避免了将错误带入到运行阶段,可提高程序正确性/健壮性。

静态检查的内容包括语法错误,类名/函数名错误,参数数目错误,参数类型错误和返回值类型错误等等。

动态检查包括非法参数值,非法返回值越界访问,空指针引用等等。总之,静态检查是关于“类型”的检查,不考虑值;动态检查是关于“值”的检查。

3.可变性和不可变性

改变一个变量和改变一个变量的值的区别?改变一个变量值将该变量指向另一个存储空间;改变一个变量的值是将该变量当前指向的存储空间中写入一个新的值。

不变性是程序设计的一个重要设计原则。对于不变数据类型来说,一旦被创建,其值不能改变。如果是引用类型,也可以是不变的:一旦确定其指向的对象,不能再被改变指向其他对象。例如,编译器进行静态类型检查时,如判断final变量首次赋值后发生了改变,会提示错误。

final表明了程序员的一种“设计决策”,在设计的过程中,程序员应该尽量使用final变量作为方法的输入参数、作为局部变量。

注意:final类无法派生子类;final变量无法改变值/引用;final方法无法被子类重写。

String是不可变类型,如下图所示

 

相反,StringBuilder就是可变类型;

 如果只有一个引用指向该对象的时候没有区别;多个引用有区别。

使用不可变类型,对其频繁修改会产生大量的临时拷贝(需要垃圾回收);可变类型因为最少化拷贝,可以提高效率。使用可变数据类型,可获得更好的性能,也适合于在多个模块之间共享数据。

既然如此,为何还要用不可变类型?因为不可变类型更“安全”, 在其他质量指标上表现更好;可变性使得难以理解程序正在做什么,更难满足方法的规约。

传递可变对象是一个潜在的错误源泉,一旦被无意中改变,则这种错误非常难于跟踪和发现。

4.Snapshot diagram as a code-level, run-time, and moment view

快照图用于描述程序运行时的内部状态,便于程序员之间的交流,便于刻画各类变量随时间变化,便于解释设计思路。

基本数据类型: 

 对象类型:

不可变对象:双线椭圆    不可变引用:双线箭头

引用是不可变的,但指向的值却可以是可变的;可变的引用,也可指向不可变的值。

5.Complex data types: Arrays and Collections

数组:定长数组不可以改变长度。

列表:列表是一种接口;列表里面的成员变量必须是对象。

迭代器

集合:0个或多个不同对象的无序集合。一种抽象接口

Map:类似于字典键值对。

当添加一个item时,编译器执行静态检查,确保只添加合适类型的item。因此,我们可确保取出的值是指定类型的。

List,Set和Map都是接口:它们定义了这些各自类型的工作方式,但不提供实现代码。优点就是用户有权在不同情况下选择不同的实现。

Iterator----迭代器是一个对象,它遍历一组元素并逐个返回元素。例如,for(…:…)形式的遍历, 调用的是被遍历对象所实现的迭代器。

6.Useful immutable types

基本类型及其封装对象类型都是不可变的。这种包装器得到的结果是不可变的:只能看;但是这种“不可变”是在运行阶段获得的,编译阶段无法据此进行静态检查。

不可修改的包装通过截获将修改集合的所有操作并抛出异常来取消修改集合的能力。

1.使集合在构建后不可变。在这种情况下,最好不要维护对支持集合的引用,这绝对保证了不变性。

2.允许某些客户端以只读方式访问数据结构,保留对后备集合的引用,但分发对包装器的引用。这样,客户机就可以查看但不能修改,同时可以保证完全访问权限。

五.设计规约

·理解方法规约中的前置条件和后置条件,并能够编写正确的规范

·前置/后置规约对方法的实现者和客户意味着什么

·了解未确定的规约,并且能够识别和评估不确定性

·了解陈述式规约/操作式规约,并能够编写声明性规范

·了解前置条件,后置条件和规约的强度;能够比较规约强度

·能够写出具有适当强度的连贯有用的规约

1.Functions & methods in programming languages

参数类型是否匹配,在静态类型检查阶段完成;返回值类型是否匹配,也在静态类型检查阶段完成

“方法”是程序的“积木”,可以被独立开发、测试、复用;使用“方法”的客户端,无需了解方法内部具体如何工作—“抽象”。

2.Specification: Programming for communication

(1) Documenting in programming

eg.final关键字定义了设计决策:“不可改变”

代码本身就蕴含着你的设计决策,但是远远不够.

我们为什么要写出规约?第一自己记不住,第二别人不懂。

(2) Specification and Contract (of a method)

如果没有规约,就没法分派任务,无法写程序;即使写出来,也不知道对错。规约是程序与客户端之间达成的一致,明确双方的责任,同时定义正确实现的含义。规约给“供需双方”都确定了责任,在调用的时候双方都要遵守。

为什么要使用规约呢?因为很多bug来自于 双方之间的误解,如果不写下来,那么不同开发者的理解就可能不同。没有规约 ,难以定位错误。精确的规约,有助于区分责任;客户端无需阅读被调用函数的代码,只需理解spec即可。

规约可以隔离“变化”而无需通知客户端,在程序的实现中扮演着“防火墙”的角色。客户端不需要知道如何实现,实现者也不需要知道如何被使用。

 规约中包括输入输出的数据类型,功能和正确性,只讲能做什么而不讲怎么实现。

(3) Behavioral equivalence

行为等价性:站在客户端视角,根据规约来判断是否行为等价。如果两个函数符合统一规约,那么他们就等价。

总结:单纯看代码并不足以判定不同代码是否是行为等价的;需要根据代码规约来判断,在编写代码之前需要弄清楚规约如何协商形成以及如何撰写。

(4) Specification structure: pre-condition and post-condition

前置条件:对客户端的约束,在使用方法时必须满足的条件

后置条件:对开发者的约束,方法结束时必须满足的条件

如果前置条件满足了那么后置条件必须满足;前置条件不满足的情况下方法可以做任何事情。

静态类型声明是一种规约,可据此进行静态类型检查。方法前的注释也是一种规约,但需人工判定其是否满足。方法的规约可以讨论方法的参数和返回值,但绝不能讨论方法的局部变量或者方法类的私有字段。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值