OO第三次作业总结(JML)

       第三单元的课题是JML, 即java建模语言。JML是一种描述接的语言。通过前置条件和后置条件,描述一个模块的行为。本单元我们扮演一个项目中的一员,完成自己的一小部分工作,最终实现整个项目。而限制我们这一小部分工作应该如何进行的正是JML.

一、什么是JML

       JML是一种java建模语言,有自己独特的语法,通过这套语法对前置条件,后置条件,变量不变式的控制,来描述一个模块的功能和行为。由于JML的语法更像是编程语言和算式,所以相比自然语言,JML虽然稍显复杂,却可以明确无二意的描述出模块的功能行为,在多人合作的工程化代码中,这显得尤为重要。JML写在注释中,每一行由@开头。

行注释表现为//@  ......

块注释表象为

/*  @......

    @......

    @......

*/

前置条件为requires,后置条件为ensures, 副作用为assignable。

三、我的架构。

  第一次作业比较简单,未涉及到实际应用的场景,因此在初次设计的时候忽略了复杂度的问题导致了超时。于以后的作业我们知道,这次作业实际上是地铁图的基础,因此一定是创建路径的操作少而查询路径的次数多。因此我开始的架构每次查询时计算会导致超时。正确的做法应该是创建完后直接计算并储存下来。查询时直接使用储存的数据。

       本次作业主要的内容在于对Path的管理。在该类中,我建立了两个HashMap和一个ArrayList.

两个HashMap的键值和内容恰巧相反,均储存Path对象和Path的Id.因此当相互查询的时候时间复杂度均为O(1),可以做到快速查找。最后一个ArrayList则用来存储所有的点,最终查询点的个数的时候直接用ArrayList.size就可以方便的得到总的点数。

 

 

      第二次作业在第一次作业的基础上进行。主要多了路径的概念,需要查询两个点是否相连,以及两个点之间的最短路径长度。同样面临时间的问题。解决的办法是直接应用Floyd算法,在引入无向不加权图,来计算它的Floyd矩阵,与第一次作业相同,每次添加或删除边的时候直接计算Floyd矩阵并储存起来,在查询的时候直接检查Floyd矩阵的值即可。

 

     第三次作业在第二次作业的基础上加了部分要求,即各种不同要求下的最短路径长度。包括换乘最少,价格最低,不满意度最小等。实际上仍可以转化成最短路径问题,唯一的区别只是有无权改为有权即可,根据不同的要求改变不同的全职。对于最少换乘,只需要把在同一条线上的所有点之间的距离赋值为1计算最短路径即可。对于最低价格,需要先将在同一条地铁线上的点之间的最小距离算出当做初始价格。并且在更新价格时,相加的两个点之间的权要再加二,看做换乘的价格。最低不满意度同理可得,在同一条线内先将各个点的最低不满意度算出,当做初值,计算是同样根据公式改变加法法则即可。三次作业几乎都在类内完成,唯一添加的类是Edge类,用于储存边的信息。

 

 

 

OO第三次作业总结(JML)

 

OO第三次作业总结(JML)

 

OO第三次作业总结(JML)

 

 BUG:

总的来说本单元的BUG体现在复杂度上,会通过复杂度来卡强测时间,特别是第一次作业,开始没有采用优化,每次查询进行计算,因此会出现问题。第三次作业则主要体现在算法上,开始并没有使用更改权值的Floyd算法,导致程序非常复杂,且会有玄学现象。

 

本次作业让我们体会编写一个工程中一部分代码的感受,比较具有趣味性。进行代码测试时,本应该针对JML的规范进行逐个模块的测试,最终保证结果。但本次作业方法和最终的明令对应比较明显,所以我在编程过程中的测试基本都靠命令的正确性来测试。实际上还是应该引入模块化测试的思路来进行。我认为本次作业更加加深了我们工程化编程的思想,富有实践意义。

上一篇:Codeforces Gym 101252D&&floyd判圈算法学习笔记


下一篇:maven安装