什么是OO?
面向对象,是一种编程的思想方法,但是在这门课程中,我们实际学习到的是将理论运用到具体实践上,将自己的想法付诸实践,不断去探索和优化的这一体验。
后两次作业架构总结
本单元两次作业,我们面对的是一个比较大的数据模型,类似于图,因此首先是如何存储以便方便访问和查找,我首先是实现的是最简单的暴力存储,对于所有的指令都存到一个可变数组中,需要用时再进行查找,但是在后面不断实现方法的过程中却发现,这个方法十分累赘,不仅没有用到面向对象的思想,而且每次查找使用多层遍历的方法将使得时间复杂度相当高,后来将UML图的类,接口等数据结构都建立对象来进行管理,面向对象的思想在最后两次作业中突出的比较明显,而这样的想法也是本学期前面多次训练的结果,因此我使用的架构就是对类,接口,方法,继承,实现等等要素进行对象化管理,建立他们自身的属性和方法,最终在一个类中进行调用,避免了多次重复的遍历,明显降低了时间复杂度。
前四次作业OO演进
第一单元的多项式作业对于我来说是一个十分巨大的挑战,初次接触这种工程量较大,信息量较复杂的题目,在数据结构和C语言中我总是习惯一个主函数来实现所有的方法和功能,而其他的函数只是一些细枝末节的补充,只是使代码看起来更加简洁,但是实际上对整体设计没有过多影响,可以说是一个函数莽到底,在第一单元的作业中我也是使用类似的想法,对于算法的设计十分关注,将所有的信息用人脑来处理,导致出现了很多细节上的差错,甚至可能半个小时前想到要写的代码,之后完全忘记了,导致缺失了整个功能模块,还存在大量的细节bug难以被修复,导致在第三次作业中道崩殂,十分惨淡,回想起来第一单元作业的C语言写法完全没有用到面向对象的思想,写起来也是十分的痛苦。
第二单元作业中关于电梯的多线程调度还是很有意思的,在多线程的设计模式里面,我感觉是比较容易实现面向对象的功能,也很好的引导了我们从面向过程到面向对象的跨越,因为很多多线程代码的规格和规范都已经有很多书籍和ppt可查,我们可模仿的程度很高,那么前两次作业都是没有太大难度的,而且写出的代码也比较面向对象,但是第三次作业的难度在于调度算法的实现,对于数据结构,算法的知识提出的比较高的要求,写起来也是比较困难,我也发现自己一遇到算法比较复杂的题目就会严重倾向于面向过程的写法,问题就出在没有理清路线,分析好问题,在分析阶段就将问题使用面向对象的思想来处理,我开始意识到分析问题阶段的面向对象思想。
第三次作业是JML规格设计,这一单元我主要收获了对JML的理解,我起初认为JML就是完全把你的代码设计好了,只需要按照他的要求写出代码即可,后来实际操作才发现他仅仅是提出了要求和给出了条件,而具体如何解决问题,具体如何设计还是自己的问题,因此在设计的时候仍需要注意运用面向对象的思想,如果把这一单元的作业当成图的编程题来写,那么这将是一道比较困难的编程作业,如果将这一单元的作业融入面向对象的思想,实现结构分层处理,那么关键在于理清问题的层次结构和问题的等价性等等,图的算法就显得不那么重要了。
第四单元我认为还是比较难的,工程量有点大,主要是一开始对指导书的描述没有考虑的很清楚(其实感觉指导书有些地方没有交代清楚),然后就是改结构和写代码的事情了,又一次的重构,我将第一次面向过程的代码改成了面向对象的代码,也是这学期下来面向对象思想学习的体现吧,具体的算法方面并没有提出了很多的要求,但是对于层次和逻辑的理解仍然后很高的要求,如果没有逻辑性好,清晰易懂的代码那么debug的过程将无比痛苦。
课程收获
1、提前完成任务是个好习惯,第一单元就让我认识到OO的任务量巨大,如果赶在ddl前再开动,万一有差错将是毁灭性的,因此给我最大的教训就是摆脱拖延症,提前完成任务;
2、面向对象思想的学习,从一开始的不理解,到现在的具体实践,较大的代码量让我认识到了面向对象思想在工程开放上的重要性,面向过程的代码始终不能成为工程应用代码,面向对象的思想很好的规定了代码的逻辑架构,减少了代码bug,易于多人团队之间的工程开发,是必须要掌握的编程思想;
3、JML/UML等等工程开发工具的了解和使用,理解这些感觉让我更接近真实的工程应用开发,从一开始的代码规范,到JML规范再到UML三种图的学习,这些规范的学习和掌握是未来工程开发的必备技能,仿佛让我走出了单调单纯的百行代码行天下的解题模式,而来到了更大的更真实的代码开发环境;
4、设计的重要性,设计是整个工程代码是否成功的关键,这么多次作业让我明显地感受到,在复杂的要求面前,错误的设计会带来巨大的工程量、丑陋不堪的代码以及各种莫名其妙的bug,而正确的设计则会使程序更加简洁和清晰,不仅健壮性更好,写起来也更加得心应手
三个具体建议
1、上机。这学期的上机紧接着课程进行安排,后面的上机内容明显和善很多,但是前几次上机太过硬核,因为是刚刚上完课的内容,完全没有消化就进行作业练习,基本上是现学现卖,难免出现很多错误,虽然这个学习效率很高,但是对成绩的影响着实让人心痛,认为这样的安排不合理,建议是希望分开上课和上机时间,并且对每次上机的内容有助教写标答吗,或者参考程序;
2、讨论区。讨论区发表的讨论无法删除修改比较难受,希望改进,感觉氛围有点拘谨,有些人可能不敢发言,每次作业讨论不够激烈,希望能放宽一些讨论区规范,活跃一下氛围;
3、时间安排上。能否缩减一些互测时间而增加自己写代码的时间?感觉到后期互测的活跃度明显降低,希望能给出更多的时间调整自己的架构