面向对象第三单元

JML理论基础及应用工具链

理论基础

JML,Java 建模语言,可以规范 java 类和接口的设计。JML是一种行为接口语言,也就是说,其规范了java代码的行为和语义接口。java 类和接口的语义规范包括其方法签名,名字和域的类型等。这通常指的是 API 。java 类和接口的行为接口描述了编程者使用这个 API 的方式。就行为来说,JML 可以对方法的前置条件与后置条件细化,以及类的不变式等。这属于契约编程。

工具链

最基本的工具是 parsing 和 typechecking,这由 jml (developed at Iowa State University) 实现。

Runtime assertion checking,这样的运行时检查由JML编译器 jmlc 实现。

Static checking and verification,包括 ESC, LOOP, JACK 等一些工具。

Generating specifications,包括 Daikon, Houdini, jmlspec tool,可以帮助编写 JML 规范。

Documentation,jml-doc, 可以产生保护API和规范的 HTML 网页。

Unit Testing, jmlunit,可以根据 JML规范生成相应的单元测试。

JMLUnitNG

下面选取几个生成的测试函数。

可以看到,其主要是测试空对象,异常条件,以及边界数据。

架构设计

上图清晰地反映了自己的架构思路。每一次作业都是通过继承上一次作业实现的类并实现本次作业所需的接口完成。

bug和修复

第一次作业:

bug:自己实现整数列表的compareTo方法时直接将两个整数作差,没有考虑溢出。

fix:使用Integer.compareTo()方法。

lesson:不要重复造轮子;当涉及算术运算时,必须考虑溢出这个常见的bug。

第二次作业:

bug1:两个相同的点一定相连,其不一定有边连接。

fix1:对于特殊情况特殊判断。

lesson1:需要考虑清楚特殊情况,注意积累特殊情况。这次的特殊情况是点不存在、点相同无自环、点相同且有自环连接。(需要看清楚需求)

bug2:自己的floyd算法实现不够高效,使用了哈希查询,使得时间超出。

fix2:改用数组查询。

lesson2:虽然都是常数查询,但由于查询操作量很大,致使常数因子发挥了重要影响。自己以后需要考虑在哪些情况下需要考虑算法常数因子的影响。

第三次作业:

bug1:当某条边属于多个路径时无法正确处理。

fix1:对每条边维护一个路径集合。

lesson1:自己不应事先对图做出任何假设,即要考虑任意情况,测试时也是如此。

bug2:对floyd算法理解不够,导致自己没有意识到在查询边权时若换乘则修改的实现对于floyd算法并不可行,破坏了迭代条件。

fix2:使用dijkstra算法。

lesson2:对于某个算法应理解其原理,在条件变化后不应想当然地认为依然成立,而应证明。

规格撰写和理解的心得体会

对于一个编程任务,编写过程并不是最重要的,也不是最花时间的。其中设计是很重要的。通过契约编程的思想,将设计由自然语言变为JML规格,使得其更为清晰,并且可以由工具来检查规格与实现的不一致。这样进一步分离了设计与实现。

JML规格通过谓词逻辑与java自带的保证正确性的函数来描述自己程序的行为,从效果入手,这给了与实现者不一样的视角,有助于更好的理解自己的程序,写出bug少的程序。

原文地址:https://www.cnblogs.com/yorkyer/p/10907827.html

时间: 2024-11-02 23:03:48

面向对象第三单元的相关文章

面向对象第三单元博客(JML)

// demo/Graph.java package demo; ? import java.util.ArrayList; ? public class Demo { /*@ public normal_behaviour @ ensures \result == lhs - rhs; */ public static int compare(int i, int j) { return i - j; } ? public static void main(String[] args) { c

面向对象第三单元(JML)总结体会

一.JML语言 定义 Java建模语言(JML)是一种行为接口规范语言,可用于指定Java模块的行为 .它结合了Eiffel的契约方法设计 和Larch 系列接口规范语言的基于模型的规范方法 . 理论基础 JML是契约式语言的一种具体表现形式. 契约(Contact):声明一个函数/方法的时候,对函数的输入和输出所具备的性质是有所期望和规定的.有时候这种性质会被我们明确的写出来,有时候会被我们忽略掉.这些期望和规定就是Contract. 而契约设计的核心便是断言(assertion) :永远为真

