OO第四单元总结

OO第四单元总结

一、本单元架构设计

 

1.数据结构

本单元对UML元素采用HashMap<String, Uml*>的存储形式,键值为元素的ID。由于元素ID唯一,因此采用此种存储方式十分便于写入和查询。

由于本单元查询指令和有效性检查对于三个图是独立的,因此为了降低耦合度,对类图、顺序图、状态图中元素进行分开管理。MyImplement类储存类图元素,MyCollaboration类储存顺序图元素,MyStateMachine类存储状态图元素。其中,MyStateMachine会根据数据所在状态机的不同将其分派到对应的MyRegion类进行管理。

对于需要利用图论算法进行查询的元素(类、接口、状态)分别建立拥有更多信息的类(MyClass、MyInterface、MyState),最重要的作用是存储其在有向图中可到达的节点集合,以便进行相关查询。类和接口的有向图存储于MyImplement中,状态的有向图存储于MyRegion中,对图的查询直接由上级委派到此级进行,以实现对数据的层次化管理。

2.层次化设计

1)查询指令

关于类图的查询指令直接在MyImplement类中进行。

关于顺序图的查询指令由MyImplement类下达到MyCollaboration类中进行。

关于状态图的查询指令由MyImplement类下达到MyStateMachine类中,再由MyStateMachine类根据查询指令的具体类型决定在本层次进行还是分配到某一个或所有MyRegion类中进行。

2)有效性检查

所有检查指令都会先由MyImplement类下达到MyCheckClass类中。

关于类图的检查会由MyImplement类向MyCheckClass类传入必要的容器对象,MyCheckClass类利用传入参数在本层次内完成检查。

关于顺序图的检查会由MyCheckClass类交由MyCollaboration类进行。

关于状态图的检查会由MyCheckClass类分配给MyStateMachine类,再由MyStateMachine类根据检查指令的具体类型决定在本层次进行还是分配到所有MyRegion类中分别进行。

二、架构设计思维及OO方法理解的演进

1.第一单元

① 在一单元中初步建立了对面向对象程序的认识,包括面向对象程序的框架、三个关键类(输入处理、主控、核心数据管理),了解其与面向过程程序的区别。但由于是初学者,第一单元作业仍有较大比重的面向过程代码,圈复杂度较高。

② 本单元对迭代和重构有了初步的认识,认识到了代码可扩展性在工程开发中的重要性。若可扩展性较低,则需要进行增量开发时势必会引起重构,实际上是降低了开发效率。

③ 对层次化设计有了初步理解和掌握,我们应按照数据或行为建立抽象层次,并对多层次对象进行归一化管理。然而遗憾的是,受到以往以解决问题为主要目标的面向过程编程思维的束缚,第一单元作业的层次比较模糊,并没有很好地抽象出合适的层次。

2.第二单元

① 本单元重点在于对多线程编程的掌握,主要包括对几种设计模式的理解、对线程安全的理解和保证。

② 在经过第一单元的洗礼后,本单元代码的可扩展性很高,每次迭代都只需要进行必要的增量开发而未进行重构。对层次化设计有了进一步理解,本单元层次抽象效果较好。

3.第三单元

① 本单元重点在于对规格化设计的理解与掌握,集中体现在对JML规格和Java代码间的相互转化。

② 本单元的层次化设计主要在于抽象层次下的规格,其反映了设计者的架构思考,但我们在实现代码时要尽量实现这种层次化结构。

4.第四单元

① 本单元以实现UML图解析器为载体,重点在于理解和掌握UML语言

② 本单元的指令数较多,因此对层次化设计有较高的要求。因此本单元采用了类似第二单元将请求逐级分派的架构思维,将不同层次、不同类型的指令安排到合适的类中执行。

③ 本单元作业对面向对象思维有了最后的理解与升华,对第一单元学到的数据和行为抽象层次有了较深的理解,即:上层数据或行为可以概括下层数据,下层数据或行为可以扩展上层数据。

三、测试理解与实践演进

1.第一单元

本单元手动构造结构复杂、自己在编程中容易疏忽的数据进行测试。

2.第二单元

本单元手动构造逻辑较为复杂、多线程同时进行相同操作(易产生线程不安全)、容易超时的数据进行测试。

3.第三单元

① 手动构造覆盖规格所有输入情况的数据进行功能正确性测试。

② 利用Python程序生成大量高时间复杂度的指令进行性能测试。

4.第四单元

本单元手动构造类图、顺序图、状态图,通过官方包转化为输入数据后进行测试。

四、课程收获

① 提高了编写面向对象程序的能力,并对层次化设计有了由浅入深、由具体到抽象的认识。

② 理解并掌握了多线程编程、JML与规格化设计、UML语言/图等。

③ 提高了java程序设计能力与处理复杂工程问题的能力。

五、改进建议

① 加强对理论课知识掌握程度的考察。一味追求代码作业成绩将可能导致理论与实践相分离,具体可效仿CO和OS对理论与实践并行考察的方式,以提高教学效果。

② 第三单元可适当降低对相关算法的要求。有些数据点采取朴素算法无法达到性能要求,而追求性能更高的算法已不是本课程的学习目标,还会分散用于理解JML的精力,有舍本逐末之嫌。

③ 可以在单元总结课中给大家分享课程组认为的层次、功能、性能最好的架构思路,从而扩展同学们的思路并加深对面向对象编程思维的理解。

posted @ 2022-06-27 14:03  Rupertail  阅读(95)  评论(0编辑  收藏  举报