• OO第四单元--UML规格


    一、架构设计

    本单元三次作业按照迭代的方式实现。最终设计架构图如下

    在第一次作业中只完成了UML中解析类图的部分,其主要功能集成在MyUmlInteraction中,构造了MyClass、MyInterface、MyOperation三个类来辅助完成。

    在第二次作业中将第一次作业中的MyUmlInteraction修改为MyClassModelInteraction,并作为MyGeneralInteraction的父类以完成相应解析类图的功能。同时新建了MyUmlStateChartInteraction和MyUmlCollaborationInteraction两个类分别实现UML中解析状态图和顺序图的功能,两者相互独立,同时新建了MyInteraction、MyRegion、MyStateMachine来辅助功能的实现。

    在第三次作业中加入了检查功能,实现其中checkForUml001-checkForUml006均为类图部分的检查,实现方式为在MyClassModelIteraction类中新建方法。其中checkForUml007和checkForUml008为状态图部分的检查,实现方式为通过在MyGeneralIteraction中调用MyUmlStateChartInteraction中对应的实现。

    本单元三次作业的实现均相对较为独立,因此以迭代的形式实现代码可以在减轻工作量的同时使得架构更为清晰以及更容易进行修改。

    二、整体架构设计与OO方法理解的演进

    第一单元完成了函数求导的功能,由于刚开始接触面向对象的编程思想,所以在完成时没有考虑过后续迭代的问题,而是以一种披着面向对象的外壳但实质上是以面向过程的方式实现的写法。在开始的时候有很多次都出现了方法过长的问题,这样也间接地导致了代码臃肿,可读性极差。所以第一单元的三次作业基本上都是次次重构完成。

    第二单元主要涉及了并行编程的知识。第一次接触到"线程"这个概念,因此在思考模式上短时间并没有很好地转换过来。第二单元第一次作业我就使用了轮询的写法,这也导致了最后强测出现了TLE的问题。就整体架构而言我在实现过程中更注重迭代开发的想法,因此每一次实现都是在前一次的基础上进行的,但同时也对过去的代码做了小部分的修改,因此事实上并没有很好地以继承多态的面向对象思想去解决问题,迭代开发过程还是有一定的问题。

    第三单元实现难度其实通过阅读JML描述并不是很难,甚至感觉考察的主要内容是图算法。因此在设计过程中只实现了题目描述的几个类,而没有以迭代的方式进行。这就导致了在最后代码十分臃肿的问题。

    第四单元应该是所有作业中最让我体会到面向对象中"迭代"的思想的了,由于功能实现之间独立性较高,因此我在代码实现中一般都是通过继承实现的相应功能,与前面的代码相比可以明显感觉到整体架构更为合理,同时迭代开发的难度也逐步降低。

    从整体上来说可以感觉到在这个过程中,我对于处理问题的思考逻辑还是有了很大的改变,比起最开始读完题就开写,不思考架构只考虑如何解决问题。到最后将架构设计放到首位,整个过程还是可以感觉到明显的变化。

    三、测试理解与实践的演进

    在第一单元最开始的测试中,我采用的方式主要还是"人工"构造数据集进行测试,后续发现了这一做法过于繁杂,因此使用了python实现了一个自动对拍测评机,这也让我在最后的互测中"大杀四方"。

    在第二单元的测试中,由于测试结果和输入顺序有关,因此我也是采用了使用python脚本进行对拍检测,不过相对来说这个单元的正确性问题还是不是很大,主要是相关性能以及调度算法的影响。

    在第三单元的测试中,我们也首次接触了Junit这一覆盖式测试方法,但是由于第一次作业实现过于简单,中测测试点过于粗糙,导致了我过于膨胀而在强测中爆炸的问题。在后续注意到这一问题之后我也是采用了Junit对我的代码实现进行了覆盖式测试,不过感觉测试数据的构造仍然是一个问题,但相对来说也可以解决较多的问题。

    在最后一单元的测试中,测试做的相对较少,仅仅只是和同学进行了部分数据的对拍,这也导致了在强测中出现较多问题的情况。

    四、课程收获

    通过OO的学习,个人感觉意义还是比较大的,不仅促使我了解到了Java这种编程语言,更多的还是让我体会到了"面向对象"的这种编程思想,这也不仅仅适用于Java编程,对于Python等语言也有一定的参考价值。这一设计模式,也让我体会到了描述过程和描述对象的区别,在思考问题是更多的会去思考如何拆分任务而不是找到流程。将数据和行为组织到一起,能够让整体更为逻辑清晰,对于解决大型项目任务也起到了很好的参考意义。

    五、三个具体改进建议

    1.建议每次实验课结束之后可以有相应的讲解部分或者是给出答案

    2.希望能够一定程度上加大第三单元中测的强度,虽然不建议面向测试数据编程,但还是希望能够有一定的参考性,而不是只是检查是否编译通过这种强度

    3.JML工具链这部分博客作业感觉配置环境难度远高于其本身的难度,建议有所修改

    六、线上OO课程的体会

    由于疫情影响导致本学期的OO课程只能于线上进行,我个人认为线上授课的效果还是一定程度上较线下授课不如的。其中主要集中在理论课这一方面,线上授课由于缺少了和老师之间及时的沟通交流,专注度相对来说会受到一定的影响。但总的来说理论课的授课效果还是比较好的。

    除了理论课以外还有实验课和研讨课。其中实验课的考察形式相对没有平时作业那么硬核的,不过对基础知识的掌握还是很有考察意义的,只是希望后续能够对于实验课考察的内容能够给出一定的讲解,因为学生可能会不清楚自己自己理解的是否是正确的。而研讨课这种形式我个人认为还是非常有意义的,尤其是在OO这门课程初期,很多知识都需要自行去掌握,同学们的经验也在很大程度上起到了指导的作用。

    其中我个人觉得最不受影响的就是作业部分,考察依旧硬核同时不受到线上环境的影响,在一周一周的逼迫下也让我从最开始的"Java从入门到精通",演变成了后面的的"设计模式:可复用面向对象软件的基础",再到后面的"java多线程编程核心技术"以及后面的JML和UML,整体来说还是感觉非常有收获的。

  • 相关阅读:
    android.graphics(2)
    Android 性能优化:字体 (为自定义字体提供字体内存缓存)
    管道相关函数(1)-pipe
    【译】用boosting构建简单的目标分类器
    Ubuntu下matlab快捷键设置
    mysql导入sql文件,乱码,一个例子
    PHOG特征
    图像卷积、相关以及在MATLAB中的操作
    matlab实现hog特征
    操蛋的CTex
  • 原文地址:https://www.cnblogs.com/1806lay/p/13166304.html
Copyright © 2020-2023  润新知