十四次作业转眼就过去了,面向对象这门课程也即将结束.本文即作为对整个课程的总结与反省.
老师从第一节课就开始强调,本门课程不叫做java程序设计,而是面向对象设计与构造.我们所学的不仅是java的语言特性,更重要的是透过这些语言特性反映出的面向对象的思想:抽象,继承,封装,多态性等.这些思想不依赖于语言而存在,即我们的目标应该是,能够用java解决问题,同时如果给我一本c#或者c++的语法书的话,我很快地就可以将用java解决的问题再用这两种语言实现一遍.
面向对象的测试
测试和正确性论证的优缺点.测试始终是找出程序问题的最直观最重要的手段,即使我们用正确性论证发现了程序的问题,同样需要测试样例将其复现出来.测试很直观,很显而易见地就可以看到问题的发生.任何程序适用的输入输出都可以作为测试.测试的问题在于基本无法做到全面而有效的覆盖,这是正确性论证大显身手的时刻.
正确性论证让我想到了之前计算机组成课程上的一个名词叫做形式验证(Formal Verification)。 形式验证的含义是根据某个或某些形式规范或属性,使用数学的方法证明其正确性或非正确性。我觉得这两个词应该是计算机科学中相当同质的两个词.正确性论证可以穷尽一切可能性,因为是通过分类和数学证明得到的,在全面性方面胜过测试.
正确性论证的缺点在于将问题的抽象和概括对我们的开发效率造成了很大的影响.想要论证结果的正确性必须保证论证过程的正确性.而论证过程所需要的时间和精力一点都不比我们绞尽脑汁想到的不同分类的测试样例需要的少.
测试:
优点:直观,方便;
缺点:构造的测试样例很难做到全面.
正确性论证:
优点:全面,保证正确性
缺点:需要的前提条件多,繁琐.
OCL语言和JSF的比较
JSF是我们后半部分课程中经常用到的用于程序规格化设计的规范化语言,而OCL我们就相对比较陌生.OCL全称是Object Constraint Language,即对象约束语言,是一种帮助UML更好的建立和描述抽象模型的,施加在指定的模型元素上约束的语言。
OCL与JSF的相同之处在于都是严格的无二义的规范化语言,都包括相似的组成部分,前置条件,后置条件,不变式等等.而且都与具体的实现无关.
不同之处在于OCL更复杂,具体一点,更接近程序的模型特征.
电梯系统的模型
类图:
时序图:
学期总结:
四个模块之间的关系.
第一个模块毫无疑问是入门,建立面向对象编程思想的开始.我之前有过一些java的基础还好,还记得第一次互测拿到的那个同学的几百行代码的方法,虽然靠着大量的debug和精心设计也能正常运行.毫无疑问在可阅读和可维护性方面差的太多了.而在之后碰到的互测作业,最起码方法的划分的进步还是很明显的.
第二个模块主要是多线程的介绍,与线程安全的实践.这些是进行高级程序设计和工程化作品的一些基础.为了保证线程安全,必须对类的作用范围和方法调用等知识了解的更加透彻.
第三个模块则是测试的入门.我们以往的人工设计测试样例显然是无法适应越来越复杂的功能的.
第四个模块告诉我们怎么设计更加规范,可维护,正确习惯的程序.
一学期以来,在面向对象这方面的进步应该是很大的,老师颁发的金不换奖状可以作证.第三次的电梯模型拿到第十三次简直没眼看,迅速重构后,第十四次就可以做到一句不改地进行正确性论证,也可以充分地证明这一点.
说实话,我感觉自己进步最小的应该是测试能力,不过这个也无法在短时间内取得更快的进步.只能留待日后慢慢发展了.
对课程的建议:
如果可以每次作业结束之后公布一些优秀作业就更好了.我感觉每次作业都是自己在摸索和进步,没有感觉到大家是一个技术社区,相互促进的作用.即使是怕抄袭,也可以在课程结束两周后公布,让大家吸收优秀作业的特点.因为三次作业基本上是一个周期,就很难再抄袭了,但是一些优秀的特性却不因为三次的间隔而褪色.希望老师和助教可以考虑一下.