软构:AF、RI、Safety from rep exposure、spec的理解

本文介绍了抽象函数(AF)和表示不变量(RI)在程序设计中的概念。AF是将内部数据结构映射到用户可见的抽象概念,而RI确保了数据表示的合法性。举例说明了如何在有向图类中应用AF和RI,并强调了防御式拷贝以防止表示泄露。此外,还讨论了在类设计中使用private和final关键字来保护内部表示的安全性。
摘要由CSDN通过智能技术生成

AF

全称Abstraction function(抽象函数),类似于一个映射

AF

其中R是创建的类,A是抽象值构成的空间

就是构造的程序的 ADT里面的量外部人员想要操作的量 的映射

AF一定是满射,不一定是单射,也就不一定是双射

(也就是R中的类不一定能找到A,但是A中的抽象必须有R中对应的类)

//也可以理解为客户的要求必须实现~但是你多写点啥也没关系

举例:下面是LAB2,关于public class ConcreteEdgesGraph<L>的AF

    // Abstraction function:
    /*
     * edges为边 vertice为点
     * AF为这两种数据类型到有向图的映射
     */

RI

RI全称是:Representation invariant(表示不变量),用来表示“什么样的类满足抽象”

以上图为例,“abbc”就是不满足RI的元素,一个满足这个图的RI就是“不可以有重复的字母”

也可将RI看作:所有表示值的一个子集,包含了所有合法的表示值

也可将RI看作:一个条件,描述了什么是“合法”的表示值

例子,

    // Representation invariant:
    // edge必须有起始点,且weight为正数
    //vertice必须在vertices的Set中
    //每两个vertice之间最多一条edge

随时检查RI是否满足:
    自写checkRep()方法,在创造和改变表示的方法中(creators,producers, mutators),进行调用。 

Safety from rep exposure

防止表示泄露的方法

可变类 中getter到的变量可以直接对其修改,而且类中变量指向的地址的内容会被修改,这就会导致表示泄露,应对此情况的方法是,getter得到的不应该是类中的变量,而是类中变量的一个副本,这也就是常说的防御式拷贝

通常有以下几种方法:

  1. 用private和final关键字对其进行修改:------即将类中所有的属性(变量)定义为private类型,目的是不让用户得到你的内部属性
  2. 尽量使用immutable数据类型,比如能使用String就不使用StringBuilder,能使用Instance或
    LocalDateTime就不使用Data
  3. 例子:
    // Safety from rep exposure:
    // vertices和 edges均为 private final
    //分别使用对应的get方法返回值的副本,防御性编程

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值