终于开始最后一次作业了,是时候为这学期oo画一个圆满的局句号了。

回首这学期的OO经历,一路走来,经过了开始对面向对象的初步接触,然后就是充满痛苦回忆的多线程,接下来到了令人焦头烂额的规格设计,最后是测试和论证,中间还穿插着几次(用来放松的)博客作业。这些作业把我这个学期填充的十分充实。

那么还是先把这次作业写完再说。


测试与正确性论证

这一部分接触了两种论证手段,就是测试和正确性论证。

测试使用了junit4的测试框架,针对每个方法来进行规格测试。核心在于构造完备的子集,保证能覆盖到每一条语句以及每一种情况下,方法都能正确完成。初次接触junit4,感觉还是挺简单实用的一种测试方式。

优点:直观,覆盖率和测试结果都能直观显示出来。

缺点:难以覆盖所有情况。且对于repOK这些方法没有办法测试与覆盖。

正确性论证是基于逻辑来验证自己的代码是“正确”的,描述自己代码所有可能的情况,进行严密的逻辑验证。

优点:覆盖性强,逻辑性更为严密

缺点:对于稍微长一点的方法就很难验证其正确性,往往需要长篇大论的论证。一份完整的正确性验证报告估计没有一二十页写不出来。(还好今年是没有互测这玩意)

效果差异:测试是从测试样例的覆盖来测试程序的正确性,而正确性论证则是通过逻辑来严格的验证程序正确。总的来说这两种测试手段都各有用武之地。


OCL语言

ocl语言(即object constraint language,对象约束语言)从名字就能看出来是一种约束语言。一个约束就是对一个(或部分)面向对象模型或者系统的一个或者一些值的限制。UML类图中的所有值都可以被约束,而表达这些约束的方法就是 OCL。

OCL的基础是数学中的集合论和谓词逻辑,并且它有一个形式化的数学语义,但是它并没有使用某种数学符号。因为虽然数学符号能够清晰的、无歧义的表达事物,但是只有极少的专家可以看懂。所以数学符号并不适合用于一个广泛应用的标准语言。

用OCL可以描述四类约束,分别是不变量、前置条件、后置条件和监护条件。

1)不变量是在属性的生命期内一直保持为真的规则。

2)前置条件是在一个操作被调用时必须为真的约束。它是一个断言,不是可执行语句。

3)后置条件就是在操作完成时必须为真的约束。它不是可执行语句而是断言,必须为真。

4)监护规则是在对象能够从一种状态转变为另一种状态前其值必须为真的约束。

相似点:都有前置条件和后置条件,都是无二义性的精确语言,来对程序进行约束

不同点:OCL语言标准更完善,表现力更强;JSF可以看做一种简化过的OCL语言。


第14次作业UML图

类图

UML顺序图

UML状态图


学期总结

写完这个部分然后提交,这学期的oo旅程就算正式结束了。(应该会是星期一晚上写完,做一次ddl战士)用博客来回顾一下这学期的面向对象之路,也回顾一下这个学期是否让我感到充实。

微小的工作:

这学期的OO一共分成了四个单元,每个单元三次编程作业(最后一次调整了只有两次,可喜可贺)加上一个总结性的博客。回过头来总结一下这四个单元究竟学了什么:

(1)JAVA编程入门,面向对象编程入门(+互测入门):

这一部分的三次作业是:多项式相加,傻瓜电梯,ALS电梯。

说是面向对象编程入门,实际上大多数同学做第一次作业之前连JAVA都没有写过,第二次作业开始就要写有一定规模的面向对象程序了。可以说是一周的JAVA速成加上一周的面向对象速成加上一周的面向对象进阶。

(2)JAVA多线程从入门到入土:

这一部分的三次作业是:三线程ALS电梯,IFTTT实现文件监视器,100辆出租车调度程序。

这一部分难度有了质的飞跃,实现JAVA多线程编程。途中debug,编代码(主要是电梯)遇到了各种各样的不明所以的奇奇怪怪的bug,让我们认识到多线程的强大以及线程安全的重要性。不过同样只有一周时间就要我们写完一个难度极高的电梯,也可以说是一周的JAVA多线程速成了。

(3)面向规格的设计(与互测):

