OO第四单元总结

一、第四单元作业的架构设计

​ 由于每次作业均为上一次作业的增量开发,故此处只分析第三次作业。

1、架构设计

模块:

  • MyImplementation类:顶层类,所有的查询指令均通过此类来进行
  • ClassManagement类、SeqManagement类、StateManagement类:分别负责类图、顺序图、状态图的管理以及查询指令的具体实现
  • 其余类:为了更好地管理不同元素之间的层次关系,构建了一些与基本元素对应的Myxxxxxx类

实现思路:

​ 所有指令通过MyImplementation类分发到ClassManagement类、SeqManagement类、StateManagement类中,这三个类中存储着相关的元素以及相关图的数据结构,Myxxxxx中存储着查询指令需要的各种信息,一层层逐步向下直到分解为最基本的信息,实现了层次化设计。

2、迭代开发

​ 第一次作业只涉及到类图,因此将类图的相关结构以及所有指令的具体实现放在了MyImplementation类中;第二次作业增加了顺序图和状态图,为了避免某一个类中的代码行数过多,新增了三个类ClassManagement类、SeqManagement类、StateManagement类,分别负责类图、顺序图、状态图的管理,同时将查询指令的具体实现从MyImplementation类移至这三个类中,有效地解决了某个类中代码行数过多的问题。

3、缓存机制

​ 在查询指令中,设置了缓存机制来提高查询效率,示例见下。

public int getDepth() {
	if (checkedDepth) {
    	return depth;
    } else {
    	depth = 0;
        MyClass myClass = this;
        while (myClass.getFather() != myClass) {
        	depth = depth + 1;
            myClass = myClass.getFather(); //更新myClass
        }
        checkedDepth = true;
        return depth;
    }
}

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

1、第一单元作业

​ 第一单元作业为表达式解析,当时对架构设计和OO方法都还非常不了解,加上表达式解析本身的难度就比较大,需要实现递归下降法,第一单元的作业做得比较痛苦。第一次作业,对着training代码的递归下降法"照猫画虎",到截止时间前一天晚上才发现原来核心功能都没有实现,还好最后有惊无险地写完了。第二次作业增加了更多的因子,难度增加得非常明显;第三次作业增加了多层嵌套,难度与第二次作业相比有所下降。

​ 在这个单元,我初步解除了层次化设计、递归下降法和抽象化,亲身感受到了一个好的架构能够让迭代开发变得更加方便,减少重构的代价。

2、第二单元作业

​ 第二单元作业为实现多线程电梯系统。在这个单元,我见到了多线程的各种"飘忽不定",也吃过线程安全没控制好的亏,在三次作业的迭代开发中了解了多线程的同步互斥、线程安全、线程通信。对于电梯的管理和控制锻炼了我的架构设计能力,我会不断地思考在电梯这个类中需要添加哪些属性和方法,如何用distributor来管理多部电梯,如何确保电梯系统能够顺利结束……也在这个过程中锻炼了封装的能力,对高内聚低耦合有了进一步的认识。

3、第三单元作业

​ 第三单元作业为阅读JML编写代码实现一个社交网络。这个单元的架构基本上已经由课程组给出,通过对这个官方架构的学习,我对层次化和封装了解地更加深入了。比方说,使用Myxxxxx类对基本元素进行扩展,可以将与基本元素有关的信息和方法封装在这个类中,以便更好地进行管理和查询;使用MyNetwork这个顶层类来存储元素的数据结构、封装各个查询方法,所有的查询指令都经过该类,然后再层次下降到各个具体的Myxxxxx类等。

​ 在这个单元,我还感受到了JML和自然语言描述的不同之处。自然语言容易产生二义性,而JML描述不会出现这样的问题,因此更适合工程交流;自然语言一句话能够描述很复杂的问题,可能需要很复杂的代码才能实现其一句话,但JML语言由于使用起来比较复杂,因此它能够控制一个方法的复杂度,使得方法不容易出错;自然语言无法直接对应数据构造,而对着JML的前置条件和后置条件能够很方便地构造测试数据并检验方法的正确性。JML的这些特性,让我更好地实现了方法的高内聚和低耦合,对OO方法有了亲身实践,体会更深了。

4、第四单元作业

