OO最后一次总结
测试与正确性论证
Dijkstra说过:“程序测试只能证明程序有错,不能证明程序正确。”所谓程序测试,实际上是测试者特意挑出一批检查数据,通过运行程序,检查每个输入数据所对应的运行结果是否符合预期要求。正确性证明是论证程序达到预期目的的一般性陈述,该论证不与程序输入的特定值有关,但能够代表穷举性测试。
测试相比于正确性论证来说,实际像是将程序看作一个黑盒,并不关注程序内部的实现。测试不仅能快速地发现程序的bug,也能测试程序的效率,复杂度等属性。但是缺点在于需要大量的数据,想要做到全覆盖测试并不容易,甚至在很多情况下根本无法实现。
而正确性论证则不一样,如果说测试是从实践方面来检测程序的正确性,那么正确性论证则是从理论上来证明程序的正确性。正确性论证在理论上来说可以覆盖整个程序,从而证明整个程序的正确性。比起测试来说,由于是从理论上来证明程序的正确性,因此所需要的资源相对较少。但是其缺点也比较明显,首先,正确性论证是从实现的角度去论证程序的正确性,只能证明程序实现的正确与否,如果程序一开始的设计就是错的,那么正确性论证不能发现这个问题。其次,当一个方法的实现过于复杂时(比如一个方法的代码超过了50行),正确性论证难以进行。
OCL与JSF
对象约束语言(简称OCL)是一种指示用户建模系统中的限制方式。UML图通常不够精细,无法提供与规范有关的所有相关部分。这其中就缺少描述模型中关于对象的附加约束。OCL便是为了解决这类问题应运而生的形式语言。
与JSF相比,虽然两者都是一种约束语言,但OSL语言是一种无二义性规范语言,并且每一个表达式都有自己的类型。JSF的主要服务对象是方法,而OSL的主要服务对象是每一个类。
第十四次作业


