BUAA_OO_2022 Unit4 总结
BUAA_OO_2022 Unit4 总结
一、第四单元架构设计
本单元依旧是开始时就已经拥有了大致的架构,大框架就是类图、状态图和顺序图。
本次的输入是已经处理好的数据,这非常的便利但同时也带来了一些困难,便利就是并不需要处理数据了,只需要把相对应的关系构建好,把相应的数据集中在一起就可以考虑实现相应功能了,而困难则是被处理好的数据多并且相应的方法也很多,在一开始接触的时候确实有点混乱,不过在阅读过代码后确实很方便。
对于类图,建立了MyClass、MyInterface、MyOperation三个类,通过MyImplementation分轮读入然后将信息拆开存进去,回过头看这里拆解信息其实是非常不好的,应该只进行简单的分类存储,利用已经有的方法去获取更准确的信息,这样做一方面可以进一步减少处理,另一方面,在最后进行模型有效性检查的时候是需要利用提供的类,接口的,第一次没有存储整体的我只能额外加了进去,这样来看不如最开始就直接存整个元素。对于状态图和顺序图,信息保存的就比较集中,相应的只有MyInteraction和MyStateMachine两个类。
另外值得一提的是这次的架构使得写程序时非常有面向对象的感觉,对于那些指令,只是在MyImplementation调用相应的方法,得到结果,所有的处理都在对应的类中交由其自行处理。不过可能是指令过多的原因,虽然都只有简单的遍历调用函数依然突破了400行的大关。
二、架构设计思维及OO方法理解的演进
第一单元是表达式的展开化简。在这一单元里表达式被分成了因子,项,函数等元素,一个比较麻烦的点在于表达式本身也是因子,所以在这个时候就需要使用递归下降了,在刚开始的时候是照着实验代码进行模仿改进的,虽然因为是模仿的原因感觉像是进行了一定的封装,但是实际上在一些地方还是透露着面向过程的思维。不过好在随后的作业中进行了一定程度的改进,各部分更加的独立,更加的模块化了,但是并不彻底,有些地方关联度还是比较高,纠缠在一起,尤其是一些化简,但是当时还是没有决心去重构,不过在面对最后那已经称得上恶心的代码时,确实深刻认识到架构的设计是多么的重要。
第二单元是电梯调度。这一单元的重点在于处理并发,解决线程安全问题。在开始作业前老师提点过要设计调度器,不过我在前两次的作业中调度器并没有起到调度的作用,只是进行了简单的分发,虽然第三单元用上了调度器,但是采取的调度策略实际感受不如自由竞争,这应该是调度策略比较粗糙的原因。本单元相较于上单元一个进步的地方在于自己确实有意识的使自己的架构能够更好的拓展,适应需求,分离出模块,将任务拆解开,这确实有利于代码的编写,思路也比较清晰,再一次意识到好的架构是非常重要的。
第三单元是根据JML规格理解与代码实现。这一单元没有什么架构设计的需求,但是在这一单元并不容易,一方面想要准确理解JML的需求并高效的实现并不简单,另一方面想要用JML传达自己的需求,设计相应的约束更是相当困难。前置条件,后置条件,对异常的处理,JML是非常的全面并且准确,但是正因为其全面准确,所以在描述的内容复杂起来时需要的限制就很多,就会比较复杂,既难写,又难读,尤其是当自己去写JML时,如果发觉过于困难,这个时候就需要考虑自己的方法是否过于复杂,设计是否恰当了。这一单元我简单了解了JML规格,并且在几次需要书写JML规格时清楚明白自己的掌握程度还很低,虽然这一单元过去了,但是依然需要实践,毕竟本单元主要都在代码实现了,写JML规格的机会并不多。
第四单元是JML的解析器,正如先前所说,这一单元是我感觉最为面向对象的,不过可能是因为这一单元的架构本身的特点所致,自顶向下本身的分层就十分清晰明了。这一单元我对类图,顺序图,状态图都有了更深层的认识,这些内容和架构关系紧密,学习他们可以更好的表现架构设计,并从中看出自己的缺陷。
三、测试理解与实践的演进
在第一单元的时候尝试了自动测试,因为有python库可以保证正确性,但是因为弄的比较晚,所以出现了比较尴尬的情况就是最后确实发现了问题但是已经来不及改完了,不能说没用,只能说用出不大,不过主要原因还是完成的晚。在第二单元采用了百分百的手动构造数据,确实规避了很多复杂状态的问题,但是总有些隐蔽的问题发现不了,确实是没有想到,可能想清楚所有可能的问题所花的时间要比去整自动测试还要多。手动测试确实很难测到所有的情况,尤其是在最后一次作业,出现的问题我都要思考好久才能发现,更不用提提前想到了,但是如果自动测试的话,测出来的几率就很大了。在第二单元,我还意识到手动测试不能测无规律的大数据,因为去分析,并检验答案过于困难,这也是手动测试难以测全的一个原因。到了第三单元,因为基于JML规格可以进行单元测试,所以测试变得比较简单,不过测试要在正确的理解之上才能成功开展,在第一次作业我就遇到了对一个模块进行了我理解中的测试,没有发现问题但是出错了,因为我在看JML规格时理解错了一部分内容,这是比较无无奈的。到了第四单元,因为期末的原因,并没有进行很多的测试,写完随便小测一下就溜了(囧)。
总体而言,我的测试效果并不是很好,原因在于主要选取手动测试却没能分析出来种种潜在的问题,总是会少考虑东西,所以在能够开展自动化测试的情况下,还是自动化测试用大量数据覆盖各种情况才是比较好的选择。
四、课程收获
首先最直接的就是对JAVA的使用吧,虽然以前也写过一点,但并不熟悉。通过一学期这么多次作业的锻炼,对JAVA的使用熟练程度自然是水涨船高,当然肯定还有很多的不足,尤其是多线程的锁的使用,不过通过一个学期已经确实的收获了很多。
其次就是JML语言。通过第三单元了解了基本的JML语法和语义,通过JML实现JAVA代码确实不是一件难事,在完全理解需求的基础上可以比较轻松的实现,不过一定要理解正确才行。最难的点无疑就是自己编写JML规格,这一方面要求方法的设计不能过于复杂,一方面要求对条件的思考准确,同时还要能够表达出需求。总之确实非常的麻烦,不过考虑到没有自然语言二义性的优点,掌握它也就是一件必要的事情了。
然后是UML ,说实话,在第四单元我才意识到自己先前的总结里关于UML的部分是多么的粗糙,很多关系都没有表示出来,在三次作业的锻炼下也算是对UML模型有了更加清楚的认知。最后是代码风格方面相比以前也更加的统一,不再是以前随机的风格了。
五、课程改进建议
第四单元刚结束所以就先说一下这个,可能是考虑到烤漆才把第四单元设置成了UML的学习,但是实际上写起来并不轻松,最大的困难集中在了开头,前面的博客作业要求画UML类图说实话对于没有去深入学习的蒟蒻用处不大。所以个人感觉应该在前面作业或者预习部分就把UML的知识放出来最好,这样能让第四单元轻松很多。
实验代码希望可以给出答案,相比较单元训练,实话说感觉实验对本单元的启发效果更好,但是自己补全的不一定对,也不一定够好,所以比较希望能有标答参考。
研讨课的讨论题目可以更加开放或者提供更多的选题,当选题一致的时候往往前面两三组就可以把在课上能讨论出的内容说全,后面的组只能将同样的内容换一下形式重复,虽然重复的内容可以带来更深刻的理解,不过讨论更多的题目或许也是个不错的选择。