​ 第四单元作业为实现UML解析器,由于类图、顺序图、状态图本身就具有非常强的层次性,这一单元的代码作业更是体现了层次化的设计思想以及OO方法的重要性。所有指令通过MyImplementation类分发到ClassManagement类、SeqManagement类、StateManagement类中,再继续分到各个Myxxxxx类中,异常的抛出也是一层层抛出的,这有效地降低了各个部分代码的复杂度,让每个部分的功能更加地纯粹,实现了高内聚、低耦合,也降低了bug出现的概率。同时这一单元涉及到的元素很多,将哪些信息存储到哪些元素中也非常考验我们的封装能力。

总结:我们在拿到一个问题时,需要首先考虑它的整体架构设计,如何一层层地将问题分解,类与类之间如何进行联系;之后再考虑每个方法的具体实现细节,在类中补充相应的属性。将架构设计好再进行编程,能够提高编程的效率,同时能够尽可能地减少急于编程的盲目性,减少bug的出现。

三、四个单元中测试理解与实践的演进

1、数据生成

​ 数据生成可以采用数据生成器或者手动构造。其中数据生成器可以快速构造大量的数据,通过大量数据可以在一定程度上提高测试数据的覆盖性,如果生成器质量较高,可以获得很不错的数据强度;手动构造数据强度难以保证,但是能够有效覆盖到一些特殊的边界情况。如果希望能够拥有非常好的测试效果,一般需要采取数据生成器加手动构造相结合的方式。

2、数据强度和覆盖性

​ 数据强度主要指数据的复杂度,覆盖性主要指数据调用了总代码中百分之多少的代码。在第三单元中,如果图过于稀疏,就难以保证数据强度,可以通过初始化来保证一定的边数,让图有一个基础的复杂度。要想提高测试数据的覆盖性,一个很好的方法是模块测试,这在第三单元的JML训练中用得非常频繁。

3、正确性检验

​ 正确性检验有很多方式,比方说可以采用一些库进行辅助,可以使用逻辑分析编写检验程序,还可以采用和同学对拍的方式。当然,对拍的话两个人还是不太够,我就曾经出现过两个人对拍完全一致,结果强测都翻车了的情况。

四、课程收获

1、java和编程能力

​ 真的没有想到,原来可以被第一次作业"逼得"在一周内速成java,并在后续作业的不断编程中对java有了更深入的了解(果真ddl可以促进生产力)。另外,这学期的代码规模比以前有了很大的提升,我的编程能力也有了很大提升。

2、架构设计、层次化设计和OO方法

​ 在一次次的作业中,架构设计、层次化设计和抽象化能力有了很大的提升;也对OO方法有了更深入的了解,学会了封装,明白了高内聚低耦合的意义。

3、多线程和设计模式

​ 掌握了多线程的很多知识,第一次自己实现了多线程。在实现多线程的过程中,了解了很多有用的设计模式。

4、抗压能力和时间规划能力

​ 实话实说,OO课程的任务量确实是非常重的,在每周一次作业的训练下,我的抗压能力得到了很大的提升;另外,由于每次作业都算得上是一个大作业,而且难以准确估计每次作业需要的时间,这更锻炼了我的时间规划能力。

5、表达沟通能力

​ 研讨课的小组讨论,让每个人都有机会表达自己的想法,很好地提升了我的表达沟通能力。

五、给课程的三个具体改进建议

1、实验课

​ 目前实验课的整体流程感觉不是很完善。

  • 可能的解决方案:实验结束后可以考虑出一些官方解读分析,或者收集同学们的分享。

2、研讨课

​ 各小组展示环节由于准备时间以及展示时间较少,思路不是那么地清晰,听者难以迅速听懂并把握其中的重点。而且目前每次研讨课我们是看不到其他小组的会议记录的,小组展示环节分享的东西其实较难完全吸收。

  • 可能的解决方案:小组展示时要求展示的同学在黑板上列出要点或者简单画个思维导图,而不只是说;很多同学在研讨时有很多闪光的想法,可以在每次研讨课后收集大家的想法整理成一个文件发给大家学习借鉴,这是非常宝贵的。

3、讨论区

​ 目前讨论区采取的形式为每个单元开辟一个讨论区,除了一个指导书答疑帖外,其余没有做细分,这使得讨论区的信息比较乱,难以快速找到自己需要的信息。

  • 可能的解决方案:
    • 将讨论区分为每个单元、研讨课、总体三个部分
    • 在每个单元的讨论区中可以对讨论区进行细分,分为不同的版块,如:
      • 指导书疑惑版块
      • 数据生成与测试
      • 架构分享
      • 等等
posted on 2022-06-28 22:58  lr20  阅读(45)  评论(0编辑  收藏  举报