BUAA-OO-Unit4总结

一、第四单元作业架构设计

1、第一次作业

  第一次作业的目的是实现一个 UML 解析器,支持 UML 类图的分析,可以通过输入相应的指令来进行相关查询。而我们需要做的有两个主要任务。第一点,虽然助教给的第四单元指导代码里已经给出了类图各元素的类,但是因为指令算法的需要,我们仍然需要自己进行建模构造一些属性和方法帮助进行相关算法运算。同时第二点就是我们也需要给出UML类图的输入处理逻辑代码以及对相关指令给出算法代码方法进行运算。而就于第一点,我创建了非常多的类图元素类,包括class,interface,operation,attribute等等不一而足。而第二点算法主要依赖于MyImplementation类,里面用于存放输入和各种指令算法代码,算是三次作业里最核心的类。而我第一次作业的架构就是如此搭建起来。

2、第二次作业

  第二次作业扩展了UML解析器,不仅支持UML类图分析,还增加了UML顺序图和UML状态图的分析,并且也新增了两种相关图的指令,而我们的任务和第一次并没有太大区别。仍然是需要自己创建UML顺序图和UML状态图相关的元素类以及在MyImplementation类里新增相关算法代码,其中需要。这里需要注意的是,初始状态类和结束状态类都要继承普通状态类,方便算法调用。而在加入算法代码后,MyImplementation类超过了500行,不符合checkstyle,因此我又新建了一个Function的类,存储了静态变量和静态方法,方便MyImplementation类随时调用。

3、第三次作业

  第三次作业与前两次不同,不再是新增对UML相关图的分析,而是需要在三种UML图创建之后根据 UML 规则进行一定的规范性验证,如果不符合规范,那么会输出异常,有条件的查询指令也就无法使用。本次作业架构没有太大变化,只新增了Association,AssociationEnd和Collaboration的元素检验类以及新的Function2类用于存放静态异常检测方法便于MyImplementation调用。

三次作业总体架构见类图:

 

 二、架构设计思维及OO方法理解的演进

1、第一单元

  第一单元的主要目的是需要我们对一个表达式进行化简和去括号的处理。这也是我们OO课的起点。在第一次作业时,由于比较简单,并没有很重视架构的设计和代码的扩展性就草率地完成了作业,虽然并没有bug,但是在第二次作业处理嵌套括号时可谓是吃尽了苦头,只能选择重构,浪费了大量的时间在架构的重新搭建。也就是在那一刻,我明悟了架构设计的重要性,从而下了很大的功夫去研究架构,从而顺利渡过了第三次作业的任务。同时我也是第一次接触到面向对象的思想,在代码的层次化编写中(表达式,项,因子)初步领悟了类和对象构建的重要性,以及面向过程编程的缺陷,那就是写代码容易失去方向,而面向对象的思想足以弥补这一点。

2、第二单元

  第二单元是模拟多线程实时电梯系统,主要难点就是多线程的搭建以及对阻塞和唤醒线程的理解。当然,这一单元的难度是极大的,即使有着第一单元的经验,这一单元面对线程的难以debug的特性,也会手忙脚乱。但是架构的思想还是非常重要。正因为梳理了一遍架构,我才能顺利创建电梯,乘客,调度,输入类并加以完善,同时理清它们之间和线程的关系并加以联系,及时唤醒和阻塞正确的线程对象,对面向对象的思维理解地更加深刻,最终还是比较顺利地完成了这一单元的任务。

3、第三单元

  第三单元的任务是要实现社交关系的模拟和查询,目的是为了掌握JML这一代码语言。第三单元的难度相比前两个单元就降低了很多,但并不代表架构就不再重要。因为社交关系可以被模拟为一个图。而Network,group,people等类之间的关系错综复杂,必须提前对架构加以剖析才能有条不紊地完成,同时后面还加入了各种Message类,需要在架构中合理地安排这些对象,用面向对象的思想编写算法。最终还是顺利完成任务。

