OO第四单元总结
第四单元架构设计
第一次作业
第一次作业要求实现对类图的分析,可以对类图中的各种属性进行查询。
于是在第一次作业中,对UmlClass、UmlInterface、UmlOperation分别设置了自己的MyClass、MyInterface、MyOperation。由于MyClass和MyInterface有一些相似的地方,于是让这两个类都继承自一个MyElement抽象类,在该类中实现了一些共同的方法。
在解析过程中,采用从顶层到底层的方式进行解析,共分成三层共三次对所有UML_ELEMENT进行遍历。
第一次遍历解析UML_CLASS、UML_INTERFACE和UML_ASSOCIATION_END。
第二次遍历解析UML_OPERATION、UML_ATTRIBUTE、UML_GENERALIZATION和UML_INTERFACE_REALIZATION
第三次遍历解析UML_ASSOCIATION和UML_ParaMETER
对于容器的选择,由于每一种元素都有其独有的id,因此基本上都采用HashMap对元素进行存储。之后根据指令的要求对解析好的类图进行更进一步的操作即可。本次代码的UML类图如下。
第二次作业
第二次作业增加了对顺序图和状态图的解析,因此新增了MyRegion、MyState、MyStateMachine、MyTransition、MyInteraction五个类方便进行解析。
架构的实现与第一次大致相同,在第一次作业的基础上,第一层遍历增加了对UML_STATE_MACHINE、UML_INteraCTION和UML_REGION的解析。第二层遍历增加了对UML_LIFELINE、UML_STATE、UML_PSEUDOSTATE和UML_FINAL_STATE的解析。第三层遍历增加了对UML_TRANSITION和UML_MESSAGE的解析。
UML图如下
第三次作业
第三次作业要求对模型进行有效性的查询。
由于原架构所有指令的实现均放在了MyUmlGeneralInteraction类中,导致代码量过于庞大,第三次作业在这样写铁定超过500行了,于是单独把类图解析器和顺序图解析器写成一个类,具体逻辑在该类中进行实现,MyUmlGeneralInteraction类中再调用对应解析器的方法即可。
对于有效性的检查,单独写了一个MyChecker类,在该类中实现具体的逻辑。
本次作业主要的难点在于R002,实现了R002的话,R003、R004就相对简单了。其他的检查要么在解析式进行判断,或者只是进行简单的遍历即可。
R002的实现主要在接口之间是否有循环继承,通过遍历每一个接口,对接口进行dfs,维护一个接口的继承路径,当路径可以继承到自身时,将路径上的点加入对于的HashSet中,后面的遍历可以跳过该HashSet上的点。
本次作业的UML图如下。
架构设计及OO方法理解的演进
第一单元
第一单元是多项式的求导,一开始就进入了面向对象的海洋,面向对象的思想体现的最为明显。通过第一单元,熟悉了java的语法,理解了继承、多态等等面向对象的性质并进行了运用,对面向对象的思想有了初步的认识。
第一单元通过把各个因子简称各自的类,通过获取输入,利用工厂模式对提取到的字符进行解析,构建一个后缀表达式,并通过表达式树的方法对整个表达式进行解析提取,构成一棵树。每个节点都拥有各自的求导方法,通过对根节点进行求导即可对整个表达式进行求导。
对于合法性的判断则利用递归下降法进行判断。uml类图如下。
第二单元
第二单元是编写一个电梯和调度。相比之前增加了多线程的应用。通过这单元的作业第一次理解和使用了多线程的编程方法。多线程的编程,需要理清楚各个对象之间的主次关系、逻辑关系、时序关系等等。需要通过合理地进行同步块锁的设置,保证线程安全。
其次是电梯调度的编写,主要通过生产者消费者模式的设计思路,分清谁是生产者,谁是消费者,再利用look算法,进行调度,主要架构如下。
第三单元
第三单元主要是对JML的理解,通过课程组给的JML进行代码的设计和编写,难度相对较小,不必自己设计架构。通过该单元可以了解实际生产环境中在规格要求约束下如何进行代码的设计,要深刻理解JML所要求的最总的效果,通过理解目标而设计各种简洁高效的算法,不局限于JML所写的简单的循环遍历等等,要跳出固有框架和通过高效的方法达到相同的目的。本单元作业涉及了许多图的算法,通过本单元的练习,还熟悉掌握了并查集、图的最短路等等算法,还有对容器的选择有了更加深刻的体会。
第四单元
第四单元是关于UML的,通过课上课下了解学习UML的相关知识,能够看懂UML模型,理清它们之间的关联和层次关系,对抽象化模型有较为清晰的认识。
编写时重点利用层次化的思想对UML进行划分,对各个元素进行相应的解析,通过适当的容器尤其是HashMap进行保存,以最终构建完整的UML解析器。构建的过程也是学习的过程,通过构建慢慢地更加深入地了解UML图,会有更加深刻的认识。
测试理解与实践的演进
在所有单元作业中,最主要的测试方法都是手动构造数据对一些特殊情况进行测试,并以一些简单的评测机进行辅助。
第一单元的测试主要是手动构造一些复杂的表达式来测试自己程序的正确性。对于自动测试则采用python编写的简单的评测机,通过正则表达式自动生成表达式自动运行自己的jar包获得输出,与python的自动求导结果进行比对,来测试程序的正确性,这在互测中也有比较大的便利性。
第二单元只有通过手动构造数据进行测试了,不会写评测机。仅通过手动构造还是难免会漏掉想不到的情况,这也导致了一些bug的出现。但通过研讨课同学们的分析,也大致懂得了一些评测机的构造思路,主要是通过电梯状态的转化顺序是否正确等来判断结果的正确。另外通过jprofiler对程序进行跟踪,特别是多线程程序,非常有助于寻找死锁、tle等bug的位置。
第三单元主要也是通过手动构造特殊数据进行测试,特别是边界大数据,因为第三单元正确性基本上不是很大的问题,主要的问题在于方法的复杂度是否过高。对于正确性的检查通过简单的对拍击对多个程序进行比对即可发现。
第四单元除了手动画图通过课程组给的jar包进行转化就没用别的方法了,评测机实在是不会。不过通过比较复杂的UML图进行测试,还是能比较快的找到对应的bug的。
对于所有的测试方法,找到bug最多的方法还是手动构造大数据和边界数据,通过这些方法找到了很多编写初期的bug,比较隐蔽的bug则主要通过对拍找到,其他的就是靠强测了
课程收获
-
java语言的入门
通过OO课程的学习,通过大代码量的练习,较为熟练地掌握了java语言的编写,理解了java语言的许多语法和机制,如类的概念、各种各样的容器和多线程等等。
-
面向对象思想的入门
通过OO课程的学习,开始接触到了面向对象的思想,熟悉理解了继承、多态等等机制,还熟悉了一些简单的设计模式并进行简单的运用,对代码能力有了较大的提升。
改进建议
-
希望实验课能够有所反馈,做完实验都不确定自己做的对不对,结束后也没有相应的答案或解析等,感觉这样实验课的帮助不是很大。
-
pre的设计难度梯度可以更大一点,第一单元的作业和pre的难度比起来在我看来差距还是很大的,一开始写起来还是比较不知所措。
-
希望能够在每单元作业后可以展示一些优秀作业的代码,让我们看看更好的优化、更好的设计的代码是怎样实现的。特别是前两单元,做完后都会感叹大佬们究竟是怎么做到这么好的优化的。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。