jml

守得云开见月明——OO第三单元总结

烈酒焚心 提交于 2020-08-09 08:14:24
OO Unit3 总结 博客作业 18373806 冯天昱 历时五周(中途暂停了一周),OO第三单元——JML和规格的学习告一段落。 与前两个单元完全不同的是,这一单元的设计是基于非常完整的规格实现的,这导致了: ①更容易保证实现的正确性:可以使用JUnit单元测试对实现进行完整地测试,可以通过对照规格和实现快速检查和发现代码中的BUG; ②整体架构的设计能力被弱化:课程组给出的三个接口和规格十分详尽,相当于帮助我们确定了程序架构的整体框架,代码的编写只需要小体量的结构设计和保证每个指定功能的实现与预期一致就可以了。 下面对本单元的三次作业进行总结。 一、JML及其工具链 1. JML JML (Java Modeling Language)是一种行为接口规格语言,定义了Java程序中的方法规格和类型规格。结合JML工具链,我们可以自动构造基于规格的测试用例、通过形式化验证检查规格的实现,以更加严格的手段确保程序实现符合预期。 JML以javadoc注释的形式嵌入Java代码中,以 @ 开头。 JML的学习主要从以下两个方面入手: JML表达式 JML中有许多表达式,其中有 \result 、 \old() 、 \not_assigned 等具有特定含义的原子表达式、 \forall 、 \exists 、 \sum 等对一组数据进行量化的量化表达式

学不会OO的第四单元反思

大兔子大兔子 提交于 2020-08-08 07:25:01
辛苦了!!!!!!!!!!!!!!!!!! 尽管我水平还是很菜quq但是经过这一学期的“爬山”,还是有一定的收获,正如J哥所说 那么开始最后一次博客作业的总结!!! (1)总结本单元三次作业的架构设计   这三次作业的架构设计总体来说还是比较套路话的。我的思路是每一种图存放到一个类中,图用HashMap<id, elements>(大概意思,不是实际代码)来进行存放处理。   主要设计的有id2name, name2id, parent等等存放关系的HashMap,在查询的时候以id为准,通过parent实现对父类等等的查询,通过id2name来输出对应的name 第一次作业我设计了MyClassDiagram类,这个类处理类图的相关信息;在第二次作业中,我设计了两个类分别存储顺序图和状态图;在第三次作业中,通过引入新类来进行有效性检查。 最终文件树大概是这个样子的   (2)总结自己在四个单元中架构设计及OO方法理解的演进   在架构设计中,我从前期的几乎全部面向过程的思维,到UML单元主动的设计多个类来进行UML图的处理。在电梯单元,从一开始的混在一起,到最后一次的有意识的拆分。同时也让我意识到,OO的类的设计不是单纯的拆分,而是具有一定的逻辑组织的。   经过这学期的学习,我是这样理解OO的:通过对相关的属性及相对应的操作进行封装,成为对象

OO第四单元总结与课程总结

时光怂恿深爱的人放手 提交于 2020-08-07 04:25:21
OO第四单元总结与课程总结 本单元三次作业的架构设计 第一次作业 第一次作业是只有类图,类图包含很多的UmlElement,于是我综合考虑了设计的可扩展性,采用了按照Uml模型的各种模型元素作为类来架构设计。我创建了一个顶层类 MyUmlElement ,然后创建了 MyUmlClass MyUmlInterface MyUmlOperation 来继承这个 MyUmlElement ,我为什么只选了这三个类呢,因为只有这三个类在开源代码的基础上还需要存储更多的信息,例如 MyUmlClass 里面需要存 MyUmlOperation UmlAttribute 等信息,这里就不再赘述,具体看我的Uml类图 实现思路 先在 UmlInteraction 类里面解析UML图,这里解析的过程为遍历 Elements 数组,注意一定要先 存好类和接口 ,只有这样之后存相应的 Operation 和 Attribute 才好存。 为了使得检索更加高效,减少遍历带来的无谓的时间消耗,我在所有需要索引的地方都采用了Map的存储容器形式 存储好已经查询到的一些数据,例如类实现的全部接口,类的顶层父类,类的所有属性的数量等等,因为这些都是不会变的,所以进行缓存以便将来重复查询是可以避免不必要的工作 算法方面我在能采用BFS的地方就用的BFS,第一BFS容错率更高,可以避免像DFS有爆栈的风险。

OO 第四单元总结

