OO Unit4 Summary
目录
-
一、第四单元作业架构
-
二、架构设计思维及OO方法理解演进
-
三、测试理解与实践的演进
-
四、课程收获
-
五、改进建议
一、第四单元作业架构
第四单元需要实现UML解析器,即实现UserApi接口即可。程序会传入一个UmlElement数组,为了方便实现一系列方法,考虑通过预解析,建立层级结构,其依据参照starUml中的结构即可。
模拟类图时我采用了如图的结构,除了如图的组成和继承关系外,MyClassOrInterface储存关联关系,MyClass储存继承和实现关系,MyInterface储存继承和实现关系。关联关系通过UmlAssociationEnd和MyClassOrInterface的HashMap实现,继承关系和实现关系用MyClass和MyInterface的List实现。
SequenceUML
模拟顺序图时我采用了如图的结构,除此之外,MyCollaboration还储存了属于它的attributeId。
StateUML
模拟状态图时我采用了如图的结构,主体采用的是MyState和MyTransition的图。没有做成简单的树形结构的原因是图更适合作为状态图定义一系列查询的数据结构。除此之外MyTransition储存了UmlEvent和UmlOpaqueBehavior。
GeneralizationGraph
这是一个简单的以MyClassOrInterface为结点以继承关系为边的图结构,目的是处理重复继承和循环继承的判断。对于重复继承的判断,可以采以广度优先遍历为主体;对于循环继承的判断,可以采用以深度优先遍历为主体。
二、架构设计思维及OO方法理解演进
回顾时长整个学期的面向对象课程的学习,每个单元都有其重点。
-
第一单元以表达式为背景,通过解析表达式建立层级结构,再定义一系列类和方法解决问题。第一单元初次接触面向对象式的编程,相较于面向过程式的编程,让我感到最大的不同点是面向过程式的编程每个方法定义聚焦于以该层级的视角去审视问题,侧重于该层级的自身操作以及与其他该层级对象的数据交换,通过调用下层的方法从而忽略底层细节。
-
第二单元以电梯为背景,接触多线程编程,对我来说这是一种崭新的架构设计模式。重点聚焦于各个线程所要做的事情以及协调各个线程信息交互——通过加锁共享对象实现互斥访问。设计思维上的最大收获是接触了多线程的coding模式。
-
第三单元以社交网络为背景,学习JML规格的阅读。同时按照JML规格的要求,利用java自带容器和算法实现低时间复杂度的方法。最大收获是掌握了契约式编程,它规定了开发者和使用者之间的规范。
-
第四单元以UML图解析为背景,作业重温层次化结构设计,个人感觉第四单元设计起来和第一单元有异曲同工之妙。同时学习了UML的相关知识,具备深远意义。
通过四个单元的训练,我对架构设计思维和面向对象方法在编程上也有了粗浅的理解。
就现在知识所言,我认为所谓架构设计,其实就是层次化结构设计。对于一个复杂问题,需要逐层去分析并设计。以第一单元练习为例,分为表达式层级、项层级和因子层级。表达式层级的交互需要考虑加减法,项层级的交互需要考虑乘除法。当去实现表达式层级的加减法时,不需要考虑项层级的乘除法实现细节。这很像上学期的计算机组成原理的CPU设计,同样是逐层分析设计。
对于面向对象的思想,我想用一个比喻来形容。将整个项目比作一个工厂,每个员工(类)掌握一定的技能,负责它的任务(改变类自身状态)以及与必要的其他员工进行交流(类之间交互)。我们是这个工厂的负责人,需要合理安排每个员工的工作(类内聚性及耦合性设计)以及确保工作流程的顺利进行(项目正确性)。面向对象侧重于以对象为单位描述事件,创作每个人物来填充整体布局。对比面向过程式编程,它代表了一种不同的认识世界的角度。"横看成岭侧成峰",二者没有对错之分,在特定的场合具备其独特的优势。
三、测试理解与实践的演进
通过oo课程的训练,我对测试的概念加深了许多。简要来说,测试分为黑盒测试和白盒测试。具体落实到我的作业中,白盒测试主要集中在coding过程中对单个类进行测试,黑盒测试是在coding完成后构造数据或用评测机进行测试。
夹带一点想说的私货,我在测试方面最大的进步是逐渐学会了开发评测机。
-
第一单元我初次尝试进行评测机开发,我利用python提供的sympy库完成了数据的生成和正确性验证,但由于时间原因没有完成自动化评测,所以这个单元的测试是手动化实现的。同时这一单元由于我初次接触构造数据生成器缺乏经验,导致生成的数据强度方差较大,存在过于简单以及过于复杂的数据,结果不尽人意。
-
第二单元我与同学合作开发了一套评测机,我参与设计了数据生成、自动化评测以及后期评测机的维护工作。对于数据生成部分我做的要比第一单元好,我可以按照需求来指定数据生成的类型(包括随机间隔投喂数据,一次性投喂数据等等多种模式)。
-
第三单元我独立开发了评测机。数据生成部分可以根据需求生成指定的数据类型。同时用户友好性较第二单元有部分提升。
四、课程收获
OO课程教给了我很多,学完这门课,我切实感到了自身的成长。
首先是知识层面,我接触了许多日前从未涉猎的东西,包括OO式的开发,多线程,JML以及UML图,每个单元我都学到了实打实的知识;再者是能力层面,包括设计构思、阅读JML、工具使用、测试、代码规范等等,雷达图各项指标都得到了提升;最后是情感层面,经过一个学期的训练,面对中型的项目我更有信心且得心应手。同时在写作业时设计架构的投入感也使我印象深刻。
最让我有感触的是,当我在面对第四单元的任务时,我已不再像第一单元一般窘迫不堪,而是已经能从容完成一个令我满意的设计架构。开学时种的OO树,今已亭亭如盖。
五、改进建议
-
第一单元的经历至今历历在目,我的想法是部分知识(如递归下降法)可以提前到pre课程中,通过5次task的逐步引导完成一个具备解析表达式功能的简单程序,为第一单元的作业铺好台阶。
-
目前研讨课课堂大都是介绍作业的架构,有时会出现一个单元作业多次介绍架构的情况,不免有些重复。个人认为研讨课可以适当降低对作业架构介绍的比重(一个单元介绍一次即可),增加对课外知识的补充(比如第一单元或第四单元引入设计模式介绍、第二单元JVM底层实现、第三单元容器底层实现等)。
-
提出一个关于作业打分想法,在作业打分时不仅关注性能,更关注作业的架构设计的优势。综合评判一份作业,不仅仅关注第一单元的表达式长度、第二单元的电梯运行时间,更要关注这份代码写的是不是"漂亮"。