软件构造 Chapter5 Review

        第五章主要介绍了规约(specification)的概念、基本结构以及规约强度的比较和行为等价性。博客写的不咋地哈,不过要是相当个故事看看也是挺有意思的,还有就是如果你想复习马原也可以看看,里面会有很多原理的。

1.规约

 1.1 规约的概念及意义

        规约是写在函数(方法)前的注释,主要确定了一个方法输入的合法范围及在该合法范围内方法的行为,并且对该方法的适用范围和功能进行一定的描述。

        规约给“供需双方”都确定了责任,在调用的时候双方都要遵守,使得程序与客户端之间达成的一致。

        上述bb了那么多其实就是为了凑字,说白了,规约就是一段写在代码中的注释,为了告诉你这个函数需要什么样的输入,给合法的输入函数会输出什么,也就是简单的介绍下函数的功能。

        基本功能说是为了明确责任,其实就是为了出了事之后怎么甩锅,把规约写明白了就是为了在出事的时候锅别落到自己头上,综上所述,规约是每个程序员的生存之道与晋升之路,写好规约是每个程序员的必修课(软件构造课上要是这么讲保证人人规约写得比高考作文还好)。

1.2 规约的基本结构

        下图是PPT中的例子,本节将以这个例子讲解规约的结构

        在Java中写规约其实没有那么痛苦,因为键盘一敲规约结构就出来了(不像Python),可以看到,代码中的规约主要是三部分,第一部分就简单说说这个函数是干嘛的,有时候跟return是有重叠的;第二部分为@param开头的部分,主要说明输入的参数需要遵循什么规则,你要硬是不遵循那就后果自负;第三部分为@return开头的部分,主要说明在输入参数合法的情况下输出会是什么;不过一般规约还可能有@throws开头的部分,这部分主要说明输入不合法会抛出什么异常,第三部分是输入合法时程序输出,这部分就是输入不合法时程序的输出。

        实际写代码时按照上面说的写规约就可以,但是形式主义作为某位大我们几旬的老教师的一大美德还是要发扬一下的,下面开始说一些比较官方的定义:

        规约分为两大部分:前置条件和后置条件。前置条件是对client的限制,主要规定输入的合法范围和函数的应用场景,上述例子中就是@param中写的内容,但注意到,前置条件不一定全都写在@param部分,在最开始简要介绍函数功能的时候也可能会有前置条件,所以说读规约一定要全面;后置条件就是对开发者的限制,说白了就是client给的输入会得到什么样的输出,后置条件对应于上述例子中的@return和@throws两部分,分别是合法输入的输出和非法输入的输出。

        前置条件和后置条件的关系:输入满足前置条件,输出必须满足后置条件;输入不满足前置条件,输出随意(free to do anything),但出于对智障儿童的关怀,我们最好采用failing fast策略,让程序尽快崩溃,这样可以使得写bug的聪明人快速发现bug的位置,不至于由于bug发生的太久远而找不到。

        tips:

                ①规约不应涉及方法内部的实现方法,不应涉及局部变量及算法

                ②规约的目的是让用ADT的人看明白你在干什么,要写明白参数和输出的含义,不要

        只把一个数据类型扔上去

1.3 规约的强弱

        规约的强弱是指规约对开发者限制程度的大小。所以说前置条件越弱,后置条件越强,那么规约就越强。如果这么说不太理解的话,再直白一点就是,你写代码时候越想问候这个客户的祖宗十八代,那么就说明这个规约越强。

        举个PPT上的例子增强理解:

规约1:

规约2:

规约3:

        这个函数的干啥的你用不着知道,只需要看规约。

        首先看规约1和归约2,前置条件中,规约1说需要正正好好出现一次;规约2说只需要出现一次,显然对于客户来说,规约2前置条件限制的更少,客户更开心,相应地,因为前置条件放松那么程序考虑的情况变多了,程序员就要骂娘了,所以说第二个规约更强一些。

        然后再看规约1和归约3,前置条件中,规约3跟规约2一样,也是更弱了,程序员已经在骂娘蓄力了;再看后置条件,规约3返回值又增加个需要返回个最小的下标,后置条件变强了,程序员发挥的空间又被压缩了,这时候程序员应该已经开始骂娘了,所以说规约3是一个更强的规约。

        不过注意到:如果前置条件更弱、后置条件更弱或者前置条件更强、后置条件更强,这两种情况是无法比较规约的强弱的,因为要以时间地点条件为转移,你需要辩证地看待,有人可能已经开始骂娘了,有人可能觉得还不错。规约的强弱有时候跟现实生活还是有一定联系的,就比如某位大我们几旬的老教师课教的不咋地,但上课不点名,翘课你随意。这样有些学生就觉得这位大我们几旬的老教师很好,而有些学生就开始骂娘了,但谁都没法说自己的判断是绝对客观的,因为前置条件和后置条件都弱了。

2. 行为等价性

        行为等价性可能不那么顾名思义,因为这里的行为指的不光是程序的行为,而是程序相对于规约的行为,只要相对于规约的行为相同,就可以说这两个程序具有行为等价性。

        说了这么半天你可能会说:“啥玩意,烂糟的”,下面我们举个例子来看看:

        这两个函数我要说他俩等价,那估计评论区就要炸(当然实际上也不会炸,因为也没几个人看),可以明显看到这两个函数一个找到的是最开头的,一个找到的是最结尾的,单从程序的行为上看肯定是不完全相同的,不过也是有点相同部分的哈。

        我们看下面的规约:

        这个规约明确说明输入的数组中正好出现一次val,那么对于这个规约而言,上述两个函数就应该是等价的,这就叫做行为等价性。

        从马克思主义哲学的角度上来看,真理和谬误的辩证关系是我们理解行为等价性的哲学基础,真理和谬误是对立统一的,其对立性表现在:在一定范围内,真理就是真理,谬误就是谬误,二者不能相互混淆。其统一性表现在:真理和谬误在一定条件下是可以相互转化的,如果将谬误放在其适用的条件下,谬误也可以转化为真理。在本例中,两个函数的等价性在程序行为意义上的成立的,但其在规约行为的意义下却是成立的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值