时光总嘲笑我的痴心妄想 提交于 2020-08-06 14:52:10
OO 第四单元总结 目录 OO 第四单元总结 本单元三次作业的架构设计 第一次作业 第二次作业 第三次作业 四个单元中架构设计及 OO 方法理解的演进 第一单元 第二单元 第三单元 第四单元 总结 四个单元中测试理解与实践的演进 第一单元 第二单元 第三单元 第四单元 总结 课程收获 Java 编程 OO 思想 架构 测试 分析 正则表达式 JML 规格 JUnit 单元测试 多线程 三个具体改进建议 线上学习 OO 课程的体会 总结 本单元三次作业的架构设计 第一次作业 实际上本单元三次作业,做的是信息查询的工作。 .mdj 文件是用 JSON 格式表示的 UML 图,通过官方给的转换器转换成 JSON 文件。每个 JSON 文件一个节点,可以在 AppRunner 中解析回原来的对象。整个是一个序列化与反序列化的过程,但 UML 图的各种关系需要被重建。 由于操作以查询为主且 UML 图各种元素的关系比较清晰,使用分类的方式进行重建, UmlClass 、 UmlOperation 、 UmlParameter 等类的对象按照单独的类处理,每个类有它的管理器来管理。顶层的 MyInteraction 负责从各种管理器中得到相应的数据,并进行查询和判断。管理器中普遍使用了记忆化,确保只遍历一遍 elements 就能记住所有需要记住的关系。 具体存储对应关系是以 Map 为主

OO第三单元总结

穿精又带淫゛_ 提交于 2020-08-05 20:50:04
一.JML理论基础及应用工具链 1.理论基础 原子表达式 \result :表示一个非void的方法执行后的返回值。 \old(expr) :表示一个表达式expr在执行相应方法前的取值 \not_assigned(x, y, ...) :表示括号内的变量在方法执行过程中是否被赋值。没有被赋值则返回true;否则返回false \not_modified(x, y, ...) :类似not_assigned,区别是表示变量取值是否变化 \type(type) :返回类型type对应的Class 量化表达式 \forall :全称量词修饰的表达式,表示对于给定范围内的元素,每个元素都满足相应约束 \exists :存在量词修饰的表达式,表达对于给定范围内的元素,存在某个元素满足相应的约束 \sum :返回给定范围内的表达式的和 \max 和 min :分别返回给定范围内表达式的最大和最小值 方法规格 前置条件:前置条件通过requires子句来表示: requires P ,即要求确保条件P为真 后置条件:后置条件通过ensures子句来表示: ensures P ,即要求确保方法执行返回结果一定满足谓词P 副作用限定:通过 assignable 和 modifiable ,分别表示可赋值、可修改 类型规格 不变式invariant:是要求在所有可见状态下都必须满足的特性,

BUAA_OO_2020_UNIT3

試著忘記壹切 提交于 2020-08-04 20:01:47
一、JML初探 ​ JML(Java Modeling Language) 作为一种形式化语言,可以约束 Java 代码中类和方法的状态和行为形成规格,通过将一系列具体代码实现抽象成明确的行为接口,可以形成一种契约式编程模式, JML 设计者无需考虑实际的数据结构与算法,可以聚焦于程序的整体逻辑, JML 形式化语言的无二义性能让实现者准确理解接口功能,根据问题需要选择合适的实现方式,同时 JML 可以帮助实现者开展代码测试与形式化验证,当然这时就要分析出模型语言映射到具体代码的抽象函数了。 JML表达式 ​ JML 可以内嵌在 .java 内,很方便,以 // @ 行注释或 /* @ ... @ */ 块注释, JML 表达式支持 Java 表达式作为基础。针对更复杂的逻辑引入了量词表达式, \forall 关键字类似数学中的 ∀ ,用法为 \forall v; P(v); Q(v) ,等价于 ∀v(P(v) → Q(v)) ; \exists 关键字类似数学中的 ∃ ,用法为 \exists v; P(v); Q(v) ,等价于 ∃v(P(v) ^ Q(v)) ;这是在本单元比较常用的,当然还有 \max, \sum, \min 等实用的关键字。 ​ 还可以使用特殊操作符 ==> <==> 表示蕴含与等价关系,使用这种操作符可以增强 JML 的可读性,同时还有 \nothing

OO第三单元总结

时光毁灭记忆、已成空白 提交于 2020-07-28 10:28:26
一、理论基础 1.什么是JML JML,即Java Modeling Language,是用于对Java程序进行规格化设计的一种表示语言。JML是一种行为接口 、规格语言(Behavior Interface Specification Language,BISL),基于Larch方法构建。BISL提供了对方法和类型的规格定义手段。所谓接口即一个方法或类型外部可见的内容。通过JML及其支持工具,不仅可以基于规格自动构造测试用例,并整合了SMT Solver等工具以静态方式来检查代码实现对规格的满足情况。 2.注释结构 JML的注释主要有行注释和块注释两种,用于不同情景 行注释的表示方式为: //@annotation 块注释的方式为: /*@annotation@*/ 3.常用表达式 \result表达式:表示一个非 void 类型的方法执行所获得的结果,即方法执行后的返回值。 \old( expr )表达式:用来表示一个表达式 expr 在相应方法执行前的取值。 \not_assigned(x,y,...)表达式:用来表示括号中的变量是否在方法执行过程中被赋值。 \forall表达式:全称量词修饰的表达式,表示对于给定范围内的元素,每个元素都满足相应的约束。 \exists表达式:存在量词修饰的表达式,表示对于给定范围内的元素,存在某个元素满足相应的约束。 \sum表达式

