第四单元总结
第四单元总结
一、 本单元架构设计
本次作业的一个重点就是把原本按照父子关系链接的elements分析并用合适的数据结构存储起来。我选择的方法是按照元素之间的逻辑关系来构建,也就是UMLCLASS下分出attribute, operation等属性,以及father来存储父类;UMLINTERFACE下分出attribute和father属性;UMLOPERATION下分出parameter这样做的好处是结构清晰,符合逻辑。但是代价是由于各个类都需要写很多的方法,且提前写的很多代码后来才发现是用不到的,造成代码量大、比较繁琐的缺点。第二次作业和第三次作业我基本上都是按照第一次作业的架构来进行拓展,同样根据元素之间的逻辑关系来构建相关的类。这样构建下来,各个类之间的逻辑关系是非常清晰的,这保证了后面新添测试方法时可以只依靠现有的结构,不需要再重新添加新的属性、类等。当然,副作用就是其实有一些方法和属性根本就没有用到。但总的来说,我认为按照逻辑的结构构件效果还是很好的,可拓展性很强,而且易于理解不容易犯错误。
二、 四个单元总结
关于第一单元,我认为第一单元并不适合于面向对象的方法,毕竟第一单元里cos、sin、x^k这些函数之间的关系并不是简单的一层套一层,而是互相包含。如果你按照面向对象的方式把函数分为cos、sin、指数函数、多项式函数、这些类,那么你会发现,不同对象之间的关系是十分吊诡的,他们可能是相加,可能是相乘,可能是乘上一个常数再相加,还可能是嵌套。而你在进行求导时,cos、sin这些不同函数类别求导是很简单的,真正复杂的是这些函数相乘、相加、相互迭代起来,你如何对这些不同的关系分别进行求导,如何存储求导之后的结果,如何保存原来的函数,这些都是很复杂的。形而上的说,面向对象所擅长的是把不同的事物分门别类,每一类事物有其自己的特性与处理方法。然而,第一单元的难点并不是每一类有哪些方法,有哪些特性,而是关于不同的类别之间是如何组合起来的。而一个类下的方法涉及到另一个类下的一些属性,这样的方法的存在本身就是违背高内聚低耦合的要求的。我认为采用面向过程的方式,将求导这个过程分解为f(x)*g(y)求导、f(g(x))求导、f(x)+g(x)求导这三种子过程,然后利用迭代不断地拆解下去,这样一个方式才是第一单元的正确解题思路。事实上,迭代这个思路本身就非常不面向对象,迭代要考虑的就是三个核心问题,初始状态,结束状态,每一步的状态变化。这显然是非常面向过程的。
第二单元的电梯是让我比较深刻的理解到了面向对象的,要实现多线程就必须把问题拆解出一个个类,让其中一些类实现让实现run方法。按照面向对象的方式把问题拆分成电梯、乘客、控制中心这些类是非常自然的。
第三单元的jml规格其实并没有太多关于架构的自由度,完全是按照jml的描述来的。这一单元唯一的难点也就是如何选择算法如何实现要求的方法了。不过这一单元也让我意识到了选择合适的数据结构的重要性。
最后一个单元其实跟第三单元没有太多不同,基本上就是按图索骥了,在架构设计方面,按照不同元素之间的逻辑关系,一层一层的包含下来,这个架构是非常自然的。
三、 测试与实践
在测试方面,第一个单元我还是基本上在随缘测试,自己随便测试一下几个边界条件。第二个单元开始自己有针对性地做一些测试,但依然是针对自己觉得可能会出错的一些地方,以及一些比较极端的测试样例进行测试。这两个单元我测试还是主要通过直接输入的方式。第三个单元开始,我开始使用junit进行测试,这时候我还是针对一些比较容易出错的方法,但已经不同于之前依靠屏幕输入的方式,这样的测试针对性更强一些,但是写起来也比较麻烦。第四单元基本上不太需要测试,把样例拿来测一下基本上就过了。
四、 课程收获
一学期的oo学完,我最大的收获是掌握了一种新的编程思路。可以说是把之前有些随意的编程方式给完全工程化了,升级到了一套完整的方法论的级别。通过这门课程,我完全抛弃了过去那种十分随意、写起来没有什么章法的编程方式,改变成了面向对象这种非常系统的编程方法。并且,通过练习与体悟逐渐掌握了一些编程中的基本原则,这些经验对与我之后完成更大的项目是十分有必要的。
五、 三个具体建议
第一,我觉得第一单元的函数求导并不适合作为一上来的第一单元,因为他的面向对象的方式其实并不是很符合人们直接思考的逻辑,而且本身难度相比其他几个单元还是要略高的。甚至,我觉得函数求导的方式更偏向于面向过程而不是面向对象,具体理由我已经在第二部分写了很多。
第二,我觉得JML规格单元没有太大的实际价值,采用JML语言编写的程序描述文档过于繁琐,而且实际阅读起来基本上只要同学是细心的,都不会出问题。所以实际上和之前作业用指导书的方式规定相比,JML不过就是把指导书上的描述性文字替换成了官方包中的JML语言。那么这个单元基本上只是锻炼了一下同学需要选择合适的数据机构、需要去做一些算法方面的设计与优化。这就有点南辕北辙的感觉。
第三,我觉得相比于通过实验的方式学习junit,不如直接在一个单元中把junit编写测试程序作为重点,或者是考察点的其中一部分。这样可以让同学更加注重于junit测试的编写,而现在这样仅仅通过实验的方式,感觉junit还是不太需要,加上比较麻烦,同学们也不太也愿意用。
六、 线上学习体会
线上学习嘛,这个上课基本上就是划水了,完全就是只做作业和实验的。不过我系专业课一贯也就这样,隔壁计组和OS在线下的时候不也一直是这德行,所以也没什么别的体会了。

浙公网安备 33010602011771号