Java中ADT的设计——AF(抽象函数)和RI(表示不变量)
程序员文章站
2022-04-02 10:55:41
...
Java中ADT的设计——AF(抽象函数)和RI(表示不变量)
在ADT的设计过程中,我们需要关注两个值域——表示域和抽象域。
表示域(以下简称R)包含的是值具体的实现实体。
抽象域(以下简称A)包含类型设计时支持使用的值。这些值是由表示域“抽象/想象”出来的。
ADT的设计者需要实现R到A的映射,ADT的使用者只需要关注抽象域即可。
R->A的图示:
在图中,我们可以发现R->A的映射特点:
- 每一个抽象值都是由表示值映射而来 ,即满射
- 一些抽象值是被多个表示值映射而来的,即未必单射
- 不是所有的表示值都能映射到抽象域中,即未必双射
在描述R->A时,需要抽象函数和表示不变量。
Abstraction function——抽象函数
- 抽象函数是表示值到其对应的抽象值的映射——AF: R->A。
- 对于抽象函数来说,仅仅宽泛的说抽象域表示了什么并不够。抽象函数的作用是规定合法的表示值会如何被解释到抽象域。作为一个函数,我们应该清晰的知道从一个输入到一个输入是怎么对应的。
Rep invariant——表示不变量
- 注明抽象值的合法区域。
- 说明合法/不合法的原因。
代码示例
// Immutable type representing a tweet.
public class Tweet {
private final String author;
private final String text;
private final Date timestamp;
// Rep invariant:
// author is a Twitter username (a nonempty string of letters, digits, underscores)
// text.length <= 140
// Abstraction function:
// AF(author, text, timestamp) = a tweet posted by author, with content text,
// at time timestamp
// Safety from rep exposure:
// All fields are private;
// author and text are Strings, so are guaranteed immutable;
// timestamp is a mutable Date, so Tweet() constructor and getTimestamp()
// make defensive copies to avoid sharing the rep's Date object with clients.
// Operations (specs and method bodies omitted to save space)
public Tweet(String author, String text, Date timestamp) { ... }
public String getAuthor() { ... }
public String getText() { ... }
public Date getTimestamp() { ... }
}
其中,RI针对Rep的每一个field以及多个fields之间的关系进行条件限定。AF给出了ADT使用者每一个抽象值对应的表示值。