4、第四单元

  第四单元的任务就是编写UML解析器。这一单元可以说是架构的集大成者,对架构设计的要求极高。因为类图,顺序图,状态图的各种元素都是有着明显的层级和划分的,需要按部就班地一步步搭建架构,添加类元素之间的关系,让它们相互包含,最终实现我们想要实现的指令算法。所以,最终我搭建出了一个非常庞大的架构,大约20种类互相交杂,关系密切,可以说我的架构设计能力起到了至关重要的重要,也是我这四个单元以来训练自我的成果体现,同时也对面向对象的思想更加熟练地掌握和运用,最终拿下了这第四单元的作业。

 三、测试理解与实践的演进

1、第一单元

  第一单元的测试我使用了极端数据构造样例,同时还带有多层嵌套括号之类的表达式,确保能覆盖几乎所有数据,但难免会有疏漏,还是会产生bug。而这也是我第一次接触真的意义上工程量庞大的测试,可以说挑战性也非常之大。

2、第二单元

  第二单元的电梯测试,性能至关重要。而相比于第一单元的正确性测试,第二单元的线程无疑让测试难度更上一个台阶。但是我还是在助教的指引下学会了使用windows的命令行工具,来测试程序运行的时间戳大小,也明白了性能到底该如何进行测试,对我个人的测试水平有着极大的提升,也让我更加明白测试的重要性。

3、第三单元

  第三单元的JML规格难度不大,但算法的时间非常重要,容易超时。因此,我个人着重对某些方法比如isCirCle,qbs等等进行性能测试,这样就能保证整体的代码性能变好,我的测试能力也在逐渐变量。

4、第四单元

  第四单元的UML解析器其实相对来说没有性能的问题,也不容易出现bug,因此测试起来也相对轻松,这里就不过多赘述了。

 四、课程收获

  上完这一学期的OO课,我可以自豪地说,我投入的时间最长的科目就是OO课程,我不知道有多少个日夜都奋战在代码的编写,debug和测试中,以及在课上聆听吴老师的教导,指引我们去更好地理解面向对象的思想,同时更好地完成代码作业,同时还有研讨课大家的热烈讨论,分享观点和思维,最后还有一个个OO课程实验,在每一单元指引我们前行的方向。时间流逝地很快,但我想,这一切都非常值得,经过一学期地磨砺,我的整个人的水平获得了巨大的飞跃和提升。首先,就是我的java的编程水平肉眼可见地从什么都不会到得心应手,同时也学会了一个重要的工具git和gitlab网站的使用。并且,我在其中学会了表达式建模,多线程,JML语言,UML图分析等重要的工具手段以及相关代码的测试能力,可以说极大地拓展了我的眼界,使我初步具备了完成一个完整项目的各项能力,也在一定程度上提高了我的架构设计能力。同时,我也完成了从面向过程到面向对象思维的转换,对我的编程有着巨大的帮助,可以说使我受益终生。并且,研讨课也让我锻炼了自己的交流和表达能力,让我勇于分享经验,同时也能汲取别人的思想精华。综上,OO课程带给了我巨大的收获,受益颇丰。

 五、三个具体的改进建议

1、继续优化指导书,尽量避免歧义的出现

  助教们的指导书其实已经写的非常用心,对我有着极大的帮助。但是在某些比较具体的地方,指导书有时就会给出一些模糊的概念,或者略去不谈,使得代码完成的细节有时容易被误解,同时形式化描述固然严谨,但是可以给出更详细的指导来帮助理解形式化描述,比如加入一些基础的例子等等,而不只是抽象的结构。

2、增强实验课任务的指导性,尽量避免难度过高的谜语代码填空

  实验课的代码对我们每一个单元的作业实现起着极大的指导作用。但是在某些时候,实验课的代码提示过少,让人难以猜出代码的目的到底是什么,浪费了大量时间猜测代码的真实含义和填空所需,这样它的指导性就有所下降。所以我希望可以多增加一些代码填空的提示,来让同学更能把握整体构架的设计,并且不会拘泥于代码的填空,能更好地完成实验课的任务。

3、增加测评机搭建的入门教程,让完全没有相关的经验的同学们可以独自搭建评测机

  指导书的内容非常丰富,但非常可惜的是对于评测机的搭建以及相关数据的生成并没有非常好的教程,只能靠同学们自己摸索,效率极为低下,因此评测机也很难被搭建出来。而评测机的搭建本可以让同学们都加以掌握,却缺失了这一教程,着实可惜。

posted @ 2022-06-29 08:30  谷小来  阅读(33)  评论(0编辑  收藏  举报