这一部分的三次作业是:在出租车程序中增加道路流量,增加红绿灯,增加可迭代的出租车。

这一部分仍然是用多线程实现JAVA的多线程,但是侧重点变了。由实现程序的正确性(包括线程安全问题)变成了设计层面问题。如何做出优雅的设计,如何编写出无懈可击(不被扣分)的JSF。

(4)测试与论证:

这一部分的三次作业是:基于Junit4的测试与覆盖,正确性论证,UML图的绘制(博客)

这一部分的学习任务从编写转为了测试与论证,对于规格、设计的要求也上升了。

总的来说这学期的学习内容还是十分充足庞大的,涵盖了除了面向对象的几乎大部分内容。也难怪有前辈指出,北航面向对象的格局,跟其他学校是完全不同的。整套面向对象课程体系完整看下来像是一整套程序编程的体系,从正确性到安全性,再到优雅设计,最后是测试和论证;而完全不像仅仅是面向对象的课程,还是挺有意思的。

程序的进步:

(1)设计:这部分还是很明显的。从一开始写多项式poly都感觉有点费劲,完全不会面向对象,只能按照提供的框架一步步来写。二三次电梯的设计虽然能看到一丢丢面向对象的影子,但是设计还是不够细,仍然有god类和idiot类出现。到后面两个星期能写出难度不小的多线程程序,电梯(虽然bug不少)和IFTTT。尤其是能在一个星期内写出来这样的程序,当时肯定是不敢想的。然后写的出租车已经颇有面向对象的风范了,对于抽象对象,提取共性写方法也逐渐熟练了起来。

(2)测试:从一开始只会system.out,到现在知道了junit4这种方便的测试工具。至于测试别人的代码,还是佛系一点吧。

(3)代码质量:跟1一样也是很明显的进步。一开始的ALS电梯出现了一个奇长无比的方法(虽然我也懒得改了),现在看来里面充斥着各种无用的废话。包括写第一次作业和第二次作业时候也还有造轮子之嫌。虽然有些人说造轮子并不是完全没有意义,但我自己看来这些轮子造的是真的没有意义。明明有更加方便的工具却还是写了一堆冗长无用的废代码,确实很不应该。在了解了JAVA的方便之后,各种内置的工具确实比自己造的轮子高到不知到哪里去,可读性质量都比以前好了不少。现在看来之前的代码写的确实是辣鸡啊。

另外一点进步就是心态,面向对象真的很锻炼心态,让我更加坚强了。

工程化的一点理解:

之前并没有写过工程啊。。。也并不知道什么是工程化。

不过还是得完成作业,在我看来工程化应该是很多人一起完成的。所以对于个人来说,代码一定要保证精简和可读,做好封装、写好注释以及规格。

代码可读性强是基本的,毕竟在一个庞大的项目中,出现一个可读性差的代码显然不是明智的。而对于一个写好的代码,应该让项目的其他人更好的理解自己写的内容,所以规格和注释也是十分必要的。

同时还要做好代码的规范性,统一编程的规范才能让团队便于理解和维护。

小小的建议:

这里对课程的各个方面提出小小的建议和意见:

首先是难度方面的

如果不打算降低难度的话不算什么建设性意见,可以直接跳过。毕竟我的oo旅程已经快结束了,再难也跟我没关系了,希望下届的学生能撑过来吧hhh。

(1)课程内容方面(作业量):

课程内容还是十分丰富的,瑕疵是跨度和难度略大。尤其是作业量十分充足,一星期一个大工程。面向对象的程序都还不怎么会写,就已经要求写很难的多线程程序了。而且一星期速成多线程,还是那么难的电梯,哪怕能写出来质量也不见得一定很高。而且听说下一届的os难度会加大,不知道双重课业压力之下,下一届的学生能不能承受住了。

就我自己来说,在oo重压那一段时间基本是为了oo放弃了os的,可能是因为我太菜了,实在是无力应对这样两门课程。

(2)作业安排方面:

多线程电梯很显然是最难的一次作业了,对于设计的难度且不提,对于线程安全的要求显然是最高的。安排在刚刚接触多线程的那一星期有一点难了。当然正值清明节假期时间比其他的一星期是要多一点。

