面向对象设计与构造第四单元总结博客

面向对象设计与构造第四单元总结博客

大学二年级终于要结束了,这一年里上了好多门很难的课,写了好多代码,我觉得面向对象设计与构造应该在这一年的专业课学习中占了很大的比重。一个学期下来感觉OOP这门课在学习的过程中有一定压力,但是努力一下都可以克服,也能有很大收获,提高自己的代码水平,以下是我的一些总结。

本单元三次作业的架构设计

第一次作业

本次作业是刚刚接触UML时的作业,首先花了好久时间来理解课件上的UML图的各种元素以及元素的name,id,parent的含义,在理解这些含义的基础上就可以来设计代码了。

这次单元的作业中MyUmlInteraction的构造方法传入了UmlElement的集合,集合元素中包括类,接口,属性,方法,参数等类型,这些元素之间的联系是通过一些属性给出的(如方法的parent是其所在类或接口的id),虽然这次作业的时限很宽松,可采用暴力的做法,但是考虑到了降低bug的出现概率和以后功能的拓展,我没有选择暴力方法;我的设计是构造一些包装类,如MyClassMyInterfaceMyOperation等,例如我的MyClass类中,包含了一个UmlClass类型的属性,还包括了存放OperationInterface等类型元素的集合,来存储这个类所实现的接口和这个类的方法等表示元素之间关系的信息,这些信息在MyUmlInteraction的构造方法里初始化之后不会被再次改变。

此外,有了以上的包装类,可以将一些方法的底层逻辑放到包装类中,如下面的方法。

上图是MyUmlInteraction类中的方法,其中调用了下图中的方法,在这里解释一下nameToClass这个方法的含义:这个方法是通过name来找到对应的UmlClass,如果找不到或者有重复就抛出对应的异常,内部实现很简单,就不再多说了,主要是考虑到这个过程在很多方法中都要用到,所以写了一个小函数。

上图是中是包装类MyClass中的方法,包括了较为底层的逻辑。

这次作业中大部分的方法都是类似这样的方法完成的,内部的底层逻辑也很简单,唯一有些复杂的是getImplementInterfaceList方法,我选择了BFS算法来完成。

第二次作业

第二次作业依旧采取了上次作业类似的包装类的设计方法,将一些元素进行包装,大部分方法的实现也很简单,在方法getSubsequentStateCount中依旧采取了BFS算法,这里要注意一个小问题就是这个状态本身是不是他自己的后继状态。

第三次作业

第三次作业仍然借助了包装的类来封装底层逻辑,在包装类内部的方法判断是否违反某个有效性原则,顶层的类调用包装类中的方法来判断时候违反原则以及是否需要抛出异常。

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

在完成寒假的作业和第一单元的一些作业时,对面向对象的理解还比较浅显,当时我理解的面向对象编程主要是把一些属性和方法放在一起组成类,写代码的时候觉得只要把功能实现了,通过测试点就可以了;第一单元和寒假作业经常是一边想一边写的,也有一些现在回想起来不好的设计,也有过由于之前的设计扩展性不太好导致重构的情况。

第二单元开始我开始注意设计上的一些问题,比如各部分之间的耦合度要尽量降低,在编写代码之前最好有一个比较完善详细的设计,比如第一次作业中明确出了需要使用一个线程模拟电梯的运行,另一个线程获取输入,还要有一个类作为线程间共享容器,并且明确了各个类的较为详细的职责以及类与类之间的交互方式。我觉得这个单元我不仅了解了初步的多线程编程知识,也慢慢在编程过程中学会了如何实现类与类之间高内聚低耦合,提高可扩展性,降低bug出现的概率。

第三单元并没有进行太多架构设计,主要是了解了jml这种规格。第四单元的设计也不算太难。整体感觉后两个单元不像前两个单元那样需要花很多时间去思考如何进行架构设计,只需要按照要求一步一步完成功能就好了。

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

前两个单元的测试主要是尽全力构造完备的测试数据,尽量保证测试到每一种可能的情况;第三单元接触了JUnit测试,新的测试方法可以提高测试的效率,而且也类似于黑箱测试。

课程收获

首先这门课学习了很多与java、面向对象编程、规格、设计模式相关的知识,学习了很多相关的基础理论知识。

此外,作业与实验课上限时的代码训练大大提升了我的代码能力,调试bug的能力。

最后我觉得非常重要的一点收获是,在完成一项工程的时候,一定要把大部分时间用来做一个周密的设计,然后再开始写代码,设计过程中要注意各个部分之间耦合度尽量降低,每一部分内部内聚性提高;在周密设计的基础上写代码,绝对是既能减少bug的出现,还有利于以后的功能扩展,而且看似前期设计多花了很多时间,其实真正写代码的速度是很快的,整体来看反而会节省时间,提高效率。

