微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

面向对象第四单元总结

面向对象第四单元总结

一、架构设计

本单元要实现一个UML图解析器,三次作业分别针对不同的情况,与之前的作业关系不大,基本可以看做增量开发

第一次作业

第一次作业要实现一个UML类图解析器,在接口中我们需要从官方解析器中提取出各个UML类,重点在于如何存储这些类以及表现这些类之间的关系。与UML类图类似,UML类中的UMLClassUMLInterface是类图的基本元素,UMLClass包括UMLAttribute UMLOperation方法属性,其中UMLOperation包含有UMLParameter,因此我再此基础上建立MyClass MyInterface MyOperation三个类,实现其之间的关系。除此之外,对于继承、实现等关系,在类中设置专门的属性记录其实现的接口,继承的父类,关联的对端。

遍历UMLELement时建立相关的类或接口并将相应属性添加进去。对于查询指令,重点关注与继承实现有关的内容,我采用递归的方法,以类实现的接口为例,先找到其直接实现的接口,在递归寻找接口继承的接口,知道没有父类接口为止。

第二次作业

第二次作业要实现UML时序图和状态图的构建,基本思路与第一次作业一致,重点要区分各个类的作用和不同的UML图是如何实现的。

状态图:

状态图中的UMLStateMachine代表一个状态机,我新建一个MyStateMachine类,记录状态机中的UMLState UMLTranslation,新建MyState类,记录每个类可到达的类,寻找状态之间的转换时,只需遍历所有状态,判断其source target即可。新建MyTranslation类,用于存储状态转移中的事件。这次作业对起始节点,终止节点没有要求,都拿我还是在状态机中储存了相关信息。

时序图

新建MyInteraction类和MyLifeline类,Interaction需要存贮所有的lifeline和message,而Lifeline则存储其接收到的消息和发出的消息。

第三次作业

第三次作业与前两次不同,重点在于有效性检查。诸如类名不能为空,lifeline要与attribute对应这类错误,可以在遍历UMLELEment构建UML图时就进行判断,也可以在图构建完成后进行遍历检查。

这次作业的难点在于与继承、实现有关的错误。无论是重复继承还是重复实现,我们都可以将其看做继承、实现图中的一个环,因此对图中的每个元素进行遍历,如果有一条到达自己的路径,则一定存在环,因为我们遍历了所有元素,因此环中的每一个元素我们都可以找到,组成循环链。

二、四个单元中架构设计及OO方法理解的演进

第一单元

第一单元为表达式求导,我的基本思路是对字符串进行分割和提取提取出表达式信息,储存在表达式树种再进行求导。这种方法的缺点是每一次作业更新我都需要对字符串处理部分进行重构,加之我对树的相关操作不熟悉,导致第一单元有作业没有完成。

在这一单元,我的思维还很面向过程,关注的还是如何去解决求导的过程,仅仅是把这个过程拆分为几个部分,放入不同类中,对架构设计和类之间的交互合作还是不理解。不过在这一过程中我熟悉了java面向对象的一些基础知识。

第二单元

在第二单元中我第一次接触到了设计模式,课上实验中接触的的生产者消费者模式给我的架构设计带来了启发。把等待对列看做仓库,设定好取出和存入的线程安全,电梯线程,输入输出线程就可以对等待队列进行操作而不必担心线程安全问题。在这一单元,我体会到一个好的架构设计的重要性,三次作业没有太大的架构改动,唯一不足的是我在性能上的设计并不好。

第三单元

第三单元可以说是最简单的单元了,只需按照给出的JML规格进行填写,关注算法优化即可。与JML有关的代码规格和测试也让我对规范化设计有所了解。

第四单元

第四单元需要我们学习UML图的设计,理解了其设计,我们可以设计相应类之间的交互和联系。这一单元让我了解了UML图这一描述面向对象设计的工具,我们可以借助UML图设计代码也可以导出自己代码的UML图进而进行优化。

三、测试方法

第一单元构造测试数据的难点在于如何覆盖所有情况,在于同学和助教的交流当中发现,其实递归下降法也可以用于构造测试数据,覆盖所有情况。但我还是局限于手动构造。

第二单元我并没有找到很好地测试方法,主要是构造边界数据,来测试一些特殊情况。对于死锁、线程安全问题,还是需要大量的测试数据。

第三单元较为简单,在这一单元接触到了Junit测试方法,通过构造测试方法,可以对程序中的各个方法进行检查。在互测中也构造了一些可能会超时的数据,用来检查算法。

第四单元并没有找到较好的测试方法,在找bug过程中还是借助了其他同学的测试数据。

四、课程收获

首先我对java的基本属性和与面向对象有关的内容有了更加深刻的理解,学会了如何使用继承、接口等优化自己的设计。我对设计模式和架构设计也有了深刻的理解,学会了看到问题首先进行分析,寻找其有几个要素,各要素之间有什么关系进而思考如何设计代码结构,可以借助那些设计模式和面向对象的内容,而不是看到问题直接动手,在编写过程中反复重复造轮。同时debug和测试也更加得心应手,毕竟本学期的代码量大,功能复杂,对我自己是很大的考验。

本学期的训练对我的代码风格也有帮助,改掉了之前命名混乱,方法或者类代码过多的缺点。

除此之外,我对测试方法,设计规格等也有了新的理解,扩展了知识面。

五、课程建议

希望实验课能够公布测试结果

UML图贯穿了整个学期的学习,但是直到学期末我们才有所学习,我希望在课程前期可以添加一些UML的先导知识,这样可以让UML内容与面向对象更好的结合在一起。

JML规格可以让我们更规范地设计代码,但在学习过程中却变成了根据JML规格写代码,希望了解更多设计规格的内容

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