面向对象第三单元总结

一.JML语言理论基础 1.1 JML语言理论基础 JML(Java Modeling Language)是用于对Java程序进行规格化设计的一种表示语言.JML是一种行为接口规格语言,基于Larch方法构建.BISL提供了对方法和类型的规格定义手段.所谓接口即一个方法或类型外部可见的内容.JML主要由Leavens教授在Larch上的工作,并融入了Betrand Meyer, John Guttag等人关于Design by Contract的研究成果.近年来,JML持续受到关注,为严格的程序

第三单元JML规格总结

第三单元学习了JML规格描述语言,根据JML的规定编写对应的方法,同时也复习了数据结构的知识,并且也考察了程序的时间复杂度. 一.JML语言 理论基础 JML全名为Java Modeling Language(Java建模语言),在Java代码中增加一些不影响程序正常编译运行的符号用来标识一个方法是干什么的.通过使用JML,程序员能够描述一个方法的预期的功能而不管具体实现方式.JML把过程性的思考延迟到方法设计中,从而遵循了面向对象设计的一个原则即将过程性的思考尽可能地推迟.而且JML语言为了描

规格化设计——OO第三单元总结

规格化设计--OO第三单元总结 一.JML语言理论基础.应用工具链 1.1 JML语言 ? JML(java modeling language)是一种描述代码行为的语言,包括前置条件.副作用等等.JML是一种行为接口规格语言 (Behavior Interface Speci?cation Language,BISL),基于Larch方法构建. ? 通过使用JML,我们可以忽略一个类.一个方法内部的具体实现,专注于描述方法的预期功能,从而把过程性的思考延迟到方法设计中,扩展了面向对象设计的原则

面向对象的三个特征。

引用文章:http://blog.csdn.net/ma1kong/article/details/4457044 引用介绍:一篇偏向JAVA的文章.对此,我删除了一些文字,保持对C++适用. 面向对象的三个特性:封装,继承,多态. 特定的作用:封装可以隐藏实现细节,使得代码模块化:继承可以扩展已存在的代码模块(类):都属于代码重用.多态则是为了实现接口重用.多态是为了类在继承和派生的时候,保证使用“家谱”中任一类的实例的某一属性时的正确调用(个人理解:实际就是虚函数的作用). 一.封装 1:封

面向对象的三个特性:封装

面向对象的三个特性:封装.继承.多态 //1.封装目的:让类更加安全,不让外界直接访问类的成员 //具体做法[1]将成员设为私有:访问修饰符 class ren { [var $age;] private $age; } $r=new ren(); echo $r->age;//访问不到 [2]造成员方法来操作变量 class ren { private $age; //制造方法去给变量$age赋值 public function SetAge($a) { if($a>18 and $a<

01 面向对象的三条主线

面向对象的三条主线: 1.类及类的成分 2.面向对象的三大特性 3.其他的关键字:this super import package abstract static final interface等 1.java程序是关注于类的设计.类从代码的角度:并列关系!   从执行.设计的角度:关联关系.继承关系.聚合关系 class A{ } class B{ A  a = new A(); } 2.类的成分:属性   方法  构造器  代码块  内部类 2.1 属性:①变量的分类:成员变量(属性 Fi

荒芜的周六-PHP之面向对象(三)

hi 又是开森的周六了.积攒的两周的衣服,终于是差不多洗完了.大下午的才来学点东西~~ 1.PHP面向对象(三) 四.OOP的高级实践 4.3 Static-静态成员 <?phpdate_default_timezone_set("PRC");/** * 1. 类的定义以class关键字开始,后面跟着这个类的名称.类的名称命名通常每个单词的第一个字母大写. * 2. 定义类的属性 * 3. 定义类的方法 * 4. 实例化类的对象 * 5. 使用对象的属性和方法 */ class