1. 总结本单元两次作业的架构设计
第四单元的两次作业都是对UML模型文件进行解析,主要关注类图、顺序图和状态图模型层次的语义观察,UML模型间关系,模型图表达的内容及关系,模型图之间的关系和一致性检查。
1.1第一次作业
第一次作业的主要是完成对UML类图的查询。我的思路是对类和类中的属性和操作用HashMap保存,对于关联,继承和顶级父类,建立静态数组保存类和接口之间的关系。对于函数的调用仅是返回图中的值。这次作业主要是要理解UML解析文件,需要发现如何找到属性和操作对应的类以及继承和关联关系是如何实现的。
第一次作业中我的代码有两个bug,一是在统计类实现的全部接口时,我用HashMap存接口间的继承关系,在多继承的情况下,会导致有的继承关系没有被记录。二是在类是否违背信息隐藏原则时,应该传出属性所在类的类名,我都传出了传进来的那个类名。对多继承没有使用恰当的保存方式以及对题意理解不充分。
1.2第二次作业
2. 总结自己在四个单元中架构设计及OO方法理解的演进
第一单元
第一单元我基本没有架构设计,也基本没有任何面向对象的思想,三次作业每次都是重构的,甚至在第三次作业中由于试图用完全的数据结构处理括号问题而差点导致作业无效。
在第一单元的总结中我从复杂度的角度对比了我第三次作业中用面向对象拆分表达式和用数据结构自底向上建立表达式树的两种方法。发现在建立表达式树的过程中,由于自底向上的求导拼接形式,对于括号的把握也比较困难,并且造成圈复杂度非常高,让程序的质量降低。面向对象的编程可以降低模块间的耦合度,使程序结构化程度提高。
第二单元
第二单元我的代码一直是复用的,每次作业只是增加了新的功能。在第二单元中我将问题解耦到电梯类,调度器类等,在多电梯时增加主调度器类,还是有一些面向对象思想的。但我在线程安全方面的做法偏离了“生产者-消费者”模式,采用整体synchronized块的形式保证线程安全,这种设计方法不需要使用wait(),notify()等方法,避免轮询过程可能产生的线程安全问题。但CPU和内存占用相比“生产者-消费者”模式都较多,且伴随请求数量的增加,这中差距更为明显,所以可能并不是一个好方法。
第三单元
第三单元JML是规格化设计,提高代码的可维护性。第三单元对架构设计主要就是将所有已知信息归结为图的形式储存起来,再将所有问题通过权值的变化归为最短路径问题,再选择一种合适的处理最短路径问题的算法。在这一单元还需要考虑CPU_time的问题,需要优化图的大小,最短路径的算法以及构建图与指令查询的分离。这一单元我主要学习到设计与实现的分离,感受到JML可以使代码编写的过程更加清晰。
第四单元
第四单元主要就是将UML图中的信息用图保存下来,在规定时间复杂度的限制条件下完成题目要求。
3. 总结自己在四个单元中测试理解与实践的演进
· 第一、二单元主要是自己构造数据,测试边界条件,第一单元主要是空格和符号问题以及长正则表达式可能会爆栈的问题。第二单元主要是线程安全,电梯间的配合等问题。
· 第三单元接触了Junit测试和OpenJML测试,感觉Junit在随机数据的配合下确实可以提高代码的正确性,但对于OpenJML我仍然不能从中准确地找到代码的错误。
· 第四单元主要是自己画mdj文件,寻找边界条件,对代码进行测试。
在四个单元的测试中,我能感受到测试的重要性,不仅要对代码是否正确进行测试,也要对代码的运行时间合理把握。
4. 总结自己的课程收获
· 对java语言有一定了解,从完全不会到能完成一定要求。
· 在面对一道题目时,能先试图分析解耦题目要求,在有一定架构设计的基础上,再开始编写代码。
· 了解面向对象和面向过程的区别,体会到面向对象的思维方式在一些较为复杂的问题上的优势。
· 从多角度理解面向对象的思维方式,从JML,UML等角度理解面向对象的程序设计。
· 在编写代码时,关注代码的可扩展性,使代码复用更多,降低复杂问题难度。
· 能关注到代码风格问题,虽然在文件命名规范等问题上还会出现问题,但在大多数方面能符合代码风格要求。
· 感受到全面的测试对代码编写的重要性,能在写完代码后尽量测试。
5. 立足于自己的体会给课程提三个具体改进建议
(1)关于理论课,希望能增加一些与实验课或作业更相关的内容。
(2)关于强测互测,强测互测中的错误很可能是同质bug,但在强测和互测中各扣一遍分,希望bug修复能改善这个问题。
来源:https://www.cnblogs.com/xpppx/p/11075920.html