oo第四次总结

一.总结本单元两次作业的架构设计  

1>第一次作业

这次的作业是进行类图的解析,作业中已经将输入输出封装好了,我们所要做的就是设计数据结构,对element进行保存,并且支持相关查询。其实感觉这一单元的作业和第三单元的作业很类似。当然不同之在于说,第三单元训练的是对规格的理解,而这一单元借助上一单元的形式,训练我们理解UML类图。

 

这是一张解析UML类图的程序的UML类图 ^-^

UML类图文件是具有层次格式的,所以说这里我也将起进行封装,类的信息作为一个类,接口的信息作为一个类,方法的信息作为一个类,对于关系和继承则放入MyUmlInteraction中,利用HashMap进行储存,保证其访问效率。

由于类图中可能出现类同名或者方法同名等情况,再加之需要通过名字来索引类或者方法,这里采用二重的HashMap的数据结构。先利用name索引id,id可能有多个,再利用id索引其的信息。 

2>第二次作业

第二次作业在前一次作业的基础上,增加了对顺序图和状态图的解析,并且加入了规则的检测,总的来说还是前面的模式,目的在于让我们更深入的理解UML的各种图。

 

关于状态图和顺序图的解析没有太多的特别,几天查询指令也相对简单,唯一需要注意的是寻找状态图的后续状态,这里涉及的图的遍历,稍微注意一点起始状态即可。

对于三种图的各种操作和数据结构分别进行封装,各种保证自己的层次结构。

特别的说明一下检查规则,检查规则第二条——循环继承的检验。这里有一个比较好的思路就是分别寻找类中和接口中的强连通分量,需要注意自循环的情况。还有一种更好实现的方法——就是检验从一点出发,时候还能回到该点,如果能则该点存在于一个环种,该方法简单但是复杂度比较高,这次没有压力测试,所以采用这种方法还是比较可取的。

检查规则第三条——重复继承的检验。重复继承涉及到接口的重复继承,类的重复继承已经说类实现接口的重复。其实还是比较复杂,当然这里有一条比较简单的规则。将类、接口、和继承关系放到同一张图里面,从一个点出发进行深搜或者广搜索,如果搜到重复的点,则表明存在重复的情况。

二.总结自己在四个单元架构设计及OO方法理解的演进  

1>第一单元 表达式求导

这一单元是oo的开始,作业是表达式的求导。首先理解到的思想就是封装了,表达式下面就是项,项下面是因子,这样的层次化设计,再加上对每个数据单元和操作单元的封装,让整个作业的实现条理更加清晰,实现更加方便。再来,理解到不可变对象这个概念。就是对象生成之后其内容就不会改变,要等到新的内容需要重新生成新的对象,这样的设计可以防止你再不知不觉中改变了对象内容,可以减少很多不必要的错误,当然这样回浪费更多的空间和时间。

还有一点就是接口的使用,这样单元的一个关键词是“求导”,不管是对于表达式、项、还是因子,求导对于他们来说都是一个行为,所以说这里应用接口比较合适,这样讲共有行为与类分离,保证了代码的规范性,并且利用理解和实现。

2>第二单元 多线程的电梯

这单元训练主要内容是多线程以及线程安全。实现多线程程序并不难,难的是如何使得线程之间的合作竞争更加合理、如何在保证正确性的情况下提升效率。经过这一轮的训练,也掌握到一些基础的方法,比如说减小锁的粒度、利用wait、notify来减少无谓的占用时间片,这些方法在提升效率上都有相当大的作业。当然保证正确性,才是重中之重。

此外学到一点是,程序可扩展性的设计,由于说一开始就知道最后的肯定是要实习多部电梯的配合,所以说在前面的实习中就注意了这一点,这使得在后面的扩展中更加方便,代码框架更加合理,当然在实际工程中是很难预料到将来扩展的反向,这一点需要大量的实际经验,但是在写代码的时候注意这一点还是非常有必要的,

3>第三单元 JML建模语言

