前言
这次软构课是第一次线下上课,王老师讲课的课堂效果很好,是一位优秀的老师。前半节课我们讲授了规约剩下的一部分知识,后半节课我们讲授了ADT设计的一些内容。
一、再谈规约设计
我们注意到在设计API时,只靠程序员的良心是没有办法保证程序的安全性的,所以我们考虑使用不可变数据类型(即imutable的类型)来作为返回值,这样能够有效地解耦,达到客户端与开发者相分离,提高了程序的安全性。我想到了类似Python中的元组类型,这种情况可能也是为了保持程序的安全性。
在设计规约的时候,我们需要注意到,我们不能假设其内部实现,比如如下的情况:
我们不能假设他需要返回的就是第一个在数组里出现的val的值,而应该进行全面地分析。上图位于下方的测试就是比较完整的测试样例。
设计规约时我们有下面三个需要注意的地方,即:
其中我们着重看一下规约的强度,这种不同条件之间的强度的判断在数理逻辑课程中可能有更完善的讲解。下面是我们在软构中对其的判断方法:
简单来说就是前置条件更弱,后置条件更强,我们就可以说这整个规约更强,就可以使用新的规约替代原来的规约。注意,我们在判断后置条件的时候需要在同一个前置条件下比较。见下例:
比如第二个与第一个相比,其前置条件显然更弱一些,根据我们所述的规则,其整个规约显然更强一些。所以我们在设计的时候可以使用第二个来替换第一个,第三个也可以同理分析。
需要注意一下有时后置条件的变化到与原来的后置条件无法直接相比,这种情况下我们可以认为两个规约是独立的了。如下图:
两个后置条件没法直接比较,各有特点。
然后又介绍了图表示的规约,和韦恩图挺像的。
我们在设计规约的时候一定要注意到两方面的兼顾,即使用者用着放心我们写着快乐。
二、ADT
ADT(中文名为抽象数据类型)我们以前已经见过了,其实就是数据结构+算法。注意到具有同一组操作方法的数据结构就可以看做是ADT。比如List接口可以有ArrayList与LinkedList这两个具体实现。
方法大致有四种不同的类型:
总结
上述就是今天的大致内容,我很喜欢Java语言,今天还看了一些关于Java的流(书上这样说,但是根据数据库相关的知识我感觉应该翻译为过滤器)的知识,有机会也可以分享一下。