软件构造学习心得ADT与OOP(2)

规格说明的设计

规格说明

程序语言的文档说明

这里我们以java语言为例介绍一下javaAPI文档。
javaAPI包括以下内容:
1.java语言中的各种类与接口。
2.对各个类的一个较为详细的描述。
3.构造方法与方法的集合。
4.每个方法的详细描述,包括参数,返回对象,以及整个过程的完整描述。
下图即为一个类的API方法的描述。
如图所示为一个类的API文档中各个方法的介绍

规格说明

那么什么是规格说明呢?
事实上,规格说明就是实现者和使用者之间的一种契约,实现者负责满足契约,使用者可以信赖契约。
这个契约也对双方都产生了约束作用。

规格说明的优点

1.利于确定bug出现的位置,以及产生bug的责任。
2.可以使客户不用通过阅读代码即可了解整个程序的功能。
3.通过对输入正确性的限定,省略掉耗时的正确性检查工作,提升效率。

前置条件和后置条件

如果前置条件满足了,后置条件必须满足。
这个很容易理解,也就是说当满足一定的输入时,一定要得到相应的输出。

规格说明的形式
/**
@param 参数
@return 返回值
@throws 抛出异常
*/

测试

黑盒测试

不关心代码内部结构,只判断是否能够实现给相应的输入得到相应的输出

白盒测试

检查程序的内部结构与逻辑。

设计规格说明

规格说明的分类

1.确定型:只有一个返回值和一个最终状态
2.低确定:允许一个输入存在多个有效输出
3.非确定:输出结果不确定。

如何判断规格说明的强弱?

要求的更少,承诺的更多,则规格说明越强。

抽象数据类型(ADT)

用了很长时间介绍其他的东西,终于到了我们的重头戏,ADT!
首先我们来明确什么是抽象
所谓,抽象就是隐藏我们详细的代码实现,用一种更高阶的思维来完成设计。
然后分成将我们抽象的数据类型模块化,再进行封装使其不依赖于代码的其他部分。

数据抽象

对一个数据的类型定义依赖于它的操作
在我们以往学过的类型中也可以这样理解,例如Number类的数据我们可以理解为是一个可以用来加减乘除操作的对象,String类型的对象可以理解为一个可以进行字符串连接和取反操作的对象。
通过这样的一种新的理解方式,我们就不难理解什么是数据抽象了。
它主要是更注重了操作的方式。

抽象数据类型的操作

抽象数据类型的操作我们可以笼统的分为以下四种:
1.Creator:用来产生一个新的对象
2.Producer:在已有对象基础上产生新对象
3.Observer:输入抽象数据类型,返回其他数据类型
4.Mutator:改变一个对象。
而我们的类型正是由它的类型操作集所决定的。
但是因为数据的值是不透明的因此我们可以称其是抽象数据类型。

如何设计一个良好的ADT

1.操作行为应该是内聚的,我们不应该让一个操作中包含过多的操作,要用更多简单的操作来实现一个复杂操作。
2.操作集应该是完整的,应该能覆盖到所有它应该支持的行为。判断方法就是看是否每个需要被访问到的对象都能被访问到。
3.不应该将该领域无关的与该领域内的数据混合使用

不变性

不可变类型的重要不变性,使得程序无论如何运行,这条重要的不变性不会改变。

AF和RI

AF:交代了抽象数据类型中的域如何被映射到A上。
RI:通过不变性我们可以初步判断一个数据是否被映射到了A上,如果不满足RI,那一定不在A上
ADTd的设计关键之一就是要选择两个空间,而且要决定表示值和如何映射。

面向对象程序设计

什么是面型对象程序设计?

面向对象其实是现实世界模型的自然延伸。现实世界中任何实体都可以看作是对象。对象之间通过消息相互作用。另外,现实世界中任何实体都可归属于某类事物,任何对象都是某一类事物的实例。如果说传统的面向过程式编程语言是以过程为中心以算法为驱动的话,面向对象的编程语言则是以对象为中心以消息为驱动。用公式表示,过程式编程语言为:程序=算法+数据;面向对象编程语言为:程序=对象+消息。

OOP的三大特征

1.封装:所谓封装,就是用一个自主式框架把对象的数据和方法联在一起形成一个整体。可以说,对象是支持封装的手段,是封装的基本单位。Java语言的封装性较强,因为Java无全局变量,无主函数,在Java中绝大部分成员是对象,只有简单的数字类型、字符类型和布尔类型除外。而对于这些类型,Java也提供了相应的对象类型以便与其他对象交互操作。
2.多态性:多态性就是多种表现形式,具体来说,可以用"一个对外接口,多个内在实现方法"表示。举一个例子,计算机中的堆栈可以存储各种格式的数据,包括整型,浮点或字符。不管存储的是何种数据,堆栈的算法实现是一样的。针对不同的数据类型,编程人员不必手工选择,只需使用统一接口名,系统可自动选择。运算符重载(operator overload)一直被认为是一种优秀的多态机制体现,但由于考虑到它会使程序变得难以理解,所以Java最后还是把它取消了。
3.继承:继承是指一个对象直接使用另一对象的属性和方法。事实上,我们遇到的很多实体都有继承的含义。例如,若把汽车看成一个实体,它可以分成多个子实体,如:卡车、公共汽车等。这些子实体都具有汽车的特性,因此,汽车是它们的"父亲",而这些子实体则是汽车的"孩子"。Java提供给用户一系列类(class),Java的类有层次结构,子类可以继承父类的属性和方法。与另外一些面向对象编程语言不同,Java只支持单一继承。

继承中的覆盖与重写的一些注意事项

1.子类只能向父类中添加方法,而不能覆盖他们。
2.带有final关键字的方法不能被重写。
3.如果子类的构造方法调用了父类的构造方法,那他们一定在第一行。

抽象类:

抽象方法:只有定义没有实现的方法。
抽象类不能实例化。继承某个抽象类的子类时,必须要实现所有父类中的抽象方法。
接口:接口是一类特殊的抽象类,它只有抽象方法。

重载

重载指在一个类中存在多个同名函数,必须具有不同的参数列表,返回值类型可同可不同。
注意事项:当父类和子类用了同名函数时,如果参数列表相同,即为重写,否则就是重载。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

奇迹飞鹏

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值