OO第四次博客

OO第四次博客作业

写在前面


 

 

  OO课终于结束了!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!(鼓掌)

  最后一个阶段相比前一段时间惊心动魄的写bug,debug阶段来说轻松了一些,至少在代码的量上来讲少了不少。虽说主要工作是写文档写注释,但我觉得更主要的工作是读懂自己以前写的代码(吐血)。

 

测试与正确性论证


 

  在完成这两次作业和之前的电梯作业的过程中,测试确实是必不可少的环节之一。十三次作业的要求就是使用Junit针对几乎每一个方法编写测试样例。在单独测试每一个方法的过程中我也确实发现了以前没有注意到的bug。

  这种方法避免了当初在做ALS电梯时只能使用大量测试用例去跑程序然后比对输出结果的不方便,而且使用Junit编写测试方法时可以一次性测试大量的用例,节省了很多的时间,尤其是在改完一个bug之后测试程序的结果的时候,在写ALS作业的时候我就发生过这种改完一个bug跑过了一个样例但其他特殊样例出错的情况,而且是在我跑了很多正确输出之后才出现的一个错误,浪费了很多时间。

  测试毕竟只是测试,只能在出现测试错误的情况下说明程序出错了,但基本不可能说明程序没问题,毕竟现实情况我们不可能把所有可能情况全考虑到并且针对这些情况编写测试用例加以验证。

  这时正确性验证的方法出现了,它几乎可以做到全覆盖。在第十四次作业的实践正确性论证书写中,我确实感受到了它的强大之处,发现了很多程序规格书写上的问题。这次作业可以说是对当时ALS电梯代码的一次完全的重新审视,因为只有在完全理解了所写的内容和思考的逻辑才能饿出正确性验证。

  这两次作业着实让我体会到了工程当中对于代码规格和正确性的严格规范,但也正是如此严格的规范才能做到在实际应用中久经考验。

OCL语言调研


 

  OCL时对象约束语言(Object Constraint Language)的缩写。为了解决约束表达问题,IBM公司设计了OCL,经过发展,OCL已经为标准化组织OMG所接受,成为UML标准的一部分。OCL语言虽然是一种形式化语言,但是它既具有形式化语言无二义性的特点,又消除了形式化语言的复杂性。它包含的集合类型有Collection, Set, OrderedSet, Bag和Sequence。语言要素包括类型,操作,表达式和语句。

  OCL相比JSF要复杂得多,因为它要保证严格的无二义性并且遵守一些列规范,复杂到几乎是一门编程语言。而我们使用的JSF确实简化的多,也相对容易书写。

UML图


 

时序图

 

状态图

 

总结


 

  这学期写的代码比前几个学期加起来都多。

  第一章介绍了一些JAVA语言的基本知识和简单的面向对象思想,相对后面的课程来说可以算作一个小小的过渡(虽然相比计组的初始阶段还是难上不少)。

  第二章开始了噩梦一样的多线程程序设计,从第五次作业的三电梯开始,生活对话中充斥着以“你三电梯会写吗”,“synchronized咋用”等开始的对话。正是在这一章的学习和多线程作业的编写中让我理解了多线程程序编写的困难之处(我不会再骂那些多核优化差的游戏了),但也正是这一阶段的训练加深了我对多线程和并行的理解,在程序的设计上有了很大的提高。

  第三章主要讲设计,具体内容就是JSF规格的书写。规格的确是程序应该遵守的规范,但总觉得写起来很费事,而且我也只会在写好的代码上总结出JSF。或许是因为在程序的设计上我还是没有一种全局到局部的观念,不能很好的将每一部分方法的功能总结归纳出来,我认为这应该是我之后主要应该提升的部分。

  第四章基本脱离了代码的编写,稍微轻松了一些,但文档的书写量剧增。在这一章中学习了Junit测试和正确性验证这两种方式在实际中的应用。作业也是使用这两种方式重新审视和解读了一番自己之前所写的代码,发现了很多问题。

  

  经过一学期的训练,我发现我在代码的编写上的提升不小。

  首先从程序的设计上,在理解了指导书的含义之后,我能够基本上构造出来程序需要的流程和基本的逻辑,尤其是多线程程序的设计,从三电梯的啥也不知道完全懵逼状态,到出租车的能够尽可能的分离线程。

  从代码质量上来讲,简单来说就是无用的代码少了,逻辑简化了。这一点从代码行数来看是最能体现的,总的来看确实是有进步,但个人觉得还能在这方面还能继续增强,因为我在写代码的时候总觉得这里那里还能继续简化代码,但想了想又觉得很困难索性就放弃了。

  从规格化设计来说,JSF的学习总感觉对代码提升不是很大,但还是有的。具体代码编写之前写JSF的技能对我来说是有些困难的,原因在上面也已经提到过,但在代码写完之后总结出JSF的过程中还是能发现自己代码上的一些小问题,包括一些重复情况的抽象和简单重复粘贴出现的逻辑错误。

 

  工程化开发,大概应该不是我们现在这种一周赶一个作业的样子。

  三四章所讲的内容大部分是和工程化开发有关的,规格的书写是让调用者可以不用看代码就会使用这部分方法,再加上其他的一些不变式的书写,既可以让编写者的代码写的更加规范,也可以让使用者更加轻松,这在大项目很多人共同开发的过程中会很有帮助,减少了程序员之间的沟通障碍。

  如果说第三章是工程代码开始编写之前和之中,那么第四章的Junit和正确性验证就是代码基本编写完成之后的工作。使用Junit构造大量的测试用例,包括边界情况和压力测试等,可以很大概率测试出程序中出现的bug,改好之后接着测试。这一过程中基本上可以改掉很大一部分bug。后续的正确性论证个人认为在真正的大工程中并不是非常现实,虽然大工程也是由小部份组成,但总会有相对复杂的调用关系,这种情况下对方法的正确性验证就会非常繁琐。

  总的来说,这两章所学的内容应该都是为了工程化开发服务的,从设计到最后的测试,能够尽可能使开发不出现错误。

  

  这门课总的来说确实非常困难,时间上处在大二下学期和OS放在一个学期真的很不明智(虽然我觉得是OS放到这一学期很不合理)。

  最后,非常感谢OO助教们对我们的帮助,尤其是负责我们班的助教小姐姐!

  希望下一届的学弟们能够安然度过这段折磨吧。

posted @ 2018-06-23 11:32  NULL_233  阅读(119)  评论(1编辑  收藏  举报