测试与正确性论证

Dijkstra说过:“程序测试只能证明程序有错,不能证明程序正确。”所谓程序测试,实际上是测试者特意挑出一批检查数据,通过运行程序,检查每个输入数据所对应的运行结果是否符合预期要求。正确性证明是论证程序达到预期目的的一般性陈述,该论证不与程序输入的特定值有关,但能够代表穷举性测试。

测试相比于正确性论证来说,实际像是将程序看作一个黑盒,并不关注程序内部的实现。测试不仅能快速地发现程序的bug,也能测试程序的效率,复杂度等属性。但是缺点在于需要大量的数据,想要做到全覆盖测试并不容易,甚至在很多情况下根本无法实现。

而正确性论证则不一样,如果说测试是从实践方面来检测程序的正确性,那么正确性论证则是从理论上来证明程序的正确性。正确性论证在理论上来说可以覆盖整个程序,从而证明整个程序的正确性。比起测试来说,由于是从理论上来证明程序的正确性,因此所需要的资源相对较少。但是其缺点也比较明显,首先,正确性论证是从实现的角度去论证程序的正确性,只能证明程序实现的正确与否,如果程序一开始的设计就是错的,那么正确性论证不能发现这个问题。其次,当一个方法的实现过于复杂时(比如一个方法的代码超过了50行),正确性论证难以进行。

OCL与JSF

对象约束语言(简称OCL)是一种指示用户建模系统中的限制方式。UML图通常不够精细,无法提供与规范有关的所有相关部分。这其中就缺少描述模型中关于对象的附加约束。OCL便是为了解决这类问题应运而生的形式语言。

与JSF相比,虽然两者都是一种约束语言,但OSL语言是一种无二义性规范语言,并且每一个表达式都有自己的类型。JSF的主要服务对象是方法,而OSL的主要服务对象是每一个类。

第十四次作业

学期总结

不知不觉间已经度过了一个学期的漫长而痛苦的OO旅途。虽说痛苦,但是收获满满。

第一个单元,我们的主要目标是形成面向对象编程的思想。以前所学过的编程语言C语言是典型的面向过程的编程语言,而新接触的Java语言则是一款面向对象的编程语言,这一单元主要是让我们熟悉面向对象的编程思想,并且以典型的电梯程序来辅助练习。这一过程中,主要的问题是对Java语言的不熟悉,难以理解面向对象的编程思想。

第二个单元是针对多线程编程的训练。用一句通俗的话说,这一个单元是最折磨人的。首先在于我们对线程丝毫没有概念,也不懂得并发等术语的含义,因此在多线程编程中处处碰壁。其次,线程安全也是一个让我非常头疼的问题。在这一个单元中,主要出现的问题是如何设计,比如在出租车系列作业中,究竟是一个线程管理一百个出租车还是一百个线程管理一百个出租车方便实现?如何去保证出租车运行过程中线程始终安全?这些问题是当时一直困扰着我的。

第三个单元着重于规格化的设计。这一个单元的主要目的是让我们意识到规格的重要性。尽管JSF一直在被吐槽,尽管大家对测试时测试者对JSF的扣分十分厌恶,但是,这一个过程确确实实让我们了解了规格的重要性。规格不仅仅方便了程序的使用,它还能够让其他人更容易弄懂你的程序,这对于开发者来说十分重要。

第四个单元的重要任务便是测试和正确性论证了。到了这个单元,大家都已经能够理解面向对象的编程思想,也能写出相应的代码。但是如何保证自己写的代码是正确的呢?这一单元针对代码的测试和正确性论证帮我们解决了这个问题。也让我们能够写出完善健全的代码。

回看自己写过的历次作业,我发现自己的提高还是很明显的。最初的我写的代码,完全是面条式的,如今的代码,具有了相当程度的可移植性。针对测试,已经学会了将输入输出划分,以形成分类树来对程序进行测试。

至于工程化开发,我的理解是首先开发者在设计方面要遵循一定的原则,其次要写出可移植性高,可修改性强的代码,便于修改和完善。再次对每个类每个方法的实现要规格化,方便测试。最后的测试阶段中,要尽量按照测试的分类树进行测试,尽量实现全覆盖的测试。

我们经常说的一句话是OO不易,和谐6系。其实我觉得这和课程组有很大的关系。很大的原因是互相测试导致的。有一句网络语是这么说的:“我就这样了,有本事你顺着网线来打我啊?”的确,匿名的互相测试确实让某些同学过于“为所欲为”,周五测试结果出来之后,看到被报的BUG又要与测试者争论许久,最终还得靠课程组的仲裁。既破坏了同学间的关系又加大了同学和课程组的压力。

我认为一个很好的解决方法是加大公测力度,减少互测在分数中所占的比例。实话说,互测有很强的主观性,公测才是真正公平的。但很多次作业公测,弱的惊人,把分数完全交给测试者,难怪同学们都说这是面向运气编程。

虽然怨言不少,但始终还是希望OO课程能越来越好吧,也希望这门课能成为北航计院的特色课程(虽然已经是特色课程了)。

