欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Java中ADT的设计——AF(抽象函数)和RI(表示不变量)

程序员文章站 2022-04-02 10:55:41
...

Java中ADT的设计——AF(抽象函数)和RI(表示不变量)

在ADT的设计过程中,我们需要关注两个值域——表示域和抽象域。
表示域(以下简称R)包含的是值具体的实现实体。
抽象域(以下简称A)包含类型设计时支持使用的值。这些值是由表示域“抽象/想象”出来的。
ADT的设计者需要实现R到A的映射,ADT的使用者只需要关注抽象域即可。

R->A的图示:
Java中ADT的设计——AF(抽象函数)和RI(表示不变量)
在图中,我们可以发现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使用者每一个抽象值对应的表示值。

相关标签: 软件构造