面向对象第三单元总结--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就好了。
浙公网安备 33010602011771号