这一单元主要就是对规格进行理解,然后实现自己的数据结构。首先来说,很重要的一点就是理解规格,这里使用的JML建模语言对规格进行描述,这的方法拜托了自然语言的不确定性和二义性,但是理解JML语言本身还是比较有难度的,其中一个特定的规则需要仔细阅读规格才能找到答案。再者,这一单元很重要的一点的训练了我们设计合理数据结构的能力。最后,想谈谈的是这个单元的流程给我的感受。第一作业是设计path,第二次作业在此基础上形成了graph的概念,最后一次作业在graph基础联系现实,设计出地铁网络图。每一步都是在前一步的基础上进行扩展,这样设计简单并且合理,而最终产物地图网络图就是一种很实际的东西。反过来思考,对于一个现实中问题,我们需要如何去抽象实现呢,哈哈,这还够得我们学。

4>第四单元 UML

这个单元和第三单元在实现上有很多相似之处,都是设计合理的数结构,然后进行各种查询操作。不同的是这单元是利用以上实现方法为载体,来让我们更加深刻的理解UML。UML是为设计而生的,它站在一个更高的高度来设计程序,并非实现程序,在良好的UML设计基础上,实现代码仅是极其简单机械化的一步。所以学习和理解UML是想到有必要的,当然,最中要的是学会如何去设计,我想这才是oo的最高峰吧。

三.总结自己在四个单元中测试理解与实践的演进

1>第一单元

初次接触oo,测试也比较原始。主要是手动编写特殊测试样例和利用python脚本生成大量的普通样例,并且使用matlab进行正确性的检验。

2>第二单元

这一个单元是多线程程序,测试方法主要是利用python脚本,模拟输入进程定时输入指令。对于指令的生成,主要是依靠人工编写,这也导致指令覆盖范围不够完整。对于正确性的检验,主要就是对于输出检验,检验其的规则要求。

3>第三单元        

在这个单元里,开始尝试使用Junit进行单元测试,其使用还是很方便的。当然,测试样例还是得自己写,不过有一点特别明显的优点是其可以对每一个类都进行测试,这样可以快速发现错误并定位。除了结果的测试外,还需要注意的是性能的测试,这个单元的时间要求相对严格,所以说过低的性能也是程序错误的一种。测试性能就需要压力测试,自动化生成足够多的测试样例,并统计时间,验证程序效率。

4>第四单元

第四单元在测试上,没有什么特殊之处,编写足够的测试样例,覆盖所以特殊情况。当然,这些并不容易,测试水深,还得努力。

四.总结自己的课程收获

首先,这门课叫做面向对象设计与构造,所以说在课程中的首要收获便是对面向对象的思想有了深入的了解。在没有这个概念这前,写代码的风格就是类C的风格,所以函数写在一堆,所有数据结构写在一堆。后来初次接触这个概率后,习惯利用文件来区分不同的数据结构和函数。在真正系统的接触后,利用类进行封装,对于有共同特征的事务设计父类子类,对于有相同行为的事务设计接口等等,这些面向对象的思想和方法让我的程序更具有层次性,深入理解相关思想后,会极大加快开发效率,这一点对我帮助特别大。

其次,十五周的代码训练,让我的代码能力得到了一定的提升。几乎每周一练,长期保持写代码的手感,过程虽然有些烦躁,但是坚持下来,对于代码能力真的有很大的提升,更重要的是,不会畏惧那些有挑战的代码了。

还有就是对于java这门语言。这门课以java为载体,java是现在比较主流的语言,虽然说这门课不是为了讲这门语言,但是通过十几周的训练,对于这门语言的特征、行为等都有大概的了解。在这门课中,学会较好的使用这门语言也是相当大的一种收获。

当然,这门课学到的东西远远不止这一些,还有包括说课程组重点强调的数据规格,还要每一作业要求的代码规范,以及多线程编程、线程安全、单元测试等。

面向对象设计与构造是这门课的主线任务,学到它、学好它是最要的收获,而每一个副本也都相当精彩。

5.立足于自己的体会给课程提三个具体改进建议

1>可以每次作业前提前告知一些之后要完成的作业,这样可以提前准备一下,更好的完成后面的作业。

2>课上的ppt,课下自己看大多情况看不懂,无法自己理解其中的逻辑。希望老师在这方面加以引导。

3>第三单元的JML和第四单元的UML,两次作业有很多共通之处,建议合并成一次作业,利用JML描述UML的解析函数。

 

posted on 2019-06-23 16:20  wudilailai  阅读(110)  评论(0编辑  收藏  举报