OO第四次博客
OO第四单元总结
第十三次作业
作业设计结构
本次作业结构比较简单,我主要是自己构建了各种类型的类,不使用jar包中自动转换的类,这主要是为了便于我对各种类型的操作。各项操作在MyUmlInteraction类中定义,之后在对应的class类或interface类以及更底层的类型中完成执行,最后得到结果。
第十三次作业的类图
作业度量分析
本次作业中我的MyUMLInteracting类有些臃肿,写了大约490行,这主要是因为有一些方法比如一些add方法在主函数中进行了大量的循环和判断,这些是可以转移到下一级类中的。在度量分析中,我的MyUMLInteracting类中大多数public的get方法在异常处理方面做了比较多的逻辑判断,所以复杂度比较高,add类型的方法刚刚已经讨论过了,而在Operation类中,我的isTyped方法使用了很多if-else语句来判断类型导致复杂度较高。
第十三次作业的度量图
作业BUG分析
本次作业我的程序出现了两个BUG。
第一个BUG在于UmlClass类中getOperationVisibility方法误认为operation项的visibility中package的字符串是“package-private”,但是应当是“package”。其实这一BUG我在之前已经找出了,在attribute中已经发现了,但是没有能够想到operation处。
if (vis.equals("package")) { //bug after fixed pag++; }
第二个BUG在于我的异常抛出,getClassAttributeVisibility方法需要抛出四个异常,为没有对应类,多个对应类,没有变量,多个变量。我在判断是否有多个对应类时采用边检测边计算的方法,因此可能产生存在多个类且第一个类存在多个变量或没有变量,而我抛出了与变量有关的异常。
for (int i = 0, num = 0; i < size; i++) { if (umlClasses.get(i).getName().equals(className) && (num++) > 1){ throw new ClassDuplicatedException(className); } }// 修复后的代码,这一段代码先判断了是否存在多个类。
第十四次作业
作业设计结构
本次作业结构比上一次稍复杂一点,但是其实并没有太大的区别,对于状态图和顺序图我按照之前处理类图的方法,建立了两个package存放相关的类型的类,按照各个类的级别依次向下计算,prejudge类我因为上一次作业的MyUmlClassModelInteraction类有490行,并且不太敢重构,所以重新构建了部分的需要的类的结构,进行计算,这样可能损失了一部分的时间复杂度。我对UML008和UML009以及statechart的SubsequentStateCount的计算方法全部使用了BFS的查找方法。
第十四次作业的主类图
第十四次作业的collaboration包类图
第十四次作业的statechart包类图
作业度量分析
本次作业尽管架构比较清晰,但是我的方法所需要的代码量和类的数量确实很多,因此我的不少类都存在一定的复杂度问题,经过我的总结,主要的问题在于type的计算使用大量if-else语句,构造方法使用大量循环和条件语句,add类方法使用大量循环判断语句,get方法的异常计算使用大量循环判断语句。
第十四次作业的度量图
作业BUG分析
我的程序并没有被发现BUG
在四个单元中架构设计及OO方法理解的演进
这四个单元中我们分别进行了多项式、电梯、JML、UML的练习。
其中第一个单元多项式在我看来主要还是适应java语言,并没有应用到OO的过多思想,我的主要设计方法依然还是面向过程的方法,各个类主要是按照运行顺序分类。
第二个单元电梯既使我们第一个开始区分请求、电梯、调度器、乘客等对象,开始按照对象建类,又使我们学习并发程序的控制方法,这时候我们对一些比较明显的对象开始区分
第三个单元JML我们主要是填方法,在最后的练习中我们的问题相当繁琐,但是助教们通过循序渐进的作业帮助我们区分这一问题中的对象,并帮助我们按照面向对象的方式解决这一问题。
第四个单元UML依然与上一个单元相似,但是助教的指导力度大大减少,我们还是要写出程序的核心内容,这也是对我们的面向对象思想的进一步磨练和检验。
在四个单元中测试理解与实践的演进
在第一个单元,测试是比较简单的,我可以通过随机生成数据,利用python来得到正确的答案,再进行对比进行测试,我所需要做的只是调整随机算法使其更加完善
但是到了第二个单元,我就无法成功得到生成数据的答案了,这时候存在两种方法,一种是自己想一些比较普遍或者比较极端的数据,进行测试,还有一种就是与他人对拍,我这两种方法都采用了。
在第三单元,我采用了老师所推荐的单元测试的方法,有着一定的效果,但是在我尝试随机生成数据时我并没有成功,这可能与JML的复杂性有关。
在第四单元,由于UML图的存在,进行测试相当复杂,因此我只是对中测中给的一些图再构建了一些数据测试了一下,也测试了一些其他特殊情况,但是这单元作业我的测试确实存在很大的漏洞。
课程收获
首先从OO课上我学到了大量关于OO的知识并且进行了大量的实践,对面向对象的理解是我最大的收获,面向对象思想主要就是将一个问题分成若干对象,每个对象规定好它的内容和行为,通过操作对象来解决问题。
再者这门课中我学到到了java(idea)的使用方法,也算是比较熟练的掌握了这一门面向对象语言的一些基本使用方法。
我还从这门课中学到了对代码风格的把握,一个漂亮的代码风格让人debug时心旷神怡,也便于与他人交流,同时降低了bug率。
同时我也从这门课上接触了一些比较新鲜的新的编程思想,比如函数式编程思想,也学到了一些工具的使用,比如JML和UML。
建议
1. 上机考试最好在偶数周,这样可以在从课上学到比较多知识后再进行检测。
2. 助教在微信群中说的一些话最好是注明一下是否是铁板钉钉的,否则可能会影响一些人。
3. 公测时查出的BUG在修复后不应该扣一分的BUG分,因为已经在强测时扣除了一些分数了。