1.首先我们应该了解什么是jml,jml是java modeling language的缩写,是一种为java规格化设计的标识语言,简单来说,就是描述“干什么”的标准语言(跟注释差不多,但是是标准化注释)。jml基于Larch方法构建。BISL提供了对方法和类型的规格定义手段。所谓接口即一个方法或类型外部可见的内容。JML主要由Leavens教授在Larch上的工作,并融入了Betrand Meyer, John Guttag等人关于Design by Contract的研究成果。近年来,JML持续受到关注,为严格的程序设计提供了一套行之有效的方法。通过JML及其支持工具,不仅可以基于规格自动构造测试用例,并整合了SMT Solver等工具 以静态方式来检查代码实现对规格的满足情况。当我们使用jml时,必不可少的需要一些官方测试工具,比如openjml,这个可以用来检测你写的方法是否符合jml的要求。

3.

这是在bug修复后的结果。

4.本系列的作业主要是构建mypath和另一个容器类,第一次作业完全按照要求来,一个MyPath类,一个Main类,一个MyPathContainer,其中实现的方法也是接口中的方法,没什么太特别的,第二次我也属于懒惰型,把MyPathContainer中的代码复制到新的类MyGraph中,再加上新的方法即可,不需要什么重构,但是到了第三次作业则不一样了,第三次作业需要很多算法的思考,第二次作业由于在我第二次作业中是用的bfs去搜索无权最短路,用并查集确定两点是否连通,所以对于有多少个连通分支我就可以直接统计并查集数量即可,而剩下的最小换乘,最小票价和最少不满意度这三个都可以转化为带权图的最短路径问题,所以这三个的建图和求解我用了一个新的类叫dijsktra,用于专门完成这些任务的,而还有一个工具类是forqueue,用来实现dijsktra算法中用堆优化部分的比较。总体来看三次作业很平滑的过度了,并没有哪一次把之前的代码删改一点,所以我感觉这次的架构设计还是比较好的。

5.在代码实现部分,为了降低时间复杂度,对于最短路,由于不带权值,所以直接用n次bfs跑出所有结果,然后在之后则是o(1)的搜索结果了,而最小换乘,最小票价和最少不满意度,则用拆点的方法,遇到一个点就拆开,并把这个拆出来的点和总点相连,权值为换乘代价的一半,而这个和它的下一个点边的权值为本来的边权,这样我们在查找时,只需要找两个总点间的最短路并减去一次换乘代价即可,由于是有权图,所以我们使用dijskt+堆优化来求最短路,但是为了降低复杂度,我们不是每次add和remove都跑,只有在查找时才跑,同时给一个标记,跑过的就不需要再跑了,这样就可以节约时间,而在每次重新构图后徐熬夜清空标记,本次作业至此就没有什么难度了。本次作业让我深刻认识到==和equals的不同,由于对两个integer进行了==操作而导致本该相连的点不相连了,从而使强侧爆炸。再次提醒自己,对象间不能用==,都要用equals,这是本次作业唯一的bug,却让我挂了两次强测,真的再也不会犯了,印象太深刻了。

6.其实规格化就是在帮我们明确要做什么,有了jml的约束我们的代码会更不容易出错。如果作为一个软件架构师的角度,jml可谓异常重要,你想要让手下干什么全靠这个jml的约束,同时这个jml也可以让别人写的代码更符合你的预期,帮助别人提高作业质量。但是在这次作业中,我发现其实读懂jml并不是一件很简单的事,有些时候需要结合指导书去了解到底要干什么,看jml的次数远远小于我读指导书看懂的次数,所以如果下次jml练习还要改革的话,可以把指导书写的不那么详细,锻炼大家读jml的能力。希望oo越来越好

posted on 2019-05-21 15:01  Nergigante  阅读(312)  评论(0编辑  收藏  举报