jml

BUAA_OO_第三单元

可紊 提交于 2020-11-16 06:57:02
单元任务 本单元任务分为三个阶段,均为根据JML规格完成具有一定功能的代码。依次为: 实现两个容器类 Path 和 PathContainer,对JML规格进行理解和熟悉 ; 实现容器类 Path 和数据结构类 Graph ,其中Graph类继承了PathContainer接口,对JML规格进一步理解; 实现容器类 Path ,地铁系统类 RailwaySystem ,其中RailwaySystem类继承了Graph接口。 一、JML语言 JML是java modeling language的缩写,用于对Java程序进行规格化设计的一种表示语言,可以用来描述一段代码的具体行为,比如前置条件、副作用、后置条件等。 通过JML的相关支持工具,可以检查规格是否合乎规范、可以基于规格自动构造测试用例,同时可使用SMT Solver等工具以静态方式来检查代码实现对规格的满足情况。 (一)JML理论基础 JML中存在大量对Java程序中数据、方法、类的描述,并以Java语言中注释的形式嵌入到程序中,不会影响正常的编译而能够规范代码的使用,而能够精确地描述代码。 主要的规格有: JML表达式 \result表达式:方法执行后的返回值。 \old( expr )表达式:用来表示一个表达式expr 在相应方法执行前的取值。 \forall表达式:全称量词修饰的表达式,表示对于给定范围内的元素

OO的奇妙冒险3

☆樱花仙子☆ 提交于 2020-10-28 07:54:17
OO的奇妙冒险3——JML与设计规范 目录 JML理论与工具 验证方法与报告 自动样例及其生成与评判 架构设计与重构 bug 心得体会 JML理论与工具 JML是一种通过形式验证,在实现代码之前就保证所写代码正确性的有效手段 总的来说,JML实现了这样一种功能,即设计与实现分离。构造JML的与写代码的应该是两路人马,构造JML的人不需要知道实现细节,也不关心性能(只关心正确性),写代码的人只关心如果在性能最高的情况下完成JML所标注的任务 而JML另外一个功能,便是有效的管理设计。虽说模块化开发也适用于直接写代码,但是JML毕竟比代码本身要精简一些。很多时候,只阅读JML便可知晓工程的大体功效 JML语法属于 硬编码 的具体细节,知道思想即可,不再赘述 工具方面,本人体验了OpenJML的命令行版本(IDEA2019并不支持JML插件),感觉总体来说效果一般 验证方法与报告 这一部分已经在最新版的作业要求中被取消,因此不再赘述 自动样例及其生成与评判 首先是传统艺能:对拍器 即使在JML的大环境中,对拍器仍然相当好用。本次作业的评测系统可以说是十分好写,打好jar包后直接用shell编写若干重定向,并用diff命令即可快速高效的实现对比,困难的部分是数据生成器 数据生成器的好坏,直接决定了bug的覆盖性,也直接决定了性能(运行时间)的分析。制造一个好的数据生成器的过程

第三单元博客总结

£可爱£侵袭症+ 提交于 2020-10-28 03:02:18
第三单元博客总结 这一单元,主要是进行的JML的使用,以及考察了对于容器,对于算法选择时候的时间复杂度的控制。 JML的理论基础和相关工具 JML的核心就是规格和规范,当我们作为设计者想要向开发表达出让他们做什么的时候,我们往往需要用注释的方式来进行表述, 比如某个类应该有什么变量,干什么,再比如某个方法应该做什么,什么可以变,什么不可以变化,以及对于数据有着特殊的要求等等一系列的要求。我最开始的时候认为如果用自然语言模仿规格进行表述的话,可以有着更好的效果。同样,最开始作为一个开发者,我或许更加希望能有类似于规格的自然语言描述。 那么问题来了,我们为什么要用一种规范的类似于伪代码的方式去写注释呢?因为只要有了规范,就代表可以自动化验证,自动化验证可以避免人思维的死角,能够从一个更加完整的系统的方法进行规格的验证,检测正确性,除此之外,为了进行大规模,批量复杂的验证,光靠人力去一点一点看注释解答注释,或者说,让测试人员去先读明白注释,再去读明白代码,检测是否正确,需要大量的人力和时间。如果机器可以代替我们的工作,当然是最好的。但是机器是死的,只能按照模板按照规矩来解读,所以我们不得不创造一个约定,让机器可以识别,但是对于书写者来说便于书写,对于开发者来说便于看,最终就诞生了我们的JML。除此之外,自然语言会有各种各样的歧义,也会导致很大的问题。 JML的核心是用表达式,对于方法规格

[OO] JML系列 优化及时间复杂度可行性证明