至于IFTTT我觉得是没什么必要的一次作业了。这次作业的目标说是“训练同学们针对线程安全问题,如何平衡线程访问控制和共享对象之间的矛盾”。这一次作业主要自学了一段时间的文件系统,难度主要在文件系统和监控的实现上。而我在实际编写过程中耗时最多的是实现,甚至并没有太多关注线程安全。而在测试时发现哪怕对于同一个文件的操作,只要是SafeFile类文件的也不太会因为共享对象而出现线程安全问题。我认为这一次作业的难点其实是理解指导书,自学文件系统和实现文件监控,甚至没有怎么涉及到线程安全问题。

而多线程电梯就不一样了。请求不断的输入,请求队列不断地扫描,还要根据电梯的各种状态来进行判断和分配。请求队列的共享十分明显,而且对于线程安全的要求相当高,如果哪里同步出了一点问题都会有意想不到的情况发生。(指导书上居然对“线程安全”四个字只字不提)

所以我认为可以删除IFTTT这一次作业,用两个星期来编写三线程电梯。事实上我感觉IFTTT这次作业意义真的不是很大,如果用两个星期来编写电梯,如果真的能实现好这个电梯,对于线程安全的理解肯定不会差的。

接下来是对于指导书的一点吐槽。

希望下一届指导书能够更加明确,意思通顺。老师的初衷是希望我们能跟助教讨论共同完成指导书内容,本意是好的。但是我还是希望能在指导书中加入内容时审查一遍。

例如第七次指导书中:

可能是我的语文不好,读了5遍还是没能把“往往通过数字来表达的能力”这句读通顺。

最后是互测这一部分

(1)对于乱扣分,恶意扣分的人应该有惩处机制。如果仅仅依靠申诉或者仲裁,乱扣分现象是不会停止的。应该通过制度来约束。而且乱扣分现象少了之后,助教处理的申诉和仲裁也会减少。

(2)取消JSF的互测。很多学生连JSF的内容自己写都不一定能写好,却有资格去扣别人的JSF。而且这个东西主观性过于强,如果按照自己的理解来扣很容易扣许多。建议改为助教统一评判。

(3)互测出现的bug真的得到有效解决了吗?现阶段只测出别人的bug,而省略了debug这一步。


结语

一学期下来oo这门课总算到了尾声。

为这门课花了心思的老师辛苦了!

为我们答疑解惑的助教辛苦了!

能把这门课通过的同学(包括我自己)也辛苦了!

祝北航面向对象课程越来越完备越来越好。能被越来越少的学生喷。

总而言之这一学期的oo之旅就到此为止了。

OO最后一次作业的更多相关文章

  1. OO第一次博客作业

    OO第一次博客作业 一.三次作业的bug反省 1.自己发现别人的问题 (1)输入处理的问题,比如第一次作业,主要就是处理输入的字符串,然后有同学的正则表达式有问题,则对于一些错误输入就不能正确判断. ...

  2. oo 第一次博客作业

    oo 第一次博客作业 早在大一就听说了oo的各种传奇故事,大二下学期终于也开始了我的oo之旅. 基于度量来分析自己的程序结构 第一次作业 类图分析 耦合度分析 可以看出在第一次作业中,我的耦合度非常高 ...

  3. oo第八次作业

    oo第八次作业 第五次作业分析: 1.度量图: 2.类图: 第五次作业由于是第一次接触多线程,所以导致自己的经验不足,因此最终也没有完成作业,到最后任然不能实现三部电梯的有效调度,所以导致了这次作业的 ...

  4. 面向对象OO第15次作业总结

    面向对象OO第15次作业总结 1.论述测试与正确性论证的效果差异,比较其优缺点测试通过大量测试数据来覆盖测试代码,比较直观,优点在于知道测的是啥,特别直观,缺点在于很难覆盖所有情况.正确性论证从逻辑关 ...

  5. 面向对象OO第9-11次作业总结

    面向对象OO第9-11次作业总结 1.关于规格化设计的调研程序规格说明:对程序所应满足的要求,以可验证的方式作出完全.精确陈述的文件.“规格说明”一词与其他工业产品的“规格说明书”有相似的含义.不过, ...

  6. 面向对象OO第5-7次作业总结

    面向对象OO第5-7次作业总结 学习OO七周了,深切的感受到了这门课程的不友好.前三次作业能够算是勉强地通过了,但是从第五次作业开始就完全GG了.这三次作业,从多线程电梯开始,然后文件监控,然后到出租 ...

  7. 面向对象OO第1-3次作业总结

    面向对象OO第1-3次作业总结 学习OO已经四周了,对OO以及JAVA的编程也算终于了解了一丢丢.现在做完了三次的编程作业,对前三次的作业做一次总结. 第一次作业 ------------------ ...

  8. OO第三单元作业总结

    OO第三单元作业总结--JML 第三单元的主题是JML规格的学习,其中的三次作业也是围绕JML规格的实现所展开的(虽然感觉作业中最难的还是如何正确适用数据结构以及如何正确地对于时间复杂度进行优化). ...

  9. 【OO学习】OO第四单元作业总结及OO课程总结

    [OO学习]OO第四单元作业总结及OO课程总结 第四单元作业架构设计 第十三次作业 第十四次作业 总结 这两次作业架构思路上是一样的. 通过将需要使用的UmlElement,封装成Element的子类 ...

  10. 【OO学习】OO第三单元作业总结

    [OO学习]OO第三单元作业总结 第三单元,我们学习了JML语言,用来进行形式化设计.本单元包括三次作业,通过给定的JML来实行了一个对路径的管理系统,最后完成了一个地铁系统,来管理不同的线路,求得关 ...

