OOBeiHang Unit4 Report
The UMLParser!
前言
我已听到假期的呼唤!
目录
一、架构设计
二、四个单元架构设计演变
三、测试的演进
四、课程收获
五、改进建议
一、架构设计
本单元对于需要频繁使用的元素类,进行了包装,例如讲UmlClass包装为MyCLass,将Attribute、associations等包装在内,便于进行查询与计算。
此外,对于每个部分,都加入了Manager便于管理,即:ClassManager、OperationManager、InterfaceManager、StateMachineManager。
二、四个单元架构设计演变
前两个单元架构设计更为复杂,因为完全由自己设计,所以刚开始是难免混乱,但经历了重构与调整后就主角变得条理清晰。第三个单元不需要自己设计架构,只需要实现即可,第四个单元虽然整体结构有遵照,但是各个元素的内在联系还是需要自己去设计。
在第一个和第四个单元中,架构设计的重点在于如何建立、存储、查询、更新元素之间的关系。在第一单元中是Term、Factor、Expr之间的组织关系,第四单元是Class、Atrribute等元素的组织关系。这一部分可以分为三步走。第一是弄清楚元素本身的关系,事实上,架构中元素的关系是对元素本身的关系的模拟与细微调整。比如Attribute、Operation、Association本身作为Class的内含元素,在MyClass中作为属性元素存在。而SuperClass、Subclasses、Interfaces都是Class与其他元素的关系,为了便于查询也可以作为属性元素存储。第二是决定好各种java中类的设定与如何联系,如果说刚才关注点集中于元素本身,第二步则关注于代码实现,比如Class继承的关系是指记录subClass还是双方都记录等等。第三部则是更细致的容器等的选择。
在第二单元中,架构设计的重点是模拟运行机制。难点在于良好的实现多线程以及性能。困难之处在于, 如何完成模拟过程,以及如何实现较好的调度换乘策略。首先是确定哪些部分作为线程、哪些部分是共享对象需要加锁,其次要注意多线程设计原则。同时,为了具有良好的可拓展性,要关注每个类的功能的良好接口与普遍性。
-
表达式化简
将整体代码分为 读取、解析、合并 三部分。并且表达式的中心结构使用Expr - Term - TrianglePower + Expr。三次作业都通过拓展完成,在第二次拓展过程中由于新增三角函数所以改变了表达式的中心结构,花费了较大的精力。可见中心结构必须具有良好的拓展性。
-
电梯调度
将整体代码分为 等待队列、调度、电梯运行 三部分。并且尽可能将横向电梯和竖向电梯做对称化处理,便于更好的实现与更清晰的结构。不过坏处在于失去了横向电梯循环的特性。调度策略采取改进的Look。线程间通过共享队列进行交互。第二次作业选择了重构,第三次作业则是拓展。
-
社交网络模拟
本次架构JML已经帮助写好。主要也可以分为三部分 元素、关联、信息系统。每次拓展也都比较简便。不过为了提高性能在算法、容器以及过程的选择中花费很多精力。而这部分在其他单元却思考并不多。
-
UML解析器
将整体代码分为 类图、顺序图、状态图 三部分。这是由于UML元素本身性质决定。三次作业也均通过拓展完成。
三、测试的演进
-
第一单元
由于第一单元测试数据并不复杂而且容易判断对错,对于表达式的测试仍局限于自己构造边界数据,写出可能出现问题的点,比如边界数据、复杂求和、三角等,将它们糅杂在一起徒手造出数据。
-
第二单元
对电梯架构与实现本身花费了很多时间,导致测试包括构造数据等花费的时间大大压缩,加上自身的懈怠,几乎没有足够的测试,导致第二单元出现的bug是最多的。这也使我在后续加大了测试的力度。
-
第三单元
第三单元我自己写了评测机。主要聚焦于两方面,一个是随机构造数据,用于检验各种奇奇怪怪的情况;另外是通过特定构造大量耗时的数据,来检测是否超时。正确性方面通过与舍友的对拍检验。每周每次作业基本上会拿出一整天跑自动评测机。所以正确性上没有出现bug,但是第二次作业中一个特殊指令我在写评测机时忽略了考虑。在第三次拓展评测机时,我更改了思路。用于测试性能的部分我不再是通过人为的干涉,而是遍历所有的数据,每一个都进行了大量的性能测试。这样避免了上次出现的问题。
-
第四单元
第四单元的测试数据极其复杂,所以仍然通过评测机随机生成模型,不过在测试查询指令时,将所有指令进行遍历。将结果与舍友对拍。保证了正确性。
主要遗留问题时没有使用Junit工具进行测试,这一点可以再后续在进行深入学习与拓展。
四、课程收获
现在我们常说的艺术,往往具有技术性、形式性、审美性的特征,高德纳的巨著中也命名为《The art of computer programming》。我们该如何理解应用呢?对于每次架构其实我们都会有直觉似的美感,或认为是代码屎山,或成就感满满。而这种直觉的美感往往会影响到准确度上。而这种直觉的美感正式艺术的灵魂元素。
所以,我们应当像对待艺术一样,首先我们要整我好基本的形式、原理、技巧。很多设计模式,代码语法都是形式,而原理则是一些数学知识以及设计原则,技巧是我们在平常积累的用法或经验。更重要的是,我们要利用好这种直觉的美感。这样我们可以收获更多的快乐、动力与成果。
五、改进建议
-
可以增加一些对于基础知识的讲述,或者给出更多的一些网站、博客。或者在预习课程中,或者在教程中,能够帮助同学们更好的理解,也便于查阅。比如:UML语言、设计模式、Junit以及其他拓展部分。
-
实验部分可以能够及时反馈对错,并给出正确答案。
-