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