一切都要结束了,砥砺前行~ 一.测试与正确性论证的效果差异 测试,顾名思义就是我们暴力用大量数据轰炸编写的程序的过程.日常的OO过程中,我们经常互相寻求“测试集”,正是因为测试使用特定数据对我们的功能进行针对性测试,好处在于可以很直观很明显的找到bug所在,并且复现性也很强.但是偏向于穷举,也就是我们平常对于自己的数据集过小,而担心自己有没有完全覆盖所有的可能,即使自己测试的过程中没有发现问题,也心里惴惴不安,从而寻求更大测试集.这种方式便于实现与分析,但是不能完全验证程序正确性. 测试则需要通…
OO第三次博客作业——规格 一.调研结果: 规格的历史: 引自博文链接:http://blog.sina.com.cn/s/blog_473d5bba010001x9.html 传统科学的特点是发现世界,而软件的特点是构造世界.软件的最底层就是0,1,两个离散的值. 程序设计语言的三次分离使软件技术产生了飞跃 1950年代,第一次分离,主程序和子程序的分离程序结构模型是树状模型,子程序可先于主程序编写.通过使用库函数来简化编程,实现最初的代码重用.产生基本的软件开发过程:分析—设计—编码—测试,…
OO第三次博客作业 1. 规格化设计的发展 我认为,规格化设计主要源自于软件设计的两次危机.第一次是由于大量存在的goto语句,让当时被广泛应用的面向过程式的编程语言臃肿不堪,在逻辑性上与工程规模上鱼与熊掌不可兼得.故而,人们提出了结构化程序设计的编程思想,旨在使程序实现结构化设计的思想.这种设计思想旨在控制各个模块的程序复杂度,从而保证整体工程的正确性. 然而,由于硬件设备的快速迭代,对于软件的要求也越来越高.工程的日益庞大.面向过程程序的可扩展性差.可维护性有限,使得人们提出了面型对象程序编…
转眼间第三次作业了,似乎需要说点啥,那就说点. 规格&工业 说到这个,不得不提一下软件开发的发展史. 历史的进程 早在上世纪50年代,就已经有早期的编程语言出现,也开始有一些程序编写者出现(多为资深电子工程师,和半路出家的数学家). 然而那个时代,软件开发基本局限于自己或自己部门内部的使用,需求并没有很多,也并不复杂(或者说人们并没有意识到有那么多事情可以通过软件解决).所以基本都是靠早期的程序猿们的自由开发,也并没有现代代码规范的概念. 然而等到了60到70年代,随着硬件技术和工业界思想的进步…
一.JML语言理论基础及其工具链 1. JML语言理论基础 JML是用于对Java程序进行规格化设计的一种表示语言,是一种行为接口规格语言(Behavior Interface Specification Language,BISL),基于Larch方法构建.BISL提供了对方法和类型的规格定义手段.所谓接口即一个方法或类型外部可见的内容.JML主要由Leavens教授在Larch上的工作,并融入了BetrandMeyer, John Guttag等人关于Design by Contract的研…
一.JML理论基础及相关工具链 1.JML理论基础 该部分梳理本单元作业中涉及到的JML知识. 1.1注释结构 JML采用javadoc注释的方式来表示规格,且每行以@开头.通过使用//@annotation来进行行注释,使用/*@annotaion@*/来进行块注释. 1.2JML表达式 1.2.1原子表达式 \result表达式,在方法规格中使用,通过\result来指代返回值.在谓词中使用\result,来表达放回值的限制条件. \old(expr)表达式,返回表达式expr在方法执行之前…
一.规格化的发展历史 最早的程序设计都是面向机器,从一开始使用的机器语言,到后面的汇编语言,都是面向机器的语言,编写困难也容易出错.随着需求的发展,程序的编写从面向机器走向面向过程,但由于goto语句导致的面条式代码,极大的限制了程序的规模,“软件危机”产生,程序设计的思想又经历了几次革命,“结构化程序设计”作为解决软件危机的方案被提出来了,这个概念通过“自顶向下.逐步细化.模块化”的方法降低程序的复杂度,但需求永远发展的更快,又产生了第二次软件危机,这次软件危机主要体现在可扩展性和可维护性上面…
当熬过了一次次黑暗,迎接我们的却是被扣的惨不忍睹的JSF ┭┮﹏┭┮ 一.总结调研 规格的历史 传统科学的特点是发现世界,而软件的特点是构造世界.软件的最底层就是0,1,两个离散的值.程序设计语言的三次分离使软件技术产生了飞跃. 程序设计的演变大致可以分成以下三个过程: 1. 20世纪60年代以前,计算机刚刚投入实际使用,软件设计往往只是为了一个特定的应用而在指定的计算机上设计和编制,采用密切依赖于计算机的机器代码或汇编语言,软件的规模比较小,很少使用系统化的开发方式,此时的代码更多的是私人性质…
这三周的作业主要是围绕以JML来约束代码开发,以确保程序的正确性与鲁棒性. Part 1:三次作业的实现与bug 第一次作业没有任何算法和数据结构上的难度,对于Path和PathContainer的各个方法的实现按照给出的规格复读即可.唯一的难点(大约也不算难点)便是将NodeId进行映射,用hashmap就好,不过注意不要做一个调包侠,hashmap中有的方法譬如遍历很慢,虽然看上去只差常数,但是这个常数巨大,如果在第一次作业中不加处理就会在第二次作业中TLE. 第一次作业也让我们了解了抛异常…
不得不说的JSF 经过前几次作业的煎熬.出租车的代码量不断地增多.而出租车问题在不断的完善,这也就牵涉到一个问题,那就是最初出租车程序的设计问题,如果一开始设计的就有问题的话,那么在后来的过程中就会遇到更多的麻烦.就像微软不断的给自己的系统打补丁一样.但是如果某一天他发现系统有一个关键性的设计错误.虽然这种几率较小,但是一旦发生,将会带来巨大的灾难,https://baike.baidu.com/item/%E5%8D%83%E5%B9%B4%E8%99%AB/2954?fr=aladdin.2…