2020面向对象第四单元

三次作业构架设计总结

下面UML图只包括了我设计的类和需要实现的接口,官方包里面别的类和接口没有画入。省略了不关键的属性、方法和参数。
我的思路是通过UmlElementNode来存储输入的所有Uml元素,用UmlElementNode组成树来存储输入的所有parent关系。
UMLElementNode也用于只有一个父节点的图的构建。
相应地,Node用于不保证只有一个父节点的图的构建。算法中多数图都是用Node构建的。
avatar
这是第一次修改后的构架。最初我想当然地认为接口也是单继承的,就没有设计Node这个类,后来才补上的。

avatar
这是第二次的构架,仅仅比第一次多了几个方法,主要是Node内有一些图的算法。

avatar
这是第三次的构架,PreCheckFunc类用来承载本次作业新要求的方法,使MyUMLGeneralInteraction类的代码不至于太多。Node增加了一些要用的算法实现。

四个单元的构架设计和演进

第一单元我基本上是面向过程的编程。虽然也把方法放在了不同的类,但是依据仅仅是某个方法有一个某类的参数,就把这个方法放在这个类了,如果有多个类的参数就看这个方法调用的哪个类的方法多就放在哪个类。这种设计比较机械,导致方法有的时候很乱。类的设计是非常自然的依照问题的逻辑设计的,没有特别的设计。这导致虽然我的类非常好理解,但是不太容易修改,因为没有注意类的方法之间的来回纠缠,没有很好的层次化结构。

第二单元涉及多线程。我在设计的时候主要是围绕现成安全考虑的,因此我单独设置了一个乘客排队的类,这个类只负责提供该上电梯的人。电梯则是自己扫荡,遇到有人可以上或下就开门。在这里我开始运用一些设计模式了。我使用的基本是生产者-消费者模式,但自己加了一些改动。在第三次作业遇到了死锁问题,我认识到是我的构架导致的。当几个类循环关联的时候就有可能产生死锁。我为了避免死锁修改了构架,使它有点像代理模式。我在构架中运用了避免死锁和设计模式的知识,不再需要凭空自己想了。

第三单元主要是按照JML写,我的构架就非常简单,只比必须要有的多了一两个类。我认为这个单元构架没有太多发挥空间。

第四个单元我开始同样认为构架很简单,然而在实现的时候发现很多算法其实非常的相似,应该把它们抽象出来。于是就在Node类里面尽可能少地关联别的类,主要实现算法。这样避免了大量重复代码。我认为这次作业是算法用的最多的,因此我的构架设计也相对明确————算法抽象为一个类。这是我第一次不按题目自然的逻辑(如第一单元)也不套用现有设计模式(如第二单元)而独自权衡后给出了不同类的设计。

四个单元测试的理解与实践的演进

第一单元的测试就是手动构造一些测试样例,测一些特殊情况,效果一般,类似于碰运气。

第二单元尝试自动生成样例,有命中,但是效率相对不高,没想到更好的测试方法。

第三单元使用JUnit后,我发现这个工具能帮我把测试做的细一些,这样就有可能做到全覆盖了。然而全覆盖的情况虽然比作为整体测少,但也很多,因此我测的时候基本上凭主观构造一些样例,没有真正做到全覆盖。

第四单元我认识到测试无法发现性能的问题(或者说只有自动生成边界数据才有可能测性能,但这个单元构造边界数据就相当于按UML规则随机构造UML图,这个程序太复杂了)。算法的正确性可以通过测试检验,但性能只能通过自己分析时间复杂度。

课程收获

我在这门课主要有五点收获。
一是熟悉了java语言,明白了线程等基本内容,并第一次自己写功能相对比较强的程序,大大增强了编程经验。
二是学到了一些设计模式,从编程中体会到了前人总结这些设计模式的好处。对面向对象有了新的认识。
三是尝试了上面提到过的测试方法,对程序的测试,甚至自动化测试,有了一些认识和想法。
四是了解了面向对象的相关工具,Jml和Uml,了解了工程化的编程的一点点基础,对日后设计更大的程序有了理论准备。
五是通过编程复习了离散数学学过的算法,对学过的算法的具体应用有了一些认识。

改进建议

我有两点建议。

一是希望把每次作业时间延长,允许在一周之外完成,只是失去互测资格。在一周之后希望助教能对个别编程中的极难解决的问题进行点拨。有的时候编程卡在某些问题上就写不下去,重构也绕不过这个问题,然后这次作业(或者debug)就可能放弃了。现在助教是不能提供关于具体编程的支持的。

二是希望公布一下实验课的成绩,至少告知错题。否则实验课做完了收获有限。

体会

我认为线上上课非常难以交流。平时很多问题都是室友间面对面说话解决的,现在基本全靠自己,虽然有讨论区和微信群等答疑场所,我仍感觉获得的帮助非常有限。我认为课程组发接口这件事非常好,这样就避免了让同学陷于意义较小的复杂输入解析,把同学挡在所学内容的练习之外。但类似的帮助仍可以做的更好,比如说开设答疑课(这一点可以算作建议)。
我不知道自己有没没有达到这门课所预期的要求,感觉主要是完成了12次作业,理论纯是围绕编程学的(用不到的掌握就差很多)。

posted @ 2020-06-19 18:36  JiaheDu  阅读(135)  评论(0)    收藏  举报