Java第四单元暨面向对象课程总结

半城伤御伤魂 提交于 2020-05-08 08:26:53
一、 第四单元作业框架 1、UML 类图解析器 ( 1 )设计策略 作为对 UML 的入门,这次作业主要考察了我们对于 UML 类图的构成要素的解析方法,并通过这种方法加深我们对于 UML 的理解。 对于从 UML 图中解析出来的信息进行分析与汇总,实现对于 UML 类图的各种元素(包括类的个数、特定类中所包含的属性个数等)的查询。在做这次作业时,我将各种元素( UMLClass 、 UMLAttribute 等)进行了分门别类的存储,使得元素能够对应所在的类,实现查询功能。 (2) 类图 由于本次作业只是对于 UML 类图中元素的解析,所以只需要将各种元素分门别类地 initial 处理一下就能够实现功能,所以我只是用了一个类来解决这个问题(因此只截取了一个类的视图)。以上即是本次作业的大体框架( seekforinterfaces 、 seekforancestor 分别是处理 interfaces 、 class 之间的继承, seek 、 todo 分别是这两个方法的递归做法)。 (3) 度量分析 2、 解析器的拓展(顺序图、状态图)以及基本规则的验证 (1) 设计策略 在 UML 类图解析器的基础上实现对于顺序图和状态图的解析,实际操作流程并没有改变,都是通过对于存储各种不同元素的相关信息实现对应因素的关联,与第一次作业类似。 而对于基本规则的验证(元素重名、循环继承

我永远爱着OOP——第三单元总结

て烟熏妆下的殇ゞ 提交于 2020-05-08 07:35:36
转眼第三单元的学习就结束了,这学期oo的余额剩余也不多了,且行且珍惜 这个单元的主题是规格,依赖于JML来展开的学习,首先不得不吐槽一下JML是真的商业化产品有点少,不过毕竟JML不是重点,规格才是重点,所以也就不多说了 相比于之前单元,这个单元并没有让大家去全套实现一个系统,而是去根据规格,也就是"契约"去实现一些偏底层的组件,满足相应的要求,同时,作业也是没有了之前指导书上的长篇文字描述,取而代之的是JML的规格描述。 不急着说作业,谈谈个人理解吧。个人认为,规格的使用主要有两大好处,一个是便于测试的展开,不论是 javadoc 还是 JML ,它们都比较全面的表述了一个方法应该达到什么样的效果,并对于一些特殊情况或是边界情况又该如何处理,可以说是一次全面的思考,经过这番思考,写出规格,我们就可以根据规格做出相应的测试,特别是单元测试;第二是便于沟通和协调,在一个多人团队合作开发的项目中,有一个共用的规范是很有意义的,这样可以直接统一大家的思路,每个人按规格实现方法,规格就是成员之间的承诺,而 JML 的准确表达的能力又是让这个效果进一步放大,虽然说不是很好读。 好,那么下面说说作业吧。 首先先说一说JML相关的生态 JML语言和工具链 JML语言其实对于复杂一些的逻辑,描述其相应的规格本身就是一件比较难的事情,会把规格写的很多很复杂,也因此,阅读难度就更是可想而知了

2019年北航OO第三次博客总结

痞子三分冷 提交于 2020-05-02 07:31:04
一、JML语言理论基础及其工具链 1. JML语言理论基础 JML是用于对Java程序进行规格化设计的一种表示语言,是一种行为接口规格语言(Behavior Interface Specification Language,BISL),基于Larch方法构建。BISL提供了对方法和类型的规格定义手段。所谓接口即一个方法或类型外部可见的内容。JML主要由Leavens教授在Larch上的工作,并融入了BetrandMeyer, John Guttag等人关于Design by Contract的研究成果。近年来,JML持续受到关注,为严格的程序设计提供了一套行之有效的方法。通过JML及其支持工具,不仅可以基于规格自动构造测试用例,并整合了SMT Solver等工具以静态方式来检查代码实现对规格的满足情况。一般而言,JML有两种主要的用法: 1) 开展规格化设计。这样交给代码实现人员的将不是可能带有内在模糊性的自然语言描述,而是逻辑严格的规格。 2) 针对已有的代码实现,书写其对应的规格,从而提高代码的可维护性。这在遗留代码的维护方面具有特别重要的意义。 2. JML工具链 JML是一种语言,那必然需要一些测试工具来检验我们用JML编写的规格的正确性。JML的测试可以使用开源的JML编译器来编译含有JML标记的代码,所生成的类文件会在运行时自动检查JML规格,若程序未实现规格中的要求