oo第四次总结

 

  • 测试与正确性论证差异

测试是直接构造许多的测试样例,通过程序运行这些样例,判断运行结果是否与预期结果相符,从而判断程序的正确性。在前几次的oo测试中,均采用了这种方法,这种方法不关心程序的实现逻辑,仅仅关心程序的输出是否正确,简单直观,与程序实际应用场景更为接近。而正确性论证试根据代码规格,分析程序实现是否符合代码规格的要求,从而判断程序的正确性。

理论上来说,这两种方法都能对程序的正确性进行判断,但都存在着一定的问题。使用测试方法时,由于不关心程序的具体实现细节,因此需要构造大量的测试样例,从而试图覆盖程序所有的执行情况。在构造样例时,很可能会出现几种看上去不同的样例,对程序而言实际上却是相同的情况,造成样例大量重复;也可能会出现漏掉了某种很隐蔽的分支的情况,不能完全检查程序的正确性。因此这种方法在程序较为简单时很有效,而且测试过程很简单;但是对于功能较为复杂的程序,即使通过了测试,也不意味着程序的完全正确。对于正确性论证,其依据是程序的规格,这就意味着程序的规格必须完全正确,完全符合需求的要求,这一点虽然已经被默认保证,但仍存在出错的可能。同时,正确性论证需要对代码实现进行深入分析,在这一过程中,也很容易出现论证的逻辑错误,从而使论证变得没有意义。因此对于正确性论证,其虽然能保证通过论证的程序的正确性,但是论证过程更为复杂,不易实现。 

 


 

  • OCL语言与JSF

OCL是对象约束语言(Object Constraint Language)的简称,是一种指示用户建模系统中的限制方式,是UML可选的附加内容,可以用来更好地定义对象的行为,并为任何类元指定约束。在对象约束语言中,对象代表了系统的组件,它定义了完善的项目,约束代表限制。它是对图形符号的补充,说明建模元素的有关细节。OCL作为形式化语言,基本要素包括:类型,操作,表达式,语句等四部分。

OCL与JSF均可对程序运行的前置条件、后置条件等内容进行说明,同时都是无二义性语言,其表达式状态对系统执行也不会有影响。但是OCL中定义了更为复杂的数据类型与语句规范,因此从形式上更为工整,但也更为复杂。JSF在使用时自由度较高,因此是一种简化的OCL。

 


 

  • 规格写法改进

  • UML类图

 

  • UML顺序图

 

  • UML状态图

 

  


 

  • 总结

  • 知识点关系

第一个单元主要介绍了面向对象的基本知识,主要有面向对象与面向过程的主要差别,面向对象的思考方式是怎么样的,面向对象程序的基本构成是什么。第二单元主要是多线程编程,介绍了java多线程编程的基本方法。第三单元在多线程的基础上,主要训练规格的书写。而第四单元在规格与之前程序的基础上,进行程序的正确性论证。这四个知识点是逐步递进的关系,但是每个知识点之间也有较大的不同,属于编程的四个层次。

  • 提升与进步

个人来说,在编程语言上,这个学期让我java从0起步,现在已经能够读懂并写一些稍复杂的java程序,实现了很大的进步。在代码质量上,原来对于代码格式、代码结构等方面关注的不多,程序以实现功能为主要目标,这学期次作业由于对功能要求的降低,让我有了更多的时间去思考如何构建代码,让自己的代码质量、代码可读性有了显著的提升。

  • 关于工程化开发

工程化开发是工程中进行系统化、模块化、规范化编程的过程。在实际工程实践中,这一点显得尤为重要。在我们的作业中,主要进行了两大模块的作业,即电梯与出租车。写电梯的时候,由于对java及面向对象都是刚刚入门,怎么写代码都不清楚,也就谈不上工程化的问题。因此在这一模块作业中,每一次的需求附加,几乎都面临着程序重写的问题,因为在初始阶段对程序没有一个合理的构建。在写出租车的时候, 由于编程能力的提升,在最开始就对代码框架进行了设计,因此后续的需求更改也就显得比较容易,无需对程序主体进行任何改动。

虽然我们的作业远远谈不上工程,但是从这两个模块的实践中也可以很明显的发现,工程化设计在编写程序中是非常重要的。

  • 建议

关于课程,最明显的感觉就是作业和课堂联系的不够紧密,除了后几次作业必须看ppt,按照要求写规格、写论证之外,前几次的ppt对于作业来说帮助不大,这也就表明,课上讲的东西没有在作业中很好的进行体现、进行考察。其实原因也是显而易见的,在第一单元介绍面向对象的时候,课上的理论对同学们的指导作用不是很强,这个时候很少有人有时间按照课上的理论分析需求进行编程,此时大多数人根本不了解java的任何语法(包括我),他们需要花费大量时间学习语法。在学习语法后,时间已经所剩不多了,就只能按照自己最熟悉的方式(面向过程),先把作业做完。第二单元介绍多线程,第一次课花了大量时间介绍java实现多线程的原理及多线程的意义,反而对多线程的具体代码实现仅进行了很少的介绍,而课后的作业却是需要利用多线程编写复杂程序;第二次课注重介绍了线程安全机制,在编程中却基本上也就用到了最基本的类锁,创建线程安全类,而且个人感觉锁设计最为复杂的反而是上一次作业,在以后的作业中也基本见不到锁的踪影。从第二单元的第三次到后续的所有作业,基本上都和软件规范有关,我相信这是很好的训练,但我记得吴老师在第一节课就说过,这门课曾经确实还有一个目的,就是训练软件工程能力,但是现在软件设计已经被分成一门单独的课,在大三下学期进行。在面向对象程序设计课的后几次作业中,可以很明显的感觉到,对面向对象这一思想的理解没有显著的提升,都是在利用第一次出租车作业时的程序进行修修补补,很明显不会因为之前写的不是”面向对象“,而在后几次作业当中逐渐因为对面向对象的理解,而将程序重构为”面向对象“式的。在面向对象设计与构造中,花费半学期的时间着重训练软件工程的内容,我感觉占比稍微大了一些。

当然我可能也没有什么特别好的建议给老师,只是指出了一些我认为不够合理的地方。我想到了一两点改进意见,比如是否可以对java语法进行一些讲解,或是将作业从一些类更少、算法更简单的程序开始,通过编写几个基本程序熟悉语言,而不是一开始就将语言学习、正则表达式匹配等多个知识点融合在一起。还有就是后面软件规格、正确性论证等方面,是否需要在本门课程中占据这样的比重,是否会和其他课程有一定的教学重叠,老师们可以考虑一下。

posted @ 2018-06-25 17:11  liuhm98  阅读(123)  评论(0编辑  收藏  举报