面向对象第三单元总结--JML

面向对象第三单元总结--JML


设计策略

  第三单元目的在于培养JML规格思想,通过JML而不是模棱两可的自然语言对需求进行描述,让项目规格化,方便了需求方和实现方。具体到作业,则是顶层设计已经给出,而最终使用的算法/数据结构等则需要自己进行抉择。

  1.浏览官方包,主要看Runner类。

  2.整体浏览JML,结合方法名做一个类与类之间的整体关系思考。

  3.完成除MyNetwork类之外的类。

  4.完成异常类。

  5.完成MyNetwork类。

  6.测试,debug。

  在实现各个方法时均先实现异常处理部分。以及需要注意,JML规格中给出的数据类型仅供参考,并非硬性要求



第一次作业

概述:主要实现了MyPerson与MyNetwork两个类,建立了初级的人际关系网络。

其中大部分的属性均采用HashMap容器进行存储,仅有少数属性即MyPerson中的value、acquaintance等采用ArrayList容器进行存储,这意味着在JML规格中给出的类属性有部分在实际代码中约等于弃用,仅在寥寥几个方法中用起。

Exception类均使用HashMap容器,并未另实现一个异常管理类,而是由每一个Exception自行处理,代码重复度较高。

第一次作业中并未设置什么难点,值得一提的是isCircle方法,为方便达到O(1)的查找设置了一个简易邻接矩阵Net,在每次人际关系产生变化时维护该矩阵即可。

 

第二次作业

变化:在第一次作业的基础上新增了Group类。

实际代码与第一次作业并无太大区别,只是对应Group类新增了一套查询/增删方法。

 

第三次作业

变化:新增Network高阶查询功能,其中以queryblocksum与sendindirectmessage较为复杂。

其中sendindirectmessage为无环非负最短路问题,采用Dijkstra即可。

 

 

 其中Edge为结构体:

 


 


容器选择与使用

  从最开始照搬JMK规格里的【】数组,到迟疑地敲下ArrayList,再到最后手起刀落选择HashMap,容器的更迭意味着对设计理解的加深。

  在社交网络的背景下,几乎一切实例都具有id属性,HashMap凭借其快捷的查询功能脱颖而出。


 

感想

  JML规格实属程序员福音,有书同文车同轨之功。

  此外,在本单元中学习到了JUnit单元测试手段,体会到了其带来的可靠性与便捷性。

  如果在今后的项目/工程代码中都能出现JML就好了。


 

posted @ 2021-06-01 21:46  FGmaster  阅读(55)  评论(0)    收藏  举报