我的梦境 提交于 2020-08-20 04:32:27
JML系列 优化及时间复杂度可行性证明 符号定义 符号 意义 上限 p p p 网络中Person数量 800 r r r 网络中关系数量 3000 q s q_s q s ​ 查询queryStrongLinked数量 20 q r q_r q r ​ 查询queryNameRank数量 1000 q b q_b q b ​ 查询queryBlockSum数量 3000 q a q_a q a ​ 查询queryAgeSum数量 3000 q m q_m q m ​ 查询queryMinPath数量 3000 优化方法与复杂度分析 queryBlockSum 并查集 由于不需要删除操作,故采用 并查集 实现 并查集单次操作的均摊复杂度为 O ( α ( n ) ) O(\alpha(n)) O ( α ( n ) ) ,其中 α \alpha α 为一个Ackerman函数相关的,这里可以认为小于常数 4 4 4 每次查询时需遍历每个Person,时间复杂度 O ( α p ) O(\alpha p) O ( α p ) 动态维护加边的复杂度 O ( α r ) O(\alpha r) O ( α r ) 总时间复杂度 O ( α p q b + α r ) O(\alpha p q_b+\alpha r) O ( α p q b ​ + α r ) 上限小于 1 × 1 0 7

socket(java) 搭建一个多人在线聊天室

