OO课程第四次总结
终于来到了最后一次的OO作业,以博客作业的形式来终结也是极好的,回顾一下过去十六周自己的经历,感慨颇深。
测试和正确性论证
简单来说,测试的目的是将程序的代码做到全覆盖,从而确保每个分支都运行一遍,进而分析代码中是否有错误,错误出在哪里。这个方法是十分实用的,可以有效的找出自己代码中的错误,即很容易发现浅显的错误,但不容易发现隐晦的错误。编程的经验告诉我,确实存在那种执行了多条代码之后有了不一样的结果,一环套一环,这种情况虽然很难发现,但确实存在。而正确性论证则不同,它通过大量的穷举,基于repOK和jsf来论证正确性,可以说绝对正确,但时间复杂度实在太高了,远高于写这份代码的复杂度。
OCL和JSF
OCL的基础是数学中的集合论和谓词逻辑,并且它有一个形式化的数学语义,但是它并没有使用某种数学符号。因为虽然数学符号能够清晰的、无歧义的表达事物,但是只有极少的专家可以看懂。所以数学符号并不适合用于一个广泛应用的标准语言。自然语言是最易懂的,但是它是含混不清晰的。OCL取了自然语言和数学符号的折中方案,使用普通的ASCII字符来表达数学中同样的概念。如果你不喜欢当前的OCL表达方法,OCL规范还允许你定义自己的OCL符号集,这点是可以理解的,因为OCL有一个清晰的数学语义。
相同点在于它们都采取了自然语言和数学语言的折衷,采用了前置条件,后置条件和监护规则的模式,不同点在于OCL有着丰富性和完备的可计算性,更重量化。
UML图
总结
这一学期下来,我从最开始连Java都不怎么会编的菜鸟变成了现在能顺利通过OO的人,期间可谓受益匪浅。要谈到自己的进步的话,从第十四次作业可以看出来,以往的作业真的就是一个超级面向过程的作业,后来才真正的理解了面向对象。
四个章节从最开始的初次提到面向对象再到后面的多线程及线程安全,是编程能力的提升。抽象与规格则要求了规格化的编程,最后强调了工程化的质量。
有一个很简单的评测标准,那就是方法的行数,实不相瞒,最开始我的Java代码有过一百多行的方法,写它的jsf简直要把我写死了!后来到了出租车,基本上就没有了这种问题,但面对之前自己的作业,只能狠下心来重构了。也真真切切的了解到了面向过程和面向对象之间的差距,代码能力也会有显著提高。
我认为工程化开发最重要的是可移植性和便捷程度。因为一个工程需要一个团队合作完成,因此各自负责的部分必须要把接口写好,方便别人使用;同时程序内部虽然是一个黑箱,可这个程序后期是可能进行加工的,并且有可能不是原开发者加工维护,所以代码一定要简洁明了,符合规范。
我对课程的最大期望是,在文件系统的那一章作业,要么降低难度要么增加时间。我的能力有限,时间也无法全部放在OO一门课上,所以有限的时间内我无法保证作业的质量,分到一个心狠手辣的人我就被扣的不成样子,同样写的不好的同学却不会这样,这中间的落差很容易让人走向黑化的道路,进而病毒式的扩散到全系。老师或许会说,保证作业质量就不会有这样的情况了,说的太对了,可这个课的难度本身就应该让所有人努力一下就不会太惨才对,不应该有这一章作业存在,请老师好好考虑,不然像我这样运气不好的菜鸟只能在申诉之后面对助教一句“全部视为错误”之后想骂人了。关于这门课我真的没什么好赞美的,它让我学到了很多东西,面向对象的编程思想,节约时间的必要性等等,却也让我明白了黑暗森林体系中每个人能有多疯狂,吴际老师说将来每个人都会感谢这门课教会自己的东西,可我更喜欢另一个老师的这句话:“社会是复杂的,但希望我们尽量保持一颗纯洁的心”。与君共勉,继续努力