OO最后一次总结的更多相关文章

  1. GLUT的简洁OO封装

    毕业设计用到了OpenGL,由于不会用MFC和Win32API做窗口程序:自然选用了GLUT.GLUT很好用,就是每次写一堆Init,注册callback,觉得有点恶心,于是对他做了简单的OO封装.记 ...

  2. Atitit 基于sql编程语言的oo面向对象大规模应用解决方案attilax总结

    Atitit 基于sql编程语言的oo面向对象大规模应用解决方案attilax总结 1. Sql语言应该得到更大的范围的应用,1 1.1. 在小型系统项目中,很适合存储过程写业务逻辑2 1.2. 大型 ...

  3. OO中,先有对象还是先有类?

    就是问,在面向对象思想里,先有对象还是先有类,乍一看和先有鸡蛋还是先有鸡是一类问题,其实不然!这个问题,在lz考研复试的时候被面试官问过,一模一样,如今又在一个笔试题里看到了类似的题目,眨一下,有人会 ...

  4. OO方式下,ALV TREE和ALV GRID的不同之处

    作为大部分报表程序的基础,ALV GRID差不多是每个ABAP开发者必须了解和掌握的内容,因此网上也不乏相关资料,而ALV TREE的应用相对较少,中文资料也就比较少见了.实际上,ALV TREE和A ...

  5. 从人类社会的角度看OO(独家视角)

    引言 在OO的工作中,我们一定会涉及到类,抽象类和接口.那么类和抽象类以及接口到底扮演的什么角色? 本文主要是从人类社会的角度阐述类与抽象类以及接口的"社会"关系,从而让我们抛弃书 ...

  6. HDU5288 OO’s Sequence

    Problem Description OO has got a array A of size n ,defined a function f(l,r) represent the number o ...

  7. lua下的简单OO实现

    笔者学习了当前(文末各文献)lua下的各种OO实现方法.略作笔记. 也提出了一些自己的想法.主要还是记录供将来着之参考.   1.概述   首先[2]PIL第二版中给出了OO的基于table的实现方式 ...

  8. OO的五大原则是指SRP、OCP、LSP、DIP、ISP。

    OO的高层原则,面向对象设计的基本原则 设计模式之六大原则--开闭原则(OCP) 设计模式之六大原则--迪米特法则(LoD,LKP) 设计模式之六大原则--接口隔离原则(ISP) 设计模式之六大原则- ...

  9. OO.A.D.P

    OO/A/D/P 对象和类 三大特征 对象: 对象是面向对象语言的一个极为重要的特点,所有的面向对象语言都有对象的共性. 1. 职责(单一) 2. 属性(数据.可改变的) 3. 函数(行为.方法.业务 ...

  10. Atitit usbQb212 oo 面向对象封装的标准化与规范解决方案java c# php js

    Atitit usbQb212 oo 面向对象封装的标准化与规范解决方案java c# php js 1.1. 封装性是面象对象编程中的三大特性之一  三个基本的特性:封装.继承与多态1 1.2. 魔 ...

随机推荐

  1. 史上最详细的codeblocks安装教程!!!

    codeblocks下载地址:https://www.cnblogs.com/yinbiao/p/8489748.html 下面是codeblocks具体的安装教程:

  2. [图解tensorflow源码] Graph 图模块 —— Graph Loading

  3. 罗技 HTPC K700

    1.下方的 播放,暂停 快进 可以控制midea 2.CTRL+ALT+FN+(PG UP)可开启触控板左键点击功能3.FN(功能键)+左键=右键功能

  4. 【ps】Photoshop

    Photoshop Cs6  存在百度云上 另外,想用切图插件cutterman,则必须安装相匹配的ps版本

  5. 转换CLOB字段类型为VARCHAR2, lob类型不支持的sql语句

    转自:https://blog.csdn.net/e_wsq/article/details/7561209 步骤: 1.建立一个临时varchar2字段用来保存数据 2.将clob的内容截取后更新到 ...

  6. iOS:WKWebView(19-01-31更)

    以前用得不多,先开一篇,以后有遇到再补充. 1.返回 2.JS 调用 OC 3.获取.修改.添加网页信息 1.返回 if (self.mWebView.canGoBack == YES) { [sel ...

  7. go语言的结构体指针

    Go 语言结构体 Go 语言中数组可以存储同一类型的数据,但在结构体中我们可以为不同项定义不同的数据类型.   结构体是由一系列具有相同类型或不同类型的数据构成的数据集合.   结构体表示一项记录,比 ...

  8. [收藏转]由于CredSSP加密Oracle修正 导致远程桌面报错处理

    原文:https://blog.csdn.net/lanwilliam/article/details/80346792 由于win103月份的一个更新,导致mstsc突然无法连接服务器了,报错如标题 ...

  9. SpringIDE的安装

    要安装SpringIDE,需要先知道当前eclipse的版本,打开Eclipse,Help -> About Eclipse 然后去 http://spring.io/tools/sts/all ...

  10. BZOJ2120_数颜色_KEY

    题目传送门 裸的带修莫队. 在Sort时如果左右区间都在同一块中,就按询问的修改的先后Sort. 对于每次查询判断向前或向后修改. 当size为N*2/3时据说是最优.O(N^(3/5)). code ...