╄→尐↘猪︶ㄣ 提交于 2020-08-13 07:02:23
目录 说明 Socket及java编程方法 功能结构 共享类 服务器端 客户端 效果展示 代码 说明 今年由于疫情原因只能在家里学习,今年学校有一门很重要的课程《面向对象》,学习了java中的编程思想、多线程、JML、UML等等东西,为了检验自己学习得好不好,再加上听说 java 很适合 socket 编程,并且阿里云的服务器一年才九十多块钱,我就决定( 其实以上都不是主要原因,主要原因就是考完试在家闲的发慌 )决定搭建一个多人在线聊天室,并且从中也可以学习 Swing、socket 等等。 后面代码中所有GUI界面布局的内容,参见我之前的一篇博客 Swing的简要学习记录 。 本次实现的聊天室功能比较简单,主要实现的功能如下: 带有优美的 GUI界面( 才怪 ); 在服务器允许的压力下支持多人实时聊天; 支持账户登录功能(不支持注册功能,也就是服务器端预先设好了账号) 以下是或许下一次要改进的内容: 实现注册功能; 实现单人聊天; 实现好友功能 Socket及java编程方法 socket(套接字)是计算机之间进行通信的一种约定。如果学过操作系统应该会知道,进程之间的通信(IPC)包括管道、FIFO、共享内存、信号量机制等等,这里socket就是一种可用于不同计算机的进程之间的通信机制,用来解决网络通信问题。 socket的通信基于TCP/IP协议,用(ip地址,协议,端口号

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

我只是一个虾纸丫 提交于 2020-08-12 01:49:52
OO第四单元总结 & 课程总结 目录 OO第四单元总结 & 课程总结 一、本单元两次作业的架构设计 第一次作业 第二次作业 二、四个单元中架构设计及OO方法理解的演进 架构设计 OO方法 三、测试理解与实践的演进 四、课程收获 五、改进建议 六、碎碎念 一、本单元两次作业的架构设计 第一次作业 架构   在UML类图中,各个元素组成一棵树,但是如果真的按照树来组织数据结构的话,个人觉得有些复杂。而且实际上UmlClass和UmInterface具有很多相似之处,我就索性把二者统称为节点Node,用自己写的类来储存,每个Node类的成员变量为这个UmlClass/UmlInterface的成员变量、操作、父类、实现的接口、关联对端等。   这样实际上就__构成了一个图__。图中节点就是这里的Node,每个节点自身存储着一些信息(如这个UmlClass的成员变量和成员方法)。而节点之间的边有三种,我分别称之为__实现边__、 继承边 、 关联边 。这三种边都是有向的,分别是子类指向(直接继承的)父类、类指向(直接实现的)接口、类指向与其关联的类。   在这样的数据结构下,查询、搜索算法都可以使用。我的程序类图如下: Bugs   在 getImplementInterfaceList() 中采用dfs的方法,递归寻找这个类实现的所有接口和继承的所有类

第三单元博客总结

女生的网名这么多〃 提交于 2020-08-11 19:46:22
第三单元博客总结 这一单元,主要是进行的JML的使用,以及考察了对于容器,对于算法选择时候的时间复杂度的控制。 JML的理论基础和相关工具 JML的核心就是规格和规范,当我们作为设计者想要向开发表达出让他们做什么的时候,我们往往需要用注释的方式来进行表述, 比如某个类应该有什么变量,干什么,再比如某个方法应该做什么,什么可以变,什么不可以变化,以及对于数据有着特殊的要求等等一系列的要求。我最开始的时候认为如果用自然语言模仿规格进行表述的话,可以有着更好的效果。同样,最开始作为一个开发者,我或许更加希望能有类似于规格的自然语言描述。 那么问题来了,我们为什么要用一种规范的类似于伪代码的方式去写注释呢?因为只要有了规范,就代表可以自动化验证,自动化验证可以避免人思维的死角,能够从一个更加完整的系统的方法进行规格的验证,检测正确性,除此之外,为了进行大规模,批量复杂的验证,光靠人力去一点一点看注释解答注释,或者说,让测试人员去先读明白注释,再去读明白代码,检测是否正确,需要大量的人力和时间。如果机器可以代替我们的工作,当然是最好的。但是机器是死的,只能按照模板按照规矩来解读,所以我们不得不创造一个约定,让机器可以识别,但是对于书写者来说便于书写,对于开发者来说便于看,最终就诞生了我们的JML。除此之外,自然语言会有各种各样的歧义,也会导致很大的问题。 JML的核心是用表达式,对于方法规格

2020-BUAA-OO-面向对象设计与构造-第四单元总结&课程总结

谁说胖子不能爱 提交于 2020-08-09 22:26:42
咱的OO结束辣! Part1: Unit4 Summary 本单元作业,我主要使用了适配器模式和访问者模式。总体上看,代码量和文件数量有所上升,但配合分包等措施后,文件结构清晰,各部分耦合度均较低。缺点就是一个简单操作要脱好几层套,显得有些臃肿。 由于三次作业基本上只有增加对新功能的支持,因此只分析第三次作业。 Section1: 整体处理以及错误检测 总的来说,我将所有UML元素的类用MyUmlElement包裹,并添加属于自己的属性方便自己扩展。子类继承MyUmlElement并存入有关元素的引用。 对不同UML图查询的处理分别由对应的管理者类进行管理,每个管理者类首先接受元素列表和Map,利用这些提取并构建自己需要的容器。 MyUmlInteraction负责将官方包的元素转换为MyUmlElement及其子类,而对应的管理者类负责填充子类的结构,将UML元素的层级关系添加至我的包裹类中。 在管理者类将图构建过程中或者完成后,会自动调用相关的check方法进行测试,并利用ValidityLogger将发现的问题记录。 ValidityLogger其实是第三次作业我为了省事搞出来的类,类里面 全是static 的方法和属性,这样全局不需要拥有它的引用就可以调用。在MyUmlInteraction中调用resetStatus进行初始化

OO第四单元博客作业

我与影子孤独终老i 提交于 2020-08-09 21:34:25
OO第四单元博客作业 BUAA_1706_HugeGun 目录 第四单元作业架构设计 四个单元架构设计及OO方法理解 四个单元测试理解与实践演进 课程收获 一点建议 第四单元作业架构设计 ### 第十三次作业: 用HashMap嵌套HashSet、ArrayList建抽象图 查询在容器里找就行了 共440行 第十四次作业: 复制上一次作业代码来解决类图查询 新建check类并复制上次作业建的图,然后完成三种check: 001: 用String(id)建容器, \(O(n^2)\) 查询重复name 002: dfs找环,不重复搜索保证复杂度 003: dfs找路径,不重复搜索保证复杂度 时序图查询: 用HashMap嵌套HashSet、ArrayList建抽象图 查询在容器里找就行了 四个单元架构设计及OO方法理解 怎么好写怎么来。 没有用过继承和接口,因为作业里还是用实例化舒服 多线程很好玩 JML不好用 JUNIT不如对拍 地铁很好玩,虽然标程T了 UML很面向过程 四个单元测试理解与实践演进 别问,问就是对拍 datamaker用C++ 表格生成用python 批处理用batch (OO用java) 课程收获 我学会了面向对象 我学会了java编程基础 一点建议 1、多找人验验题,看看指导书,一点疏漏可能会导致很大的问题,使学生产生厌烦心理, 在竞赛里

BUAA_2020_OO_UNIT3_REVIEW

不打扰是莪最后的温柔 提交于 2020-08-09 20:09:16
OO第二单元总结 1. JML语言的理论基础、应用工具链情况 1.1 JML理论基础 我觉得就是《离散数学》中的数理逻辑 由于我的《离散数学》是速成的,导致我不会写规格,只能勉强读读,因为写规格和写代码的逻辑完全不一样,第10次作业我就傻逼了。 JML知识点总结: pure: 纯粹查询,无任何副作用。 数组: 仅仅是规格层次的描述,不一定要数组实现 no_null: 该对象不能为空。 \result: 该方法的返回值。 require: 前置条件,即调用该方法时参数以及成员变量需要满足的条件。 assaignable: 副作用范围,列出所有可能会被修改的成员变量。 \nothing: 空 ensure: 后置条件,即调用该方法之后参数和成员变量需要满足的条件。 \old(): 表示调用该方法前的该对象或表达式的值。 \type(): 表示该类(type)的类型(class)。 \typeof(): 表示该表达式的类型。 \forall(): 相当于离散数学中的"任意"符号。 \exits(): 相当于离散数学中的"存在"符号。 <=, =>, <=>: 离散数学中的蕴含,等价等 public_normal_behavior: 正常功能规格。 public_exceptional_behavior: 异常功能规格。 also: 分开正常和异常两种规格。 signals () ___