学期总结
不知不觉间已经度过了一个学期的漫长而痛苦的OO旅途。虽说痛苦,但是收获满满。
第一个单元,我们的主要目标是形成面向对象编程的思想。以前所学过的编程语言C语言是典型的面向过程的编程语言,而新接触的Java语言则是一款面向对象的编程语言,这一单元主要是让我们熟悉面向对象的编程思想,并且以典型的电梯程序来辅助练习。这一过程中,主要的问题是对Java语言的不熟悉,难以理解面向对象的编程思想。
第二个单元是针对多线程编程的训练。用一句通俗的话说,这一个单元是最折磨人的。首先在于我们对线程丝毫没有概念,也不懂得并发等术语的含义,因此在多线程编程中处处碰壁。其次,线程安全也是一个让我非常头疼的问题。在这一个单元中,主要出现的问题是如何设计,比如在出租车系列作业中,究竟是一个线程管理一百个出租车还是一百个线程管理一百个出租车方便实现?如何去保证出租车运行过程中线程始终安全?这些问题是当时一直困扰着我的。
第三个单元着重于规格化的设计。这一个单元的主要目的是让我们意识到规格的重要性。尽管JSF一直在被吐槽,尽管大家对测试时测试者对JSF的扣分十分厌恶,但是,这一个过程确确实实让我们了解了规格的重要性。规格不仅仅方便了程序的使用,它还能够让其他人更容易弄懂你的程序,这对于开发者来说十分重要。
第四个单元的重要任务便是测试和正确性论证了。到了这个单元,大家都已经能够理解面向对象的编程思想,也能写出相应的代码。但是如何保证自己写的代码是正确的呢?这一单元针对代码的测试和正确性论证帮我们解决了这个问题。也让我们能够写出完善健全的代码。
回看自己写过的历次作业,我发现自己的提高还是很明显的。最初的我写的代码,完全是面条式的,如今的代码,具有了相当程度的可移植性。针对测试,已经学会了将输入输出划分,以形成分类树来对程序进行测试。
至于工程化开发,我的理解是首先开发者在设计方面要遵循一定的原则,其次要写出可移植性高,可修改性强的代码,便于修改和完善。再次对每个类每个方法的实现要规格化,方便测试。最后的测试阶段中,要尽量按照测试的分类树进行测试,尽量实现全覆盖的测试。
我们经常说的一句话是OO不易,和谐6系。其实我觉得这和课程组有很大的关系。很大的原因是互相测试导致的。有一句网络语是这么说的:“我就这样了,有本事你顺着网线来打我啊?”的确,匿名的互相测试确实让某些同学过于“为所欲为”,周五测试结果出来之后,看到被报的BUG又要与测试者争论许久,最终还得靠课程组的仲裁。既破坏了同学间的关系又加大了同学和课程组的压力。
我认为一个很好的解决方法是加大公测力度,减少互测在分数中所占的比例。实话说,互测有很强的主观性,公测才是真正公平的。但很多次作业公测,弱的惊人,把分数完全交给测试者,难怪同学们都说这是面向运气编程。
虽然怨言不少,但始终还是希望OO课程能越来越好吧,也希望这门课能成为北航计院的特色课程(虽然已经是特色课程了)。
OO最后一次总结的更多相关文章
- GLUT的简洁OO封装
毕业设计用到了OpenGL,由于不会用MFC和Win32API做窗口程序:自然选用了GLUT.GLUT很好用,就是每次写一堆Init,注册callback,觉得有点恶心,于是对他做了简单的OO封装.记 ...
- Atitit 基于sql编程语言的oo面向对象大规模应用解决方案attilax总结
Atitit 基于sql编程语言的oo面向对象大规模应用解决方案attilax总结 1. Sql语言应该得到更大的范围的应用,1 1.1. 在小型系统项目中,很适合存储过程写业务逻辑2 1.2. 大型 ...
- OO中,先有对象还是先有类?
就是问,在面向对象思想里,先有对象还是先有类,乍一看和先有鸡蛋还是先有鸡是一类问题,其实不然!这个问题,在lz考研复试的时候被面试官问过,一模一样,如今又在一个笔试题里看到了类似的题目,眨一下,有人会 ...
- OO方式下,ALV TREE和ALV GRID的不同之处
作为大部分报表程序的基础,ALV GRID差不多是每个ABAP开发者必须了解和掌握的内容,因此网上也不乏相关资料,而ALV TREE的应用相对较少,中文资料也就比较少见了.实际上,ALV TREE和A ...
- 从人类社会的角度看OO(独家视角)
引言 在OO的工作中,我们一定会涉及到类,抽象类和接口.那么类和抽象类以及接口到底扮演的什么角色? 本文主要是从人类社会的角度阐述类与抽象类以及接口的"社会"关系,从而让我们抛弃书 ...
- 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 ...
- lua下的简单OO实现
笔者学习了当前(文末各文献)lua下的各种OO实现方法.略作笔记. 也提出了一些自己的想法.主要还是记录供将来着之参考. 1.概述 首先[2]PIL第二版中给出了OO的基于table的实现方式 ...
- OO的五大原则是指SRP、OCP、LSP、DIP、ISP。
OO的高层原则,面向对象设计的基本原则 设计模式之六大原则--开闭原则(OCP) 设计模式之六大原则--迪米特法则(LoD,LKP) 设计模式之六大原则--接口隔离原则(ISP) 设计模式之六大原则- ...
- OO.A.D.P
OO/A/D/P 对象和类 三大特征 对象: 对象是面向对象语言的一个极为重要的特点,所有的面向对象语言都有对象的共性. 1. 职责(单一) 2. 属性(数据.可改变的) 3. 函数(行为.方法.业务 ...
- Atitit usbQb212 oo 面向对象封装的标准化与规范解决方案java c# php js
Atitit usbQb212 oo 面向对象封装的标准化与规范解决方案java c# php js 1.1. 封装性是面象对象编程中的三大特性之一 三个基本的特性:封装.继承与多态1 1.2. 魔 ...
随机推荐
- 再起航,我的学习笔记之JavaScript设计模式07(抽象工厂模式)
我的学习笔记是根据我的学习情况来定期更新的,预计2-3天更新一章,主要是给大家分享一下,我所学到的知识,如果有什么错误请在评论中指点出来,我一定虚心接受,那么废话不多说开始我们今天的学习分享吧! 前两 ...
- Ext4文件系统架构分析(一)
本文描述Ext4文件系统磁盘布局和元数据的一些分析,同样适用于Ext3和Ext2文件系统,除了它们不支持的Ext4的特性外.整个分析分两篇博文,分别概述布局和详细介绍各个布局的数据结构及组织寻址方式等 ...
- ios学习路线—Objective-C(装箱和拆箱)
概述 从前面的博文我们也可以看到,数组和字典中只能存储对象类型,其他基本类型和结构体是没有办法放到数组和字典中的,当然你也是无法给它们发送消息的也就是说有些NSObject的方法是无法调用的,这个时候 ...
- ThreadLocal理解
ThreadLocal 概述 ThreadLocal实例仅作为线程局部变量的==操作类==,以及==线程存储局部变量时的Key==.真正的线程局部变量是存储在各自线程的本地,通过Thread类中的Th ...
- #leetcode刷题之路48-旋转图像
给定一个 n × n 的二维矩阵表示一个图像.将图像顺时针旋转 90 度.说明:你必须在原地旋转图像,这意味着你需要直接修改输入的二维矩阵.请不要使用另一个矩阵来旋转图像.示例 1:给定 matrix ...
- Rails 自定义验证的错误信息
Active Record 验证辅助方法的默认错误消息都是英文,为了提高用户体验,有时候我们经常会被要求按特定的文本展示错误信息.此时有两种实现方式. 1. 直接在:message添加文案 class ...
- Scala-列表操作
package com.bigdata object ListO { def main(args: Array[String]): Unit = { println() } val list = Li ...
- LaTeX表格绘制备忘之Go语言中的几个表
以下绘制的表格选自<Go语言 云动力>一书.这些表格比较简单,LaTeX语句也比较简单. 完整代码: % 博客园陆巍的博客 https://www.cnblogs.com/atth ...
- JQuery第一天——入门概述与选择器
一.什么是JQuery 一个流行的js库 核心理念:write less , do more 优势: 轻量级 强大的选择器 出色的 DOM 操作的封装 可靠的事件处理机制 完善的 Ajax 出色的浏 ...
- My97DatePicker:开始时间和结束时间的最大间隔为1个月30天,并且不大于当前时间(3种方法)
问题的背景 在之前做Web项目的时候,开始时间和结束时间,只有2个要求: 1.开始时间必须小于等于结束时间,不能超过当前时间. 2.结束时间必须大于等于开始时间,不能超过当前时间. 由于开始时间不大于 ...