三个具体改进建议

  • 适当放宽checkstyle的限制。我举得checkstyle的一些限制可能过于严格,比如继承是面向对象中很重要的一部分,但是本学期课程中的checkstyle只允许内部属性为private,甚至使用protected也不可以,这样子类就不能直接继承父类的属性,会带来继承中的一些不方便;还有import的时候不能使用*,我觉的有时如果需要对一个包多次import的话会让代码开头变得过于冗长。

  • 使后两个单元的作业与理论结合更紧密。个人感觉后两个单元的作业主要内容就是对照着规格与题目要求写代码,而后两个单元其实主要讲的是一些规格相关的内容,这两个单元的编程作业的内容觉得有些机械,与理论的关系不是很大。

  • 完善实验课前的介绍。这学期实验课之前的介绍大多是几分钟的一小段视频,比如介绍某种设计模式,有时实验课上会感到看完一段介绍视频之后准备仍然不太充分。

线上学习oo课程的体会

我觉的线上学习可能和线下学习区别不太大,毕竟代码的实验和作业只要有网络就能正常进行,不像很多学科需要在实验室操作。

OO课几乎每周一次的作业有时候会给人一种很强的压迫感,一周的作业课下测试没有通过的时候,想到ddl只剩一两天就会很紧张。

最后感谢老师和助教的辛勤付出!

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

在完成寒假的作业和第一单元的一些作业时,对面向对象的理解还比较浅显,当时我理解的面向对象编程主要是把一些属性和方法放在一起组成类,写代码的时候觉得只要把功能实现了,通过测试点就可以了;第一单元和寒假作业经常是一边想一边写的,也有一些现在回想起来不好的设计,也有过由于之前的设计扩展性不太好导致重构的情况。

第二单元开始我开始注意设计上的一些问题,比如各部分之间的耦合度要尽量降低,在编写代码之前最好有一个比较完善详细的设计,比如第一次作业中明确出了需要使用一个线程模拟电梯的运行,另一个线程获取输入,还要有一个类作为线程间共享容器,并且明确了各个类的较为详细的职责以及类与类之间的交互方式。我觉得这个单元我不仅了解了初步的多线程编程知识,也慢慢在编程过程中学会了如何实现类与类之间高内聚低耦合,提高可扩展性,降低bug出现的概率。

第三单元并没有进行太多架构设计,主要是了解了jml这种规格。第四单元的设计也不算太难。整体感觉后两个单元不像前两个单元那样需要花很多时间去思考如何进行架构设计,只需要按照要求一步一步完成功能就好了。

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

前两个单元的测试主要是尽全力构造完备的测试数据,尽量保证测试到每一种可能的情况;第三单元接触了JUnit测试,新的测试方法可以提高测试的效率,而且也类似于黑箱测试。

课程收获

首先这门课学习了很多与java、面向对象编程、规格、设计模式相关的知识,学习了很多相关的基础理论知识。

此外,作业与实验课上限时的代码训练大大提升了我的代码能力,调试bug的能力。

最后我觉得非常重要的一点收获是,在完成一项工程的时候,一定要把大部分时间用来做一个周密的设计,然后再开始写代码,设计过程中要注意各个部分之间耦合度尽量降低,每一部分内部内聚性提高;在周密设计的基础上写代码,绝对是既能减少bug的出现,还有利于以后的功能扩展,而且看似前期设计多花了很多时间,其实真正写代码的速度是很快的,整体来看反而会节省时间,提高效率。

三个具体改进建议

  • 适当放宽checkstyle的限制。我举得checkstyle的一些限制可能过于严格,比如继承是面向对象中很重要的一部分,但是本学期课程中的checkstyle只允许内部属性为private,甚至使用protected也不可以,这样子类就不能直接继承父类的属性,会带来继承中的一些不方便;还有import的时候不能使用*,我觉的有时如果需要对一个包多次import的话会让代码开头变得过于冗长。

  • 使后两个单元的作业与理论结合更紧密。个人感觉后两个单元的作业主要内容就是对照着规格与题目要求写代码,而后两个单元其实主要讲的是一些规格相关的内容,这两个单元的编程作业的内容觉得有些机械,与理论的关系不是很大。

  • 完善实验课前的介绍。这学期实验课之前的介绍大多是几分钟的一小段视频,比如介绍某种设计模式,有时实验课上会感到看完一段介绍视频之后准备仍然不太充分。

线上学习oo课程的体会

我觉的线上学习可能和线下学习区别不太大,毕竟代码的实验和作业只要有网络就能正常进行,不像很多学科需要在实验室操作。

OO课几乎每周一次的作业有时候会给人一种很强的压迫感,一周的作业课下测试没有通过的时候,想到ddl只剩一两天就会很紧张。

最后感谢老师和助教的辛勤付出!

posted @ 2020-06-19 15:54  °不凉少年  阅读(201)  评论(0编辑  收藏  举报