OO第三单元总结
OO第三单元的作业已经结束,针对作业中出现的问题和个人设计的思路做一些总结
设计策略
本单元作业的内容是根据给定的JML规格实现一个可以实现个人操作,好友关系操作,群组操作,收发消息等等的社交网络。虽然看起来根据JML实现代码的内容并不复杂,只是单纯地根据所给定的规格设计d代码即可,但是本单元通过测试的难度并不低,在强测中出现了很多关于性能的测试。如果只是简单地依据规格中的描述用循环等方式实现功能会导致强测的超时。
对于类中一些规格比较简单的函数,我们只需要按照规格一板一眼地实现就好了,不需要进行性能上的优化。同时针对函数中某个功能可能抛出的异常我们可以同步地设计对应的异常,从而完成代码功能与异常功能的对应。
而对于一些规格比较复杂的函数,我们就不能直接开始写,首先要根据代码的规格中描述的内容指定一个复杂度较低的实现方式,再进行实现并尽量进行单个功能的测试。
测试方法及策略
本单元老师要求我们使用JUnit以及OpenJML进行测试。但是很遗憾,由于设计的时候费时较多的原因,在测试过程中我没能再花费足够多的时间了解这两种新的测试方式。对于本单元的测试,由于本单元的功能和指令并不复杂, 也不是非常多,所以针对一些个人测试中出现的问题,在设计过程中我进行了标注,并设计了一部分针对这个功能的测试程序进行测试。比如关于图关系的两个函数,由于设计的算法问题,我很可能在算法的实现上出现错误,因此我着重测试了上述功能。
容器选择分析
在本单元的作业中,容器的选择十分关键,如果根据规格的描述,全部选择静态数组进行存储,那么在后续的测试中,如果规格过大, 就会出现设计的算法导致的性能问题,所以我们需要在容器的选择中保持谨慎,并且要提前规划好在后面函数中该如何使用。
以第三次作业作为模板进行分析:
MyPerson类
-
对于存储人所使用的容器,可以使用ArrayList动态数组进行存储
-
该类中还需要一个存放messages的容器,不过这里根据题目的要求使用的也是动态数组,实际上根据后续代码的开发,由于大量涉及消息的增删查改,所以对于这类对象使用动态数组能够更好的存储数据。
MyGroup类
- 本类中仅需要我们有一个存储该group中的人的容器,对于该容器中的元素并没有什么复杂的操作,我们只需要使用能够满足加入元素,删除元素,遍历元素这些操作的容器就可以了,这里个人认为使用动态数组存储更好一些 ,但是实际上在我的设计中,我根据题目规格要求使用了静态数组。
MyNetwork类
- MyNetwork中,根据题目要求的内容,我对人数,群组数,还有消息等等,分别建立了不同的静态数组进行存储。
异常类
- 今年的这一单元作业需要我们个人完成异常处理,但是异常触发数目不高,同时算法较为简单,所以采用了static类型的静态变量计数器进行全局计数,对于出现的错误,收集id并将该错误的全局计数器变量+1即可。
架构分析
本单元是增量式开发,这里同样使用第三次作业进行分析。
-
MyMessage类
消息类型,每个人都拥有其对应的messagebox,能够收发信息,查看收到的消息等等,每个message根据type类型(0/1)分为个人对个人发送的消息以及个人对群组发送的消息,同时消息分不同类型
-
MyEmojiMessage类
表情消息,包含消息基本功能,并且能够实现表情热度的改变,根据热度值删除表情等功能
-
MyNoticeMessage类
普通的消息。
-
MyRedPocketMessage类
红包消息,发钱人和收钱人对应增加金钱数额。
-
-
MyPerson类
模拟社交关系网络中的人,每个人有id,age等等个人信息,并且可以收发消息
-
MyGroup类
个人理解是社交网络中的群聊,个人可向群组中发送消息,可以收到来自群组中的消息。同时可以向群组中加入人,删除人等等。
-
MyNetwork类
该社交网络的模拟,是一个带权的无向图,是本单元作业中最为复杂的结构,对于图结构的各种查找,查询连通分量数,寻找最短路径等操作都是本单元最容易超时的,我们需要对于其性能进行优化。
-
Exception异常类
计错误的id,以及异常出现的次数,以一定格式在print中进行输出。