面向对象第四单元及课程总结

面向对象第四单元及课程总结

一、第四单元架构设计的总结

  • 第四单元的需求是让我们实现UML解析器。需要我们提前了解UML的有关知识如关联、依赖、泛化等。对输入的类图、状态图和顺序图元素进行解析。和上个单元类似,程序主体的大部分都已经实现。我们只需要自己实现解析和查询接口。

  • 第13次作业的类图。

    模型的组织比较简单,往后的作业也是在此基础上作增量开发,没有太大的改动。第二次作业增加了模型的种类,第三次增加了验证功能。

  • 第14次作业类图

    类图是三种模型中元素最多的,复杂度相对较高。通过解析UMLelement元素并存储到ClassSetStateSetSequenceSet

  • 第十五次作业主要加入对8种错误情况的判断。这些判断中有些比较简单,只需要在解析的时候存储相应的信息。有些比较复杂,涉及到了图相关的操作,需要建立继承关系的有向图,需要用到DFS判断循环引用。

二、在四个单元中架构设计及OO方法理解的演进

  • 第一单元

    主要是表达式的求导。根据面向对象的思想,需要吧抽象的表达式转化为可操作的对象。体现在类的继承、接口的实现。第一次作业刚开始做时,还是沿用了面向过程编程的思维习惯,在Mainclass类中进行了字符串的读取和处理。在Mainclass类中实例化一个Expression的对象。通过While循环以及使用正则表达式按顺序逐个匹配字符串中的幂函数和常数项。在现在看来还是有许多架构上不完善的地方。根据表达式中成分的层次来设计对象的层次,每个对象对应着一个表达式成分,对象的行为对应表达式的行为。同时在解析表达式方面根据指导书给的文法形式化定义采用层次特点十分明显的递归下降分析法来解析表达式。

  • 第二单元

    主要是多线程的程序设计。与以往的编程不同的是,涉及到多个线程同步与互斥的问题,如果没处理好很容易出现时序相关的问题。需要仔细考虑对共享对象的操作,合理使用synchronized锁。使用wait-notify等方法而非轮询的方法。需要根据三次不同的题目需求和实现来判断是否结束电梯。否则很容易导致无限等待或是提前结束。如第一次作业是输入结束且WaitQueue为空;第二次作业是输入结束且WaitQueue和所有ProcessingQueue都为空;第三次作业是输入结束且WaitQueue和处理队列Dealing都为空。应用生产者—消费者模式,使得需求抽象化。

  • 第三单元

    架构设计上与前两个单元相比,可变性降低。强调规格化。设计的基础就是给出的JML语言。难点在于JML语言的正确理解。该语言是形式化描述语言,不存在二义性。但是不能在实现时完全照搬JML语言的逻辑。无需自己在框架层面创新,但是必须要熟悉给的框架,理解代码功能以及仔细阅读JML以免造成错误理解。通过本次作业我对JML有了初步的了解,能阅读理解比较复杂的jml代码,并在实现时对算法进行优化,在允许的范围内增加自己的方法来优化。也能够对照代码自己编写一些JML注释。本单元涉及图的知识比较多,需要花时间分析来减少图相关算法的复杂度。不能完全按照JML描述的方法来翻译代码,因为这样的时间复杂度可能很高。

  • 第四单元

    第四单元的架构如前所述。就是需要理解UML图和其中的元素。在现有的模型上迭代改进。比第三单元在架构设计上更加灵活。使用时间复杂度较高的算法也不会超时,也不会有太多重复查询,不需要太在意CPU时间。

三、四个单元中测试理解与实践的演进

​ 采用的测试方法包括肉眼debug、手动测试和自动测试等方法。自动测试和黑盒测试主要的优点是能够比较快速、全面地覆盖手动测试难以构造的数据。在互测环节,也可以用自动化的测试程序省下很多重复工作的时间。

​ 采用了逻辑驱动的白盒测试和数据驱动的黑盒测试。黑盒测试主要检验程序的鲁棒性。白盒测试主要是Junit单元测试。关于并发的测试,在本地测试只能测试程序的正确性。但是时序并发等问题在测试平台可能仍然存在。自己的电梯在分配策略上属于平均分配,采用线程安全的容器,故没有出现线程安全相关的问题。

四、课程收获

​ 通过一学期的面向对象构造与设计的学习,充分掌握了面向对象编程语言的一些基础知识,包括继承、接口、容器等。熟练后感觉面向对象编程似乎确实比面向过程编程要容易、具体、更好上手。还学习到了多线程编程的相关知识。对于多线程有了初步的了解并学习到死锁的避免。学习了JML形式化编程语言和Junit测试。UML语言的学习使得我对代码的层次化有了更深刻的理解。以及学习到了形式化编程的思想和UML类图相关的知识,希望在以后的实践中能够对我有所帮助。

五、三个具体改进建议

  • 第二单元的互测可能造一些特殊的数据,去卡一些本来不是要考察的内容,在本地造的数据可能hack了别人,但是在评测机上又无法hack成功。因此我觉得第二单元的互测部分可以再改进。
  • 上机实验可以给出题目解析,方便课后同学自行纠错,对上机实验的成绩也会有把握。
  • 可以将预习作业和第一次的作业内容和难度有所衔接,这样刚开始的时候坡度不会太大,对初学者比较友好。互测的强度可以适当减轻,感觉对bug的查找意义没有强测大
posted @ 2021-06-24 20:31  Kyrie_2  阅读(58)  评论(0)    收藏  举报