软件构造概念
spec
spec(specification),即规约,
规约是用户和实现者之间的契约。实现者提出要求,使用者遵守要求。
这是一种必要的规则。spec,广泛存在于类和方法前面,以便使用者更好地使用程序。
spec中可以包括:
- 对类/函数的简要说明,前置条件和后置条件等
- mutable和immutable
@Param
用来说明一些数据类型(泛型等),或者是传入参数的数据类型,要求,作用等。@return
用来说明返回值类型,或者是对返回的参数进行描述。@Throw
用来描述函数过程中可能抛出的异常。
一般来说,类的实现和继承越多重,其spec应该会越严格
如
class dog {
private String name;
private String gender;
private int age;
public dog(String name,String gender,int age){
......
}
......
}
类dog
的spec可表示为:
/**
*
*表示了一条狗
*可以构造狗,或者对已存在的狗进行改变,设置
*记录了它的姓名name,年龄age,和性别gender
*
*/
构造方法dog
的spec可为:
/**
*
*构造一条狗
*
*
*@Param name 狗的姓名
*@Param age 狗的年龄
*@Param gender 狗的性别
*
*
*/
AF
AF(Abstraction Function也叫抽象函数
什么是AF?
你可以理解为一个映射
在软件构造过程中,ADT实现着注重R空间,用户注重抽象空间A
A一定能找到和它对应的F,但F不一定有对应的A,所以AF是一个满射却不一定是单射(即不一定为双射)
毕竟客户想操作的类不能没有,至于实现过程中其他自己写的类多了就多了,是这样。想不想给客户操作是另一回事。
具体例子:
这里有只可怜的小狗在路边被捡到了,我们不妨把小狗当做一个机器狗,他被主人捡到的时候在自己脑子里生成了一个类叫做Alice
,它带有name``gender``age
三个属性。
class Alice extends dog{
private String name;
private final String gender;
private int age;
private boolean inject;
......
}
在实现过程中,以name
为例,
他的主人给他命名为爱丽丝,但是在登记狗的姓名的时候,由于中文不方便输入,于是主人在登记册上写下了Alice,于是小狗有了两个名字Alice和爱丽丝,别的名字当然也可以,只是我们的小狗听不听得懂呢?
在Class Alice
当中,他的AF表达为
//Abstraction Function:
/*
*一个表示名字的字符串
*
*/
RI
**RI(Representation invariant)**也叫做表示不变量
用来描述对于满足条件的,可以被记录的值。
或者说,满足能够被映射到抽象A的数据,RI用来说明什么样的数据是合法的。
我们仍然以class Alice
为例子,
某天爱丽丝何主任出去遛弯,他的主人向他的朋友介绍他的狗叫做爱丽丝,也叫做Alice,但是朋友耳背,于是他呼唤二丽斯,但是我们的爱丽丝听不懂,所以他没有回应,因为它不能接受二丽斯的叫法,它是一只狗,他是听不懂的!
即二丽斯不在小狗的RI内
那么对于小狗的name
来说
他的RI为
//Representation invariant:
/*
*name只能为爱丽丝,或者Alice
*不接受其他的name
*
*/
## checkRep
checkRep()
方法用来确保输入符合我们的RI,经常在creator,producer,mutators中调用来确保数据的合法性!!
主人在喂食和训练的过程要确认食物是小狗吃的,没有巧克力,小狗不会因为吃了巧克力去世。玩具也是适合狗狗的球球,不会爆炸,没有毒,更不会太小不小心噎死爱丽丝。
我们狗狗是这样容易死掉的。
小狗爱丽丝被主人带去打疫苗啦,医生给小狗爱丽丝打疫苗前反复确认了手上的疫苗这是给小型犬用的,因为一旦用成大型犬的剂量,爱丽丝可能就会马上去世(死机啦!error警告!!)
这就是checkRep的作用。不想爱丽丝死掉就好好地check啊喂!!!
Rep exposure
Rep exposure,就是表示泄漏,
在类中我们有各种方法来访问类中的数据,在大部分时候我们要求数据类型设置为private
是为了保护数据不泄漏。final
是为了加强数据的不可变性,使得代码更安全,具有更强的不变性和可读性,移植性。
一旦用户直接访问到原始数据并进行了修改,那么就会出现一系列的维护问题。
因此在类中,我们通常采用副本返回式来获取对象中的值(即get
方法)
打疫苗当然要爱丽丝的身份证明啦,可是这家宠物店看起来好像不是那么的正经,主人想了想最后上交了爱丽丝的身份复印件而不是原件,因为最近出现好多偷狗的,骗狗的,万一这家宠物店拿了身份原件,带爱丽丝去变性怎么办啊(别太荒谬)。
private final gengder
那只能是这样了。
世上还是坏人多,当然笨笨的爱丽丝不知道,他只知道自己被打了一针,属性boolean inject=true
咯,没办法,总不能所有属性 都不变吧,那还玩个屁。
“爱丽丝也想永生啊”,爱丽丝汪汪如是说,
“打针真疼啊”,爱丽丝这样想着。