测试与正确性论证
测试是通过构造一系列测试数据,通过对比程序的实际运行结果和预期输出结果来判断程序是否有bug的一种手段。同时,在测试的时候是默认看不到程序的具体实现的,即进行黑盒测试,例如每次OO作业的互测阶段。测试的具体方法是将输入进行划分,通过构造一个错误分支树,然后每个分支构造一个或多个测试样例来对程序进行测试。其手段简单,易于实现,通常情况下可以覆盖大多数情况。但也可以看到通过测试的话是需要大量的测试数据的,如果在输入很麻烦的情况下,需要花费大量的时间。同时,就算所有的测试输入都是正确的,也不能保证程序的正确性,这同样是其缺点所在。
正确性论证和测试不同,是通过推敲程序的具体实现来论证程序是否正确,例如第十四次作业。其具体过程是对程序的每一个模块,每一个方法,通过数理逻辑的推导加上大量的文字描述将程序的整个逻辑梳理一遍。它的优点是很明显的,就是如果程序通过了正确性论证,那么这个程序的实现一定是正确的。但是缺点在于论证正确性需要大量的文字描述,工作量很大。
OCL语言与jsf
OCL对象约束语言是用来进行约束定义的,形式化的无二义的语言,于1995年由Warmer等人,在IBM设计成功,并开始使用。
OCL作为形式化语言,基本语言要素包括: 类型(基本类型,高级类型),操作,表达式,语句。
OCL语言作为图形符号的补充,说明建模元素的有关细节,例如:约束,前置条件,后置条件等。
OCL语言虽然是一种形式化语言, 但是它既具有形式化语言无二义性的特点, 又消除了形式化语言的复杂性。两者具有很强的相似性,即都是对于规格的形式话进行约束的语言。相比之下,jsf的主要组成是布尔表达式,可以说是简化版的OCL。OCL的要求更加严格,也更完善,但实现相对复杂,在要求不是很严格的情况下,使用jsf更能事半功倍。
第十四次作业的UML
UML类图
UML顺序图
UML状态图
总结
- 第一单元主要是让我们熟悉java的初级知识以及开始接触面向对象的思想。第一次作业的多项式作业要求不算严格,只需要用java完成即可。第二次和第三次作业则是在第一次左右的基础上新增了要求必须进行类的划分,这可以简单理解为开始oo编程。所以,通过第一单元的练习我们才算是oo初级入门。第二单元则主要是多线程,其中多线程设计的知识点不是很难,难点在于数据的共享和线程安全的实现。例如第五次作业的多线程电梯,这也是大多数同学的第一次oo通宵,这次作业的难点在于如何协调时间的同步问题以及线程之间的互斥访问。oo作业的特点在于代码可以在很短的时间之内写完,但剩下还需要花很多时间来完善细节和bug的修复。但是接下来的第六次作业的代码量却是有点超乎想象,由于我本人在一开始写时思路有些问题,所以浪费了大量的时间在一个错误的算法上,当然最终这次作业的完成效果自然是不好的。第三单元开始进入了jsf的书写,通过这一单元的练习我对代码的规格化书写又有了新的认识,也认识到了代码规范的重要性。第四单元呢则主要是在前几次作业的基础上进行了部分修改,包括代码的规范书写,代码的正确性论证,这个时候再翻看前几次作业的代码觉得真是惨不忍睹,很多莫名其妙的变量名以及一个方法超过100行等等,所以,我毅然决然的选择重构了。总的来说,这四个单元之间肯定是循序渐进的关系,通过前面单元的练习来打好对后面作业的铺垫。
- 通过oo这门课的练习自己也是收获匪浅。前三次作业我的代码都是一个形式,即主方法中构造一个类,然后这个类的构造方法又构造新的其他类或方法来实现具体功能。一开始我还觉得这个思路时不错的,可是后来仔细一想,这个和面向过程有什么区别呢,类与类之间没有实现数据的交互,简直就是面条式代码。所以后来我的设计方法有了新的变化,当然也参考了同学的设计,首先要清楚各个类的职能,每个类的变量和方法都做一定的限制,同时各个类之间尽量不通过public属性了来实现数据的交互,而是通过其他的手段来实现数据共享。通过每次作业的练习,自己写的程序也算有了一点面向对象编程的影子。
- 工程化即系统化、模块化、规范化的一个过程。指将具有一定规模数量的单个系统或功能部件,按照一定的规范,组合成一个模块鲜明、系统性强的整体。工程化往往包含大量学科和学科分支的知识,是一个复杂的系统工程过程。我们的这门课程也涉及了很多工程化设计的思想,虽然自己的实际开发能力并没有达到那个水平,另外我觉得我们这门课接触更多的是规范化,对设计并没有强调得那么多,由于后面几次作业是基于前几次作业的,所以很多设计留下的坑也没有注意,导致浪费了很多不必要的时间。整体这门课学下来对工程化的感觉并不是特别深刻。
- 经历了这学期,感触还是蛮多的,学自然是学到了很多东西,另外就是觉得这么课还蛮有意思,比其他很多(其实也就几门)吹上天的专业课体验要好,可能是老师太负责助教们又太认真了吧。然后是说一说自己的建议,我个人感觉平时的作业量有点大,倒不是因为完不成,而是在这样作业压力下,大多数同学的重点是完成这门课的作业而不是认真听老师讲授内容,简单说就是听不听课无所谓,周五的课直接在宿舍写下一次作业了。所以还是感觉课程组可以减轻一些作业量,如何加强课上讲授的内容和平时作业的联系才是最重要的。