嘛。。不知不觉这门课程要结束了,那么就再说点啥以示庆祝呗。
说到这个,相比很多人对此其实很有疑惑,请让我慢慢分析。
首先我们来看看两种方式各自的做法和流程是什么样的:
在测试中,我们是这样的一个流程
此外,为了保证测试能覆盖到工程代码的每一个区域,需要保证测试的覆盖率。
在证明中,我们是这样的一个流程
在这一过程中
repOk
永真性证明依赖于JSF中的modifies
项effects
和requires
项基于以上的逻辑,我们不难发现一个细节:
或者更具体地说,这里多出了一个名为假定的字眼。
这是什么原因的?其实说来也非常简单——因为测试,只能证明程序有错,而不能证明程序是对的。
虽然有大数定律的理论支撑(即只要测试集数量无限大,则必定可以覆盖一切情况),可是实际上并不存在无限大的测试集,故测试上的死角总还是会存在的。
设一个有限集 $ T $ ,为测试集(单元测试中的测试集不可能做到无穷),而 $ S $为全集。然而,在实际情况下,可能遇到的情况常常是无穷多的,故 $ S $ 是一个无穷集。
故,$ \complement^{S}{T} $ 即为测试集没有覆盖到的地方。又 $ T $ 有穷, $ S $ 无穷,故 $ T \subset S $ 恒成立,$ \complement^{S}{T} \neq \emptyset $
故永远有覆盖不到的数据,且对于这部分无法覆盖到的区域,是无法仅依靠测试来证明正确性的。
故基于测试的正确性验证的严谨性问题是不可避免的。若要严格意义上地论证正确性,基于程序逻辑的正确性证明是唯一的选择。
在上面的分析中,我们论证了单元测试方法存在的硬伤。
然而,我们为啥还要保留这样的方法呢?
因为,实际问题与应用大都不是一元线性的,而是时间、经济、人力等多方面成本以及多方面效益指标所构成的高维量。
其实,在工业界各类应用中,常常有以下两种模式可以长久而稳定的存在:
实际上,不仅在计算机行业,在其他工业界乃至于商业中,也常常会形成这样两种模式并存的局面。
而反映在软件质量保证领域,则分别是基于程序设计逻辑的正确性证明(正确性从原理层面上就有绝对的保障,可是成本嘛,各位都写过一次论证,体验过其成本之高昂)和面向数据期望的单元测试(操作非常简便,方便大范围部署,且能覆盖绝大部分实际情况)。
所以,在实际应用中
说到底,这两者其实很难去严格区分一个优劣。很多问题,根本上还是一句话——具体问题具体分析,适合的就是对的。
OCL,英文全称object constraint language
,翻译过来就是对象约束语言。
顾名思义,其作用在于对设计的对象进行约束,且保证不存在二义性。且实际上,OCL和UML(统一建模语言,Unified Modeling Language
)捆绑使用。
从以上的一些基本概述中,我们不难发现OCL实际上和JSF有着相似之处:
然而进一步研究与分析,其区别也是很大的:
而至于具体应用呢,则还是老规矩——适合的就是最好的。在不同的工程项目,不同的场合下,自然会有不同的选择。
首先,我们来回顾下我们这学期四章的各个标题:
其实这很明显,是一个循序渐进的过程,体现在两个不同的层面上:
实际上,笔者在多年前,就已经接触并使用了面向对象程序设计语言。
所以,实际上在这个学期,笔者的主要收获如下:
关于工程化呢,其实说难也难,说简单也简单得很。
一些具体的好处呢,笔者在前三次博客作业中均有不同程度的论述(此处不再赘述):
不过说到底呢,其实就几件事:
关于这个问题,笔者在两三个月前,就已经开始思考了。
众所周知,面向对象课程的槽点还是不算少的。
不过,据笔者看,这些问题看似庞杂,但是只要仔细去理一理背后的逻辑关系,其实也很简单。
笔者根据自身了解的一些事实,和大半个学期以来的观察与分析,粗略的得到了下面的这张逻辑图:
不过这样一来,看似错综复杂的事情也就清楚了。
稍加观察,便可以发现问题的根源——没有一个相对公平合理的横向比较机制。(稍微了解拓扑排序的概念,便可以得出这样的结论,找到节点的上游)
其实,很多同学(包括16级的和以前的学长学姐们)之前所吐槽过的问题,根源都在这边。
假如,我们有一个很靠谱的自动化横向比较机制
实际上,想做出改变,也并不难,比如:
Special Judge
和提交答案题里面的部分分机制相结合,让程序只要不违背基本法(例如电梯不准瞬移不准分身)就能有分数,且各个水准的程序得分有梯度。codeforces
那样的多对多大混战hack模式(也可以考虑待测程序不匿名,从此不再有无效作业的坑),保证互测的运气成分降到最低。当然以上只是一些初步构想,笔者对于这个(自认为)靠谱的新制度,已经有了更深层次的计划和构想,更具体的计划等细节将在另一篇文章中详细阐述。
笔者写到这里之前,看过之前不少同学的一些思考与建tu议cao。
不得不说,虽然大部分的所谓分析完全流于表面,透过现象看本质的几乎没有(截至2018.6.25 6点整),但是,大家反映的问题,也很真实,或者说很真实地描绘了大众水平同学眼中的面向对象课程。
说这个,其实不是想吐槽各位(实际上,笔者更希望大家能继续描述内心的真实体验)。
引用笔者之前说过不止一遍的一句话
没法带来丝毫改变,甚至只会让事情更坏的怒火,是毫无意义的。
所以呢,希望接下来看到笔者文章的各位,能在吐槽的基础上和自身能力所及的情况下,进行更深入的思考,可以的话也多想想到底如何才能让事情变得更好,而不是一味地抱怨与泄私愤。
抱怨没有用,实干才能解决问题。