• 第四单元UML解析器博客与学期总结——by Wazaki from BUAA


    第四单元UML解析器博客与学期总结

    写在前面

    在近几周,我们进入了面向对象程序设计第四单元(编写UML解析器)。在本单元中,我们首次接触了UML语言模型系统。UML语言为我们提供了一种面向对象式的抽象直观的描述逻辑。它把系统抽象表示为对象和对象之间的协同。通过可视化的模型图只管的来描述和展示系统功能、结构和行为。这种绘图式的语言,给予我们多种视角来理解系统。第四单元作业实现一个UML的解析器,从类图,到顺序图,状态图并进行规则检查。新接触UML图,对其中各个类型的元素之间的关系的理解非常重要。两次作业成增量式,对我们设计的代码构架和数据结构有着较高的要求。同时需要我们灵活运用继承与接口实现抽象。下面我将首先介绍我本单元作业的架构设计

    OO课程到此也接近尾声了,在本篇博客中,我还将介绍在本学期四个单元的学习中,我对代码构架,面向对象思想,测试方法等方面的理解演进过程,总结我的课程体会

    第四单元代码构架

    UML通过将一系列元模型实例化,为系统建立了整体的模型。对UML图进行解析,就要理解各个元素及之间的关系。我的思路是:通过解析类解析,建立对应的对象(类),并建立各个对象之间的关系,并配置适当的方法进行计算和查询

    解析类的方法说明

    解析类先对各种UML元素进行分类,然后为每一类配置built方法,在built方法中建立对应的Myxxx类,并建立元素与元素之间的关系。其重要注意的是处理某些元素是有先后顺序的要求的,如类图中Class和Interface要放在最前面,状态图中StateMachine和Region要放在前面,顺序图中Interaction要放在前面,Association要在AssociationEnd之后等等……

    最终建立出如下各类

     

     

    设置如上图所示各类元素(UMLxxx元素对应Myxxx类),所有元素共同实现Element接口(具有id和name的getter功能)。并且为了统一管理有共同特性的变量,在各种图中也设置了一些父类和接口等关系进行抽象。

    以最复杂的MyClass类举例

    其中成员变量存储了其本身的信息(id,name,visibility等)和与类相关的一系列元素(attribute,operation,interface,associate等),

    再根据要实现的查询方法,配置相关的方法进行计算,计算多采用递归的形式,查询自己进一步调用自己father的相应查询方法。

    将结果存储到相应的容器中,并配置标志。这样实现了Lazy的O(1)复杂度查询

    构架设计与面向对象思想的理解

    本学期OO课程,让我进入了面向对象编程的世界。在这个世界中,万物皆对象。没有什么new一个对象解决不了的问题,如果有,那就再new一个新的对象。说起来很简单,但是其中技巧非常之多。我们的面向对象程序需要具有高内聚,低耦合的特点,具有很强的复用性和扩展性。这需要我们充分理解并且合理运用JAVA封装,继承,多态这三个特点。封装为了程序的安全性,我们代码风格也要求我们进行合理的封装。而最关键的时继承和多态。通过继承,接口,重写等操作,会大大增强我们程序的可扩展性和复用性。

    为了让我们的代码真的很”面向对象“(优秀),这需要我们用更多的时间再设计构架上,具有扩展性的合理构架会让我们再一个单元的作业中受益非凡。下面我将介绍我在本学期四个单元作业中构架设计与面向对象方法的演进过程。

    在第一单元表达式求导的作业中,我对面向对象的理解不足,程序非常的“面向过程”,主要体现在大量核心代码集中在一个类,甚至一个方法之中;类与类之间的耦合度很高,我在使用Metrics度量分析我的代码时,很多类复杂度爆红;代码的扩展性很差,三次作业我都进行了大面重构甚至重写。

    经过第一单元作业的经验教训,在第二单元作业中,我非常重视代码的构架设计,注意类功能的内聚性,用包对不同功能的类进行了划分,并应用枚举类,单例模式,观察者模式等多种方法,让代码具有一定的扩展性。在三次增量式作业中,我的构架基本上可以支持扩展,让作业之间的迭代变得容易了很多。但是我对各种方法运用的还不够成熟,复杂度还是比较高。

    经过第二次作业对代码构架设计的锻炼,我对OO的思想有了一定的提高。在第三单元作业中,我基本上是进行增量式进展,架构有了一定的可扩展性。并且我学习封装了一系列数据结构,使类的功能性更加集中,代码架构更加加清晰。这从复杂度测试中可以看出,本单元作业的CK复杂度和方法复杂度测试显示都处于一个良好的状态。但是,我的代码构架虽然扩展性很好,但是在性能上不是很优秀。

    第四单元作业,我延续一学期以来学习面向对象的思想,使用了接口和继承对元素进行抽象,封装了一些数据结构,并对不同图的元素进行划分。保证了两次作业增量式设计,进一步锻炼了构架设计能力,让我对面向对象的思量有了更深的理解。

    总的来说,我认为通过本学期的学习,四单元增量式作业的练习,我初步建立了面向对象编程的思想。以Java继承,封装,多态的特点,学会运用了接口继承、数据结构封装和一系列设计模式等方法。并且深刻的体会到了代码构架设计的重要性,合理优秀的构架设计可以让程序的迭代和扩展变得轻松愉快。

    测试与实践

    在本学期的课程实践中,也同样让我感受到充分测试的重要性。同时也学习使用了一些测试的技巧与方法,这都让我受益良多。测试和构架设计一样,在一次作业的时间上占有很多的比重。

    在第一单元作业中,我在强测和互测中出现了一些bug,我的bug不是设计问题,而是特殊条件判断不全所导致。可是,如果我进行了充分的覆盖性测试,主要是鲁棒性测试,这些bug时可以在测试之前发现的。而我缺少构造测试集的有效方法,盲目构造,导致很多问题没有被发现。

    第二单元作业中,我学习编写和使用了评测机用python构造标程对我的程序进行正确性的判断,同时也进行计时,方便进行性能上的优化。这样有效避免了我优化时出现错误或进行负优化。在讨论课上,有同学介绍的评测集写法也让我受益良多。可以体现出每个电梯的忙碌程度的评测信息对优化有很大的帮助。

    第三单元和第四单元测试更加困难,需要写出较好的datamaker来减少“无效”查询。同时采用了和同学对拍的方式进行正确性的验证。在第三、四单元中,我还尝试了使用junit进行单元测试,和IDEA自带的coverage进行覆盖率测试,都对我们程序测试有着很大帮助。第三单元JML还为我们提供了规格化测试的工具与方法,在博客作业时进行了尝试。

    在互测屋中,我也大体采用了相同的方式。用大家的程序进行随机数据对拍,我也会手动构造一些私以为比较有难度的数据进行测试。在互测中阅读和裂解别人代码对拓展自己的思路和对题目思考的完备性有重要作用。

    总的来说,充分且完备的测试是非常重要的。对于程序应该先对其每个部分进行单元测试,如果可以构造出完备的测试集进行覆盖性测试(正例负例,鲁棒性测试)。但是完备的测试集的构造可能比较复杂,所以进行大量随机生成数据的测试(评测集或对拍)成为了测试的主要方式。

    课程感悟与收获

    本学期OO课程,将我们的视野从面向过程编程转到面向对象。本学期学习与实践都充分体现了面向对象的思想,也让我充分的体会到了面向对象的特点及其优势。合理运用JAVA封装,继承,多态这三个特点,让我们的面向对象程序具有高内聚,低耦合的特点,并且具有很强的复用性和扩展性。四个单元作业的实践,充分锻炼了我从设计、编写、测试完成一项任务的能力。

    每单元的增量式作业告诉我们一个好的构架的重要性,增量式的扩展形式也是工程上所必须的。上面介绍了我在四单元作业中构架设计的演进过程。经过本学期的学习,我的代码逐渐从“长条状”,逐渐模块化。将任务拆解成不同的功能的对象进行处理,对象内存储和加工数据;对象间进行信息沟通。我学会运用了接口继承进行抽象、数据结构封装和一系列设计模式等方法,并且我深刻的体会到了代码构架设计的重要性。

    每周五看指导书,周末进行构架设计,代码编写,debug和测试。周二提交进行强测,周三开始互测。每周千行代码的锻炼也大大提高了我们的马力,让我们痛并快乐着。说道这不得不提到今年新采取的互测屋的形式。我认为互测屋是一种非常有效的机制,让我们在发现别人代码的问题的同时,可以学习他人的代码构架与设计思路,反思自身代码存在的问题。在本学期学习中,我也学会了一些常用的测试方法,在今后的代码测试用大有裨益。

    OO课程对我的身心都是一种极大的锻炼。还记得每次提交期盼着一个个Waiting能够变成Accept;每两个小时刷新一次互测无看看没有没被刀;读作业指导书时种种奇怪的疑问……有看到强测满分的喜悦,有平安度过互测的情形,有被刀中的无奈……OO是由一个个ddl组成,更是由这种种感受组成的。OO使我们的本学期的生活非常充实。在上这门课之前曾听过无数的吐槽,当自己亲身经历之后,细细想来,我觉得一切又是那么的正常而又合理。体会到自己从各方面的成长是这门课程给我们最好的礼物。荆棘坎坷都是终点前激励,走过荆棘才能成为更好的模样。

    感谢老师一学期以来的教导,感谢助教的辛勤工作为我们提供最好的课程服务,感谢一路走过来的同学们,大家一起砥砺前行。希望大家都可以集OO之大成,学术之路上越走越远。

    对课程的几点建议

    结合我在本学期OO课程中的体验,我为课程提以下几点建议。

    1、希望可以在课程开始时给予各个单元作业所涉及知识的预告。

    2、希望可以在手机端推出企业号进行消息的通知。

    3、希望讨论课上,除了班级成员分享,能够划分小组进行讨论。

    4、希望在课上对于上机实验的内容给予更多的引导。

    5、希望增加更多设计模式的教学

    6、希望课程越办越好!

  • 相关阅读:
    获取配置文件
    微服务项目(1)
    string,stringbuffer,stringbuilder区别?
    异常
    IDEA结合Maven的profile构建不同开发环境(SpringBoot)
    出现org.springframework.beans.factory.NoSuchBeanDefinitionException 的解决思路
    Spring中的@Transactional(rollbackFor = Exception.class)属性详解
    Ubuntu安装飞鸽传输
    shell 创建带参数的命令方法
    python查询mysql中文乱码问题
  • 原文地址:https://www.cnblogs.com/WazakiBlogs/p/11066386.html
Copyright © 2020-2023  润新知