OO终章

一.总结本单元两次作业的架构设计

  第四单元共有两次作业,第十三次作业是实现一个UML类图解析器,可以通过输入各种指令来进行类图有关信息的查询;第十四次作业是在第十三次作业的基础上,扩展解析器,使得能够支持对UML顺序图和UML状态图的解析,并能够支持几个基本规则的验证。

①第十三次作业

  本次作业较简单。输入的UmlElement间具有层次结构(例如一个class或interface下包含多个attribute、operation以及他所实现的接口和继承的类或接口),而所要求实现的功能也主要是围绕Umlclass和Umlinterface展开的,因而可以围绕这二者建立树状结构,并在此基础上实现各类查询的功能。

  从架构的设计和实现的角度来讲并不复杂,值得注意的是如何保存中间结果以避免大量重复计算(部分功能需要通过递归实现)。

 

②第十四次作业

  本次作业在上次作业的基础上加入了流程图和状态图的解析。其中,类图的部分可以完全沿用上次成果,状态图和流程图中各element间关系虽然复杂,但由于作业要求简化的原因,无需对所有元素间的关系进行建模,所以也并不复杂。我选择新建MyUmlStateMachine和MyUmlCollaborationInteraction类来分别保存状态图和顺序图的信息。

 

二.总结自己在四个单元中架构设计及oo方法理解的演进

    第一单元的作业是对表达式进行求导。在进行第一单元作业,由于初次接触面向对象,尽管我已经刻意地去抽象化建模,在实现的过程中依然混杂了许多面向过程的思维方式和代码风格,整体显得比较不伦不类。到第一单元快要结束时,才发觉自己对“一切皆对象”有了更深入的理解,在建模时不再粗暴地把所有的主要方法封装成类,而是更上位地,划分行为和属性,同时看到方法间的共性。

    第二单元的作业是多线程电梯的调度问题。这是我第一次接触多线程编程,尽管老师在课上分析了多线程的安全性问题,也讲了如何解决竞争避免死锁,但…真的面对实际问题时才能体会到问题的复杂性。随着课程的展开,我才渐渐掌握了如何兼顾效率和安全。在本单元中我吸取了上一个单元的教训,在动手打代码前仔细思考了程序的结构,尽量让代码易于扩充,避免大量重构。同时,老师上课讲到,各个类应该尽量“自家各扫门前雪”,因而我在对问题进行建模时也着重考虑如何界定每个类的行为和属性,把联系较少的对象分离开,做到“高内聚,低耦合”。不过这句话说起来容易做起来难,前几次作业还好,把电梯、请求队列、调度器分离开来即可,但最后在多电梯作业中为了优化调度策略,我在部分功能的实现上又出现了面向过程的方法。总而言之,在OO方法的理解上,较第一单元有所长进,不过从架构设计和优化上看,对OO的理解还是不够的,还有很大的提高空间。

    第三单元作业为根据代码规格编写代码实现一个地铁系统,并可以对该系统进行增删和查询操作。这一单元的主要目的是理解JML规格。在完成作业的过程中我学习着封装了一些数据结构,使类的功能性更加集中,而且复用性更好。我个人感觉我在架构设计上较前两个单元有了明显的进步,一方面是我在考虑问题的时候有了更清晰的思路和更明确的目标,另一方面则是我在实现函数、封装数据结构的时候能更好地将其变为对象的属性和行为而不再是为了实现功能而面向过程。

    第四单元的作业是对UML三种图的解析和实现一些规则的验证。这一单元作业重在对uml图的理解和掌握,虽然需要处理的UmlElement类别很多,但如果理解了uml图中各元素的功能和意义就能很轻松地设计好架构、组织好代码。

    在这四个单元中,我们从不同的角度接触了OO。我们通过自己的不断练习和对优秀作业的学习,一点点地蜕变,在面对新作业时早已不会像第一次写OO作业时那般不知所措,在OO方法的理解上也有了不言而喻的进步。现在在读完指导书后会先思考如何把需要考虑的东西做合并和分离,如何利用类之间的关系高效地进行存储和运算。

 

三.总结自己在四个单元中测试理解与实践的演进

    回想一下这四个单元的所学,除了对OO的理解得到加深之外,我对于测试的理解和实践能力也得到了加强。

    第一单元的问题比较具体明确,因而在测试时我主要是进行了边界情况测试和交叉情况(项混杂在一起)的测试。

    第二单元的作业是多线程,这就会导致结果存在不确定性。因此即便写出较为完善的测试样例,在某一次测试中得到了正确结果依然不能保证代码的正确性。所以一方面我们需要从理论上证明多线程并发的安全性,另一方面我也开始学着搭建评测机,试着进行自动化找bug。虽然我实现的评测功能不全面,但也帮助我发现了部分bug,并且促使我不断尝试搭建更为完善的评测机。

    第三单元课程组推荐使用JMLUnitNG和JMLUnit进行编程式测试, 因此我在搭建评测机的同时尝试了模块化测试,加深了对功能测试的认识。

    第四单元要输入指令来对图进行查询,其中图的生成部分很难自动化实现,因而我选择针对各条指令手动搭建具有针对性的图,以此进行测试。

 

四.总结自己的课程收获

    一学期转眼而过。OO的四个单元各有侧重,带着我们从初学Java、初次接触面向对象到熟悉OO的方法和架构设计,再到学会编写规格,最后掌握Uml图的设计和理解,整个过程学起来并不算简单,但于此同时也是收获满满。

    总的来说,四个单元的作业,万行左右的代码,加深了我对面向对象的认识,提升了我运用java编程的码力,也让我对架构设计和优化的认识和实践能力有了很大的提高和加深,同时,我也学到了许多对代码的测试技巧。

    收获颇多,难以一一列举,感谢用心的课程组和奔走在第一线的热心助教们。

 

五.立足于自己的体会给课程提三个具体改进建议

  • 个人感觉有部分上机课难度较大,比如刚刚学完的知识紧接着上级就要求手写代码可能难度较大,建议降低一些难度或者给出一些示范。
  • 希望指导书的说明能够更加准确。明确任务目标并不是为了在打代码时偷工减料、面向评测机编程,而只是为了在考虑一些边界情况是不会出现争议。
  • 个人感觉各单元三次作业间的难度关系还可以进行调整。比较明显的是第二单元电梯调度问题的第二次作业,相比于第一次作业而言要求并没有复杂太多,对于第三次作业也没有起到铺垫的作用。
posted @ 2019-06-23 00:08  月中眠  阅读(200)  评论(0)    收藏  举报