一.第四次作业回顾
1.第一次作业
目的:解析UML类图
做法:
自行定义了MyInterface类,用来存储UMLInterface及该接口继承的接口;定义MyClass类存储UMLClass及该类的父类、该类的顶层父类、该类应用的接口和继承的接口等等信息;定义MyOperation类存储UMLOperation及该方法的传入传出参数,方便后续的查询。用hashmap来存储id到类、接口等的映射关系,集成在base这个类中。在计算类应用的接口,在类、接口的继承关系链上采用记忆化搜素即可。
2.第二次作业
第二次作业并未通过中测,就不贴类图了
目的:解析UML类图、顺序图、状态图,并进行基于几项规则的合法性检查
做法:
分设四个类,分别用于解析类图、状态图、顺序图、检验合法性,最后再一个大类中实例化上述四个类,并调用相关方法
二.OO方法及架构设计的理解
多项式求导单元:
初次接触java这门编程语言,对其尚感陌生,因此这一次作业难度并不大。主要涉及到正则表达式、java常用的数据结构(如ArrayList、HashMap)的运用。相比于面向过程的c语言,java这类面向对象的语言更强调封装。比如正则表达式就是封装好的工具,你只需要拟好匹配字符串对应的正则,就能自动帮你识别别按一定规则进行分割,而在C语言中对字符串的识别和分割是个老大难的问题。这样程序员不用再去手写有限状态机而头疼,转而能将注意力集中在解决问题的算法上,极大降低了编程难度。
多线程电梯单元:
引入了多线程之后就带来了数据一致性的问题,为了确保临界区资源数据一致性的问题,又引入了锁的概念。在这一系列的作业中,临界区资源就是请求队列,我采用了单例模式,将之实例化为一个对象,存入各电梯中,再由电梯和请求队列交互进行请求的分发,总之就是要注意保证线程的安全问题。
JML规格单元:
本系列作业对性能的要求更高了些,个人感觉考察数据结构的意味更浓。你需要采用合适的数据结构去存储整张图,方便后续的查询,并需要在更改图进行信息的更新保存,之后再查询就不用重新计算,降低总的运行时间
UML单元:
UML是非常崭新的单元,让我了解了这门统一建模语言是如何用特定的数据结构去描述一张图,以及这张图又是如何描述你的模型。这一单元主要是采用hashmap建立id和类、接口的映射,通过记忆化搜素的方式在类、接口的继承链上回溯。
三.测试的理解
多项式求导单元:
最初是手动构造边缘数据,不过感觉效率很低,也很麻烦,后来了解到了对拍这一方法,在第二次作业、第三次作业都用上了简易的对拍器,去比较自己的求导结果和别人的求导结果(带入x=2),如果不同则手动检查。感觉非常方便。
这是第二次作业对拍代码:
bat脚本代码:
:loop
%makeData.jar用于产生输入数据,输出到当前文件夹下的in.txt%
%makeData.jar需要自己写产生输入数据的java文件,然后导出jar包%
makeData.jar
%从Altergo工程里导出jar文件,运行jar文件,求导后的表达式就输出到了Altergoout.txt%
java -jar Altergo.jar < in.txt > Altergoout.txt
%calmy.exe是pyinstaller打包python程序后所得的可执行程序,带入x=2计算求导后表达式的值,输出到Altergoans.txt%
calmy.exe < Altergoout.txt > Altergoans.txt
java -jar OO_homework_1.jar < in.txt > myout.txt
calmy.exe < myout.txt >myans.txt
%比较Altergo和我的结果,若一样则回到loop标签处,继续循环;若不一样则打印不同之处,结束程序%
fc /A Altergoans.txt myans.txt
if not errorlevel 1 goto loop
pause
:end
calmy.py源码:
from sympy import *
x=Symbol("x")
s=input()
s=s.replace("^","**")
try:
s=simplify(s)
num=round(s.evalf(subs={x:2}),2)
print(num)
except:
print("WRONG FORMAT!")
多线程电梯单元:
这一单元本来也想写对拍器来帮忙测试的,不过写的对拍器代码有点长,bug没有de完,因此测试采用的是手动构造构造数据的方法,构造的数据也相对简单,没几行,多线程这一单元输出不是确定的,肉眼检查也很麻烦。因此本地测试并不是特别的充分,强测也wa了很多点
JML规格单元:
初步尝试了JMLUnitNG,做了一些简单的自动化测试。
安装好JMLUnitNG后,在本地编写好测试函数:
测试结果:
过程虽然麻烦,但总归是了解了新的自动化测试方式
UML单元:
在starUMl里边做图,并用官方的解析工具从mdj文件中导出测试数据,然后手动去检验
四.课程收获
1.熟练的掌握一门新的、实用的编程语言java
2.深入的理解了面向对象的思想和实现方法
3.对代码设计架构有了更大的重视,一个好的架构能极大减少往后开发和维护的麻烦
4.对代码开发过程中的相关测试工具、测试方法有了更多地了解,这些方法能帮助我们更快更高效的debug。
五.改进建议
1.调整周五上完新课后下午立即上机的安排,新东西总是需要时间消化的,这样的安排在我看来会使下午的上机效率不高
2.希望老师能提前下发课件,能够让我们有时间预习并了解上课内容