BUAA ObjectOriented Unit4总结 && 课程总结
BUAA ObjectOriented Unit4总结 && 课程总结
概括来说,本单元就是通过对输入的类图、顺序图、状态图进行分析,以一种比较好的方式存储相关内容,以便之后检测该模型是否符合规范,并通过指令查询相关信息,总的来说实现还是比较简单的(但还是要小心,因为要考虑的边界情况有非常多)。
Unit4架构
- 在本次作业中,最好是对官方包中的各种
UML
元素进行包装,实现自己的MyUML
类,在相应类中实现相关的方法以便于实现所需函数。(包装后是真的很方便,面向对象的思维是有道理的,在第一次作业中,我心血来潮试了一下不用面向对象进行编程,结果是越写越吐,在之后两次作业直接大改) - 框架大体上是分为了类图、顺序图、状态图三个模块,其中,每个模块的实现逻辑是通过处理输入元素到相应的
MyUML
类中,通过单例模式的XXProcess
对相应图元素进行整体管理,之后查询函数的实现也是放在了XXProcess
中(因为这样可以管理所有的元素,同时还是单例模式,好调用),这样的架构自我感觉还是挺好的 - 对于算法方面,主要是循环继承牵扯了点,我采用了
Tarjan
算法,时间复杂度为\(O(m+n)\)(主要我也不会高级的算法) - 容器基本上是
HashMap
,键值通常为id
或name
,只有像是收到的信息跟时间有关才采用了ArrayList
。
架构设计思维
-
\(Unit1\):第一单元参考了实验教程给出的代码(也就是
parse
部分),将表达式按照不同的运算种类进行相应的拆分,并且储存起来,同时依靠了表达式层次间的关联,建立了相应的继承关系。大体的代码逻辑为:\[parse→simplify→output \]从整体上来看代码思路还是十分清晰的,但是代码还是有些地方不美观,原因是后两次作业是在第一次作业的基础上添加的,导致原来的抽象程度不够,后面出现问题也只是在原来的基础上打补丁,或许是因为没有面向对象编程的经验吧,抽象方面还是需多加考虑
-
\(Unit2\):第二单元首次接触了多线程,电梯调度类似于一个生产者消费者模型,加上了一些调度器的设计,记上了一些调度策略的问题。这一单元使用了单例模式来实现调度器,对于横向电梯和纵向电梯的层次划分,以及第三次作业中由于换乘问题而不得不使横向电梯与纵向电梯之间进行交互,这使得我不断思考如何解决类与类之间交互使得耦合性降低。同时,最大的收获还是学到了多线程的知识,积累了一定的经验,虽然这一单元出现了很多
bug
,但吃一堑长一智,我收获了更多避免bug
的经验和找bug
的经验。 -
\(Unit3\):第三单元接触了
JML
语言,了解了规格,这一单元由于是根据规格完成相应的函数,大部分时间都是花在了思考速度上,想着能不能更快一点,这提高了我对速度的追求,同时对算法知识也有了一定的复习。 -
\(Unit4\):第四单元学习的是
UML
模型,有点像是第三单元,只需完成一些函数的部分(但是没有JML
),有点像是第一单元,你需要自己划分好类与类之间的层次关系,将自己学会的面向对象编程的技巧熟练地运用起来。如果单就学会UML
来说,我可能达到了目标,但就熟练地使用面向对象的思维来说,我还有很长的路要走。 -
总结来说,面向对象的课程当然是学习了面向对象的思维了,如果说
Java
语言是工具,那么以这个工具为基础要学会面向对象的思维,如果说面向对象是工具,那么以这个工具为基础要积累编程的丰富经验和思维方式。如何将元素抽象拆分,如何考虑类与类之间的层次关系,如何在完成任务的同时提高可拓展能力。也许这些问题我在OO
课上没能完全解决,但OO
课程让我知道了这些的重要性,也为我开了个头。。。
代码测试
- \(Unit1\):通过
Python
的Sympy
库比对结果是否正确以及递归下降生成数据实现对于自己代码的测试,对于难以比对的三角函数部分,采取代入一百个点进行计算后观察结果是否一致。同时自己还要构造一些非常小的数据。 - \(Unit2\):
spj
是室友写的,我写了一些数据生成,但是多线程除了一般的功能测试还必须进行线程安全测试,因此我使用了JProfiler
分析给出的代码运行时个线程状态折线图以及方法的cpu
占用时间检查线程安全问题 - \(Unit3\):只用写数据生成器以及对拍器,唯一的难点就是提高数据的覆盖度。
- \(Unit4\):由于要期末备考,所以选择用别人的数据生成器以及对拍器测试以及肉眼
debug
的方法,但我觉得主要还是眼瞎没看清题目出的bug
以及一些一言难尽的边界条件。
课程收获
- 对于面向对象有了一定的理解,面向对象编程具有良好的封装性,抽象性,但最大的优点是,编程起来非常的方便轻松,自己试过两种方式就能够深刻体会到这一点了。
- 学习了多线程相关知识以及
JML
、UML
等,代码量也得到了较大的提升,有了一点写较长代码的经验。 - 为了让自己的代码更快,补了一点算法知识,为了让自己的代码更优雅,思考了很多细节。
- 提高了一定的心理素质,出现
bug
被扣分扣多了之后,慢慢的心态放平了
改进意见
- 中测的难度太低了,覆盖面也不够广,虽然说是为了提高整体能够参加强测的比率,但是有些
bug
没找到后被扣分真的很难受。 - 有些地方的代价不太合理,有些人的
bug
非常小,却扣了非常多的分,有些人的bug
非常大,却没被发现或者扣分非常少。 - 这门课的目的是教我们面向对象的思维,但是测试数据都是要求我们去注重边界数据,封装性和抽象性好的代码并没有很大优势