随机推荐

  1. SSH File Transfer遇到错误"too many authentication failures for root".A protocol error was detected......

    在SSH  Secure Shell 连接Linux centos的时候,遇到F-Secure SSH File Transfer错误"too many authentication fai ...

  2. 对Can We Make Operating Systems Reliable and Secure 的翻译

    摘要:微内核-相对于大内核(monolithic kernels)来说,由于它的 lower performance,长期以来被认为是不可接受的.而现在,由于它潜 在的高可靠性(higher reli ...

  3. February 28th, 2018 Week 9th Wednesday

    Knowledge makes humble, ignorance makes proud. 博学使人谦逊,无知使人骄傲. Humility is not equal with being passi ...

  4. centos7下安装docker(15.6docker跨主机网络---Weave)

    Weave是weaveworks开发的容器网络解决方案.weave创建的虚拟网络可以将部署在多个主机上的容器连接起来.对于容器来说,weave就像一个巨大的网络交换机,容器可以直接通信,无需NAT和端 ...

  5. windows下python2和python3共享

    其实最好的解决方案使用 virtualenv http://pythonguidecn.readthedocs.io/zh/latest/dev/virtualenvs.html 不太好的方法,先安装 ...

  6. 测试中 unittest.main(verbosity=1) 是什么意思

    这里的verbosity是一个选项,表示测试结果的信息复杂度,有三个值0 (静默模式): 你只能获得总的测试用例数和总的结果 比如 总共100个 失败20 成功801 (默认模式): 非常类似静默模式 ...

  7. 文本分类实战(一)—— word2vec预训练词向量

    1 大纲概述 文本分类这个系列将会有十篇左右,包括基于word2vec预训练的文本分类,与及基于最新的预训练模型(ELMo,BERT等)的文本分类.总共有以下系列: word2vec预训练词向量 te ...

  8. VMware15安装MAC(MAC OS 10.13)(OS X 10.14)原版可升级最新可解锁macOS Unlocker3.0(OS X 10.13)

      目录树 1.1.2安装环境: 1.1.3所需资源: 1.1.4 Unlocker 3.0解锁 1.1.5 配置环境 1.1.6开始安装 1.1.7开启虚拟机进入MAC安装界面 1.1.8 macO ...

  9. Scala主构造器参数是否升级为成员与是否有get/set

    1:主构造器前面添加val/var 关键字则升级为类成员,否则只是构造器中的一个参数而已. 2:private 修饰get/set方法权限,private var/val 成员变量,则有get/set ...

  10. (三)JavaScript 语法

    字符串(String)字面量 可以使用单引号或双引号: "John Doe" 'John Doe' 数组(Array)字面量 定义一个数组: [40, 100, 1, 5, 25, ...