oo第4单元总结

OO第四单元总结

一、本单元作业的架构设计

1.第一次作业

第一次作业的时候,将所有的逻辑都塞在了MyImplementation里面,没有什么特殊的架构设计。

2.第二次作业

第二次作业,实现了自己的三种UML图元素,相比第一次清楚了一点,但是很多逻辑仍然在MyImplementation里面。课程组提供的语言风格检查工具,一个方法最多60行,一个文件最多500行,在风格检查的时候就出了问题,只能再多加一个类来存储原本在MyImplementation里面的数据。

3.第三次作业

吸收了前两次作业的教训,将MyImplementation里面的数据、初始化方法和一些常用的方法在其他类中实现,简化了MyImplementation的逻辑。

4.反思

本单元作业在理解的基础上,比前三单元的作业更为简单,但还是有一些需要注意的地方。

  • 架构设计,提前设计好整体结构,通过语言风格检查。
  • 每个 State Machine 中有且仅有一个 Region,而一个UmlCollaboration中可能有多个UmlInteraction。
  • 建议实现自己的UML图元素,存储相关信息,便于后续作业的扩展。

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

1.第一单元

第一单元是表达式化简。

第一单元,由于是刚刚接触面向对象设计,对架构设计思维还不是很熟悉,整体上比较杂乱,嵌套比较混乱,bug比较多,而且难以发现。

也是因为架构设计比较混乱的原因,一些bug牵一发而动全身,限制了进一步的优化。

2.第二单元

第二单元是多线程电梯练习。

这一单元的采用了流水线架构模式,架构设计和常规的多线程设计基本相同,使用多层调度器进行调度。

3.第三单元

第三单元是人际关系网络练习。

这一单元架构设计留给我们的发挥空间不多。主要是在给定的 JML规格的基础上完善方法。

JML规格一旦确定,说明程序的架构设计也已经确定,如果能正确按照规格实现方法的话,程序的正确性也得到了保证。

在本单元的练习中,虽然说并没有自己进行规格设计,但是认识到了JML对于架构设计的重要性。

4.第四单元

第四单元第一次作业没有进行架构设计,第二次作业重构,第三次作业在保证代码风格的基础上。将

MyImplementation里的数据和方法分离,进一步优化架构。

架构设计和代码的质量挂钩,好的架构设计下,出现bug的几率也会少。

从作业迭代来看,第一次作业的架构设计最为糟糕,之后的作业设计的架构逐步优化,但是依然存在耦合度和复杂度方面的问题,还需要进一步改正。

java程序设计的五个原则:

  • 单一职责原则:每个类或方法都只有一个明确的职责。如果类的方法、职责多,就意味着逻辑难以封闭,容易受到外部因素变化而变化,导致类、方法不稳定。

  • 开闭原则:无需修改已有实现,而是通过扩展来增加新功能。

    继承是达成开闭原则的重要手段,需要注意保护好子类和之间的交互关系。

    在oo的作业更替模式下,假设在前面作业已经做好充分的测试的前提下,达成开闭原则,可以帮助我们更好地完成作业,较少bug。

  • 里氏替换原则:任何父类出现的地方都可以使用子类来代替,并不会导致使用相应类的程序出现错误。

  • 接口隔离原则:通过接口来建立行为抽象层次具有更好的灵活性。接口要尽量细化,接口中的方法要尽量少。

  • 依赖倒置原则:是程序要依赖于抽象接口,不要依赖于具体实现。高层不应依赖底层,两者都用依赖其抽象,抽象不应该依赖其细节,细节应该依赖抽象。

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

1.第一单元

主要借助了python的sympy库来进行测试,在本地生成测试数据,利用自己的数据和sympy化简结果进行对拍。

2.第二单元

随机生成数据黑盒hack,利用有限状态机检测正确性。

有限状态机主要是对输出答案正确性的检查,电梯基本上有移动,进人,出人几种状态。每一条输出指令都可以解析成电梯状态的改变,以此保证电梯的状态不会错误,不会出现没开门就进人等情况,同时也可以判断是否超载。

其次对比输入和输出,找出有哪些顾乘客没有被送到。

3.第三单元

第三单元的正确性检查没有找到现成的库或实现,我选择了和小伙伴对拍。

查看JML规格可发现,对于生成的数据并没有严格的显示,如果数据不满足要求的话总会触发异常,而且触发异常也是一种“正确性检查”,所以这里对测试数据没有什么限制。我们可以生成大量的随机数据。

生成数据方面完全随机,在大量的数据投入下,双方都发现了错误,主要还是漏看JML规则,或者是错误理解JML规则的问题。

4.第四单元

第四单元和第三单元一样,也是采用了对拍的方式。

但是本单元的数据生成比较麻烦,因为作业有很多种比较细碎的限制,对拍双方的实现不一样,虽然都正确,但是在细节上会有问题。有些时候出是因为生成的数据问题。但是还是可以发现错误的。

在四个单元的作业中,都会实现一个自动化的数据生成和正确性检查程序,这让我对作业的细节要求更加了解,同时也确实发现了许多bug。

测试也会是我们日后工作的重要一环,掌握更多的测试工具链,会给我们带来很多好处。

四、总结自己的课程收获

首先,知识层面,学习了面向对象设计的思维方式,学习了java语法,并在四个单元的12次作业中进行了练习。

学些了java多线程知识,在第二单元作业中成功完成了多线程的作业任务。

在第三单元的学习中,学习了JML语法知识。在第四单元的作业中,学些了UML图的知识,完成了简易UML解析器。

一次次的作业迭代训练,使得我在设计代码的时候更加注重后续的可拓展性。不断地bug改正,和重构,让我更加重视和完善架构设计。强测和互测机制,使我对于自动化测试的实现更加熟练。

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

1.pre的难度稍微提高,时间延长,并且在pre的时候就进行架构设计方面的学习。

2.希望课程组对于每一次作业可以给出一些比较好实现的代码,供学生阅读学习。

3.在大的单元练习中,可以穿插一些和本单元无关或者有关的小知识点练习,比如容器、深浅拷贝练习等,帮助学生更好完成作业。

posted @ 2022-06-29 10:07  eiang  阅读(37)  评论(0编辑  收藏  举报