【面向对象】第四单元作业总结
总述
随着第十四次作业的隐藏点在连续三天的debug中渐渐出现了问题的原因,OO的旅程也即将抵达终点。这一个学期就在各次作业中敲代码debug的艰辛历程中悄然度过了。现在终于可以抱着轻松的心态,以最后一次的总结作业为整个一学期的辛劳画上一个句号。
本单元作业的终点放在了对UML语言编写的UML模型的解析上,通过提供的解析工具可以将.mdj文件中的各个UML元素提取出来,我们需要做的工作是寻找到这些UML元素之间的关系,并将这些关系建立一定的数据结构来存储。作业的要求是完成一些查询功能和一些检测合法性的功能。
总结本单元两次作业的架构设计
第一次作业的架构是很自然的,其实这里UML的架构也正像Java的架构一样,在Class之下有各种实现的接口、各个实现的方法和属性。由于数据的规模比较小,这里还是把建立数据的过程和进行查询、对数据进行处理的过程放在了一起。建立的过程就是根据输入提供的信息建立一张各个元素之间的图。而查询的过程就是对这张图进行查询。
在第二次作业中,根据数据的特点,决定采用如上图的结构。首先建立一个Input类,用于将输入的信息转化为树形的便于查找的信息。然后针对类图、顺序图和状态图分别建立对应的接口类,这些类实现的主要是根据Input的信息进行查询,是对应方法的具体实现办法。然后剩余的各个类是对信息的重新包装,其中除了存储本身这个类的信息之外还存储了这个元素与其他元素之间的关系。
这样架构的好处是把数据问题和方法问题分开了,数据的部分只需要思考如何正确的解析数据,方法的部分只需要思考如何正确的统计数据,这样给后期的debug和扩展当前程序提供了极大的便利性。
四个单元中架构设计及OO方法理解的演进
可以说在四次作业中,虽然说还是有很多的细节会注意不到,会出现bug,但是整个体系的架构越来越清晰,可扩展性也越来越好。
第一单元的作业中主要还是组合式的模型,是根据表达式的特点进行建模,表达式项相加得到,项是term的乘积,term是项加括号或是一个三角函数或幂函数,三角函数是三角符号加上一个项组成,由上面这些表达式的组成规则很自然的可以建立表达式的模型。而对求导的运算在建立了表达式的模型之后也非常简单,直接根据对应的模型建立相应的法则就可以。然后再设计表达式化简的一系列操作,是站在更高一个模型上对低层进行判断、合并模型。经过第一单元的训练,基本上了解了OO应该怎么写程序,特别是第三次作业之后,对如何以继承的方式来进行建模有了一个了解。也敢于去用这些模式解决问题。
第二单元的作业是多线程的问题,主要使用的还是生产者消费者的模型。这个单元的作业涉及电梯的一系列问题,即如何在生产者即输入接口,消费者即电梯,和一个为了优化电梯行为的调度器之间建立一个联系。这里比较困难的是如何建立一个高效的调度器的问题。调度器建立的不好可能导致一些奇怪的bug产生。在课程的最后也了解到了订阅/发布者的模型。经过这一单元的训练,基本上了解了Java中多线程的工作方式。
第三单元的作业是有关规格的问题,也就是根据规格,读懂规格并完成程序的设计。这个单元是架构设计的不好的一个单元,每次作业仅仅为了完成当次的任务二没有考虑可扩展性的问题,因此导致每一次更新问题都要重新架构一次,大大增加了工作量。但是经过这一个单元的训练,逐渐开始意识到如何将复杂的问题分解,并让每个单元尽可能的简单。
第四单元的作业是UML的问题,其实也正是如何去理解Java程序的问题。由于前面的作业中积攒的对Java的认识,导致这一次作业水到渠成的就完成了,并且根据面向对象的特点构建了一系列的继承和关联方法来表示OO模型。可以说在架构的过程中,这是四个单元中最为享受的一个单元。经过这一个单元的洗礼,对OO整个模型框架的理解又上了一个台阶。
四个单元中测试理解与实践的演进
第一单元主要训练的是边界数据的构建。有算法本身不是非常难,所以测试的终点放在了一些特殊的数据点上,比如求导得0的点,以及各式各样的WrongFormat点。第二单元中测试的终点放在了多线程之间的安全性问题上。通过构造一些数据点来故意卡电梯看能否输出正确的结果。第三次作业的重点放在了利用Junit进行单元测试上。由于这次作业本身的算法就比较复杂,所以使用单元测试的手段可以在很早就预防算法本身出现问题。第四次作业的测试终点是如何在源程序中寻找bug。由于输入数据有时很难构造出来,所以我们需要从源码中寻找可能出现bug的问题点,并根据这些问题点构造相应的数据对我们的程序进行更加有效的测试。
课程收获
在语言训练方面,每周有至少1000行左右的代码训练量。
学会了单元测试这种发现bug的利器,开始使用自动化的测试方法。
学会了在Java中如何去完成多线程的任务。
重构了n次代码之后,发现编程最大的问题在于如何架构而不在架构中如何写算法,开始意识到架构的重要性。
学会了用规格的方式去描述程序。
学会了画UML图来表达模型。
改进建议
首先感谢各位老师和助教团队这一个学期以来的辛勤付出。
1.建议开放一个共享的测试数据区,用来公开各种同学们制造的测试样例。我们在写程序的过程中思维很容易局限在某些方面而产生一些bug。这些bug除非我们灵光一闪突然想到了某方面的问题,或者看到了某些测试数据,否则非常难发现,而开放一个测试数据区可以让我们避免这个问题。同样,也可以增加指导书的样例部分。同样的,提供一些样例也有助于我们理解问题。
2.建议将第四单元作业提前,第四单元的作业是提升大家对OO认识的一个重要单元,提前这个单元可能对后面的作业有所帮助。
3.在每单元第一次作业在课堂上就讲一些建议的架构和可能的扩展方向。重构虽然是编程过程中一个非常重要的环节,但是把大量时间放在重构上着实降低了课程训练的效率。通过每次作业之前公布整个单元计划的方式,我们可以更加注重每一次作业如何去注意可扩展性。由其是每一个单元的第一次作业一般都比较简单,我们可以在这一次作业中更好的去设计架构,更好的去平均每一次作业的任务量。