对于LAB2的收获

本文探讨了在软件构造实验中,通过先写接口再实现类的方式带来的好处,强调了逻辑清晰、代码扩展性和维护性。作者阐述了RI(表示不变性)和AF(抽象函数)的概念,并解释了它们在防止表示泄露和确保ADT正确使用中的作用。此外,还提到了RI和AF在代码文档中的重要性,以及如何检查和维护RI的始终为真。
摘要由CSDN通过智能技术生成

最近完成了软件构造的第二次实验,相比于第一次实验,对于Java的使用,则有了更多的理解,在这次实验中,设计了关于graph的ADT,让我对类的设计有了更多的理解。

一、先写接口再写实现类

在这个实验中,对于图来说,有许多的方法,添加点,添加边,删除点及其对应的边,得到顶点集,给定源点或目标点,得到与之连接的点及其权重等方法,如果按照我之前的写程序的思维,应该就是直接实现这些方法,而实验中给的框架则是先写了一个接口,然后去实现接口里的各个方法,这样是有许多好处的。逻辑清晰,代码易懂,方便扩展,可维护性强。在设计模式的OCP,就是要使用接口来实现对扩展开放,对修改关闭。这样也是为了减少各个类之间的依赖。也可以对客户端进行一些隐藏,在进行变量声明时,可以使用更加抽象的接口名称来声明。

二、撰写RI,AF

在实验二中,老师要求我们开始对于每个新设计的ADT,都写出相应的RI,AF。一开始不是很理解,觉得没什么必要,不过经过了实现二的完成以及两次习题课、实验三的着手准备,让我对于写RI,AF有了更深的理解,也逐渐在养成写他们的习惯。

RI(Representation Invarience):表示不变性

ADT的表示不变性,要求客户在使用ADT时无需考虑ADT的内部实现,只需要根据ADT的规约进行使用即可。即ADT的内部实现变化不应该影响用户在客户端的使用。表示不变性的关键在于将数据结构的使用和数据结构自身的形式分离。防止因为用户在使用过程中假设ADT内部的实现,在假设的基础上形成依赖。

而我们要时刻牢记RI的原因就是我们要防止表示泄露。

表示泄露(Representation Exposure):

表示泄露形容了一种类外部的代码可以直接修改类内部存储的数据的现象。通常是类外代码直接对类内的可变类型对象进行直接修改,导致了引用别名现象,这种引用方式会导致我们对同一块内存进行多次引用,导致程序运行过程中的不确定性,恶意代码也可以十分简单的对ADT进行攻击,严重影响ADT的表示独立性和不变量。

AF(Abstract Function):抽象函数

了解AF之前,我们先了解抽象空间和表示空间。

表示值构成的空间R(表示空间):实现者看到和使用的值。
抽象值构成的空间A(抽象空间):client看到和使用的值。

ADT开发者关注表示空间R,client则更关注抽象空间A。

这时我们就可以给出AF的定义:AF即是描述从R到A的映射关系的函数,即如何将表示空间中的一个值解释为抽象空间中的一个值。AF通常是满足以下关系的一个映射:

AF是一个满射,即用户所看到或使用的任意一个值都是由一个表示值映射而来的。
AF未必是一个单射,即用户户所看到或使用的任意一个值可能由不止一个表示值映射而来。
AF未必是一个双射,即开发人员所面对的表示值中,会存在不满足前置条件的表示值,对于这类表示值不存在对于的抽象值。

RI告诉了我们表示空间R中的值是否能被映射到抽象空间A中,也可以认为RI构成了表示空间R的一个子集,该子集中的值能够被映射到抽象空间A中它也是一个条件,告诉我们什么表示值是合法的。

RI和AF都应该记录在代码中,在rep的声明之下。首先选择某种特定的表示方式R,进而指出合法的子集(RI),并为该子集中的每个值做出“解释(AF),写出映射关系。

一个好的spec、RI和AF会时刻提醒我们这个ADT是在干什么,这个rep,它有什么作用,给我们提供指导与约束。

除此之外,我们还要时刻检查RI是否满足,即每个不变量是否是时刻保持着true。我们应该在所有可能改变rep的方法中检查,另写一个checkRep方法,在返回之前调用这个方法进行检查。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值