测试与正确性论证

  测试是通过构造一系列测试数据,通过对比程序的实际运行结果和预期输出结果来判断程序是否有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属性了来实现数据的交互,而是通过其他的手段来实现数据共享。通过每次作业的练习,自己写的程序也算有了一点面向对象编程的影子。
  • 工程化即系统化、模块化、规范化的一个过程。指将具有一定规模数量的单个系统或功能部件,按照一定的规范,组合成一个模块鲜明、系统性强的整体。工程化往往包含大量学科和学科分支的知识,是一个复杂的系统工程过程。我们的这门课程也涉及了很多工程化设计的思想,虽然自己的实际开发能力并没有达到那个水平,另外我觉得我们这门课接触更多的是规范化,对设计并没有强调得那么多,由于后面几次作业是基于前几次作业的,所以很多设计留下的坑也没有注意,导致浪费了很多不必要的时间。整体这门课学下来对工程化的感觉并不是特别深刻。
  • 经历了这学期,感触还是蛮多的,学自然是学到了很多东西,另外就是觉得这么课还蛮有意思,比其他很多(其实也就几门)吹上天的专业课体验要好,可能是老师太负责助教们又太认真了吧。然后是说一说自己的建议,我个人感觉平时的作业量有点大,倒不是因为完不成,而是在这样作业压力下,大多数同学的重点是完成这门课的作业而不是认真听老师讲授内容,简单说就是听不听课无所谓,周五的课直接在宿舍写下一次作业了。所以还是感觉课程组可以减轻一些作业量,如何加强课上讲授的内容和平时作业的联系才是最重要的。

oo作业总结(四)的更多相关文章

  1. 北航oo作业第四单元小结

    1.总结本单元两次作业的架构设计 在我动手开始总结我的设计之前,我看了其他同学已经提交在班级群里的博客,不禁汗颜,我是真的偷懒.其他同学大多使用了新建一个类,用以储存每一个UMLelemet元素的具体 ...

  2. oo作业第四单元总结暨结课总结

    目录 一.第四单元作业架构设计 1.第一次UML作业架构设计 2.第二次UML作业架构设计 二.架构设计和OO方法理解演进 三.测试理解与实践的演进 四.课程收获总结 五.三个具体改进建议 一.第四单 ...

  3. BUAA OO 2019 第四单元作业总结

    目录 第四单元总结 总 UML UML 类图 UML 时序图 UML 状态图 架构设计 第十三次作业 第十四次作业 课程总结 历次作业总结 架构设计 面向对象方法理解 测试方法理解与实践 改进建议 尽 ...

  4. 【作业2.0】HansBug的5-7次OO作业分析与小结,以及一些个人体会

    不知不觉又做了三次作业,容我在本文胡言乱语几句2333. 第五次作业 第五次作业是前面的电梯作业的多线程版本,难度也有了一些提升.(点击就送指导书) 类图 程序的类图结构如下: UML时序图 程序的逻 ...

  5. 第十五次oo作业

    作业十五 测试与正确性论证的效果差异 程序的测试需要通过输入特定数据等方式,检查程序是否和预期相同,因为测试不可能穷举,导致了不穷举的测试不可能验证程序是完全正确的,只能验证程序在测试时没有发生错误, ...

  6. OO课程第四次总结

    终于来到了最后一次的OO作业,以博客作业的形式来终结也是极好的,回顾一下过去十六周自己的经历,感慨颇深. 测试和正确性论证 简单来说,测试的目的是将程序的代码做到全覆盖,从而确保每个分支都运行一遍,进 ...

  7. oo作业总结(二)

    概述 和前三次作业相比,这几次作业最大的不同是难度的飞跃.遗憾的是在这难度的变化面前,我自己却没有做好充分的准备,错误的低估了作业难度导致给自己带来了很多不必要麻烦和损失.接下来我将对它们进行说明(度 ...

  8. oo作业总结(一)

    概述 经历了三次oo作业的洗礼,让我对java语言的强大以及面向对象编程有了初步的理解(当然,我是小白).本文接下来就将对自己这三次作业的代码进行分析以及分享自己的心路历程. 基础知识点考核 针对前三 ...

  9. 北航oo作业第一单元小结

    前言 在经过了三次艰辛的oo作业后,oo课程的第一单元告一段落,这一单元,我作为一个oo小白,开始了解oo的编程思想,也有了自己的一点心得体会.把笔粗成字,不当之处,还请各位大佬多多指教. 一.分析程 ...

随机推荐

  1. 修改Anaconda中的Jupyter Notebook默认工作路径

    这二天,安装了anaconda想更改jupyter的工作路径,在网上找了一下 方式1. 打开Windows的cmd,在cmd中输入jupyter notebook --generate-config如 ...

  2. TypeError: atlas.getSpriteFrame is not a function

    1.资源结构如下: 2.在使用cc.loader.loadRes动态异步加载cc.SpriteAtlas资源时出现这个错误,代码如下: var self = this; var url = " ...

  3. HRBUST - 2358 Magic network

    HRBUST - 2358 思路:dfs序 + 树状数组 代码: #pragma GCC optimize(2) #pragma GCC optimize(3) #pragma GCC optimiz ...

  4. 第 3 章 镜像 - 015 - 调试 Dockerfile

    如何 debug Dockerfile 通过 Dockerfile 构建镜像的过程 从 base 镜像运行一个容器 执行命令对容器做修改 执行类似 docker commit 的操作,生成一个新的镜像 ...

  5. 动态规划-独特的子字符串存在于Wraparound String总个数 Unique Substrings in Wraparound String

    2018-09-01 22:50:59 问题描述: 问题求解: 如果单纯的遍历判断,那么如何去重保证unique是一个很困难的事情,事实上最初我就困在了这个点上. 后来发现是一个动态规划的问题,可以将 ...

  6. VMware安装Linux并配置网络通信

    说明: Linux系统:CentOS-6.8-x86_64-minimal.iso VMware版本:9.0 首先下载VMware并安装.然后将CentOS-6.8-x86_64-minimal.is ...

  7. Java创建WebService

    从java 6之后就提供了简单快速的创建WebService的方法,这里将这种简单的方法记录下来方便以后回看.第一步:首先创建一个java Project,然后创建一个类HelloWorldImpl如 ...

  8. 使用pymysql操作数据库

    学习如何使用python的pymysql模块来操作mysql数据库 这里的基本用法主要借鉴了该篇博客:https://www.cnblogs.com/woider/p/5926744.html 因为这 ...

  9. datatabe 与string

    DataTable到string /// <summary>         /// DataTable 到 string         /// </summary>     ...

  10. Twisted 简介

    Twisted是用Python实现的基于事件驱动的网络引擎框架,Twisted支持许多常见的传输及应用层协议,包括TCP.UDP.SSL/TLS.HTTP.IMAP.SSH.IRC以及FTP.就像Py ...