一 作业思路与架构分析
这一单元总共两次作业,都是借助官方提供的借口来满足需求。在第一次作业编程的时候我有一段时间也在纠结我建立的几个我的MyClass、MyAttribute等类应该是继承官方提供的UmlClass、UmlAttribute类还是只是建立几个单独的类,相关的方法调用官方接口提供的类。后来目光短浅~的我考虑到其实或许有用的只是那几个方法,因此就没有写继承。这就导致在第二次作业中架构出现了一些可观的问题。
(一)第一次作业分析
第一次作业是在类图的基础上进行分析与统计的,每个UML类都继承自UmlElement类。
因为考虑到每个UmlAttribute都应该有其对应的类,每个UmlParemeter都应有对应的操作,并且我们的操作主要是从类或者类中的操作开始的,所以我建立了MyClass 、MyInterface、MyOperation类来记录对应的信息,并存储属于它自己的元素。(正如前面所说,如果自己写的类是由UmlClass等类继承来的,那么后面的处理会省很多力气)
这次作业我处理的总体架构是由MyUmlInteraction类关联我新建的MyClass等类,在实例化的过程中,检测element对应的type,并添加到相应的HashMap中。而在进行不同的操作时分析该操作需要用到类图的哪些关系,再进行对应的建立该关系的操作。
类图如下:
(二)第二次作业分析
相比于第一次,在图的方面增加了时序图与状态图的查找分析。或许因为进了烤漆嘛,感觉这次作业助教仁义了好多~一开始我猜想或许加入时序图状态图之后要进行合法性判断,但是后来看到需求时发现在这两个图方面只是增加了简单的数个数的问题。在这种情况下我的架构设计与第一次的作业相同,只是新建MyUmlState与MyUmlCollaboration分别存储状态图与时序图。
值得一提的是这次的作业增加了对类图的模型有效性检查,这也是我在第二次作业中花费时间最长的一部分了。
在循环继承的判断中我用的是DFS,一边递归一边记录下来路径。当检测到下一个节点N与路径中的某个节点P一样时,便把从P到N的节点路径记录到一个HashSet中,这样同时保证记录的节点不会相同。不过这样做是有一个比较明显的问题的,假如这次作业的强侧的数据点的深度非常大的话,那么毫无疑问这种做法会爆栈。在那种情况下就应该考虑其他可行的算法了。
在重复继承的判断中,我先对所有的接口进行一个重复性判断,把重复继承的接口标记。在检测是否有重复继承的类的时候,因为类是单继承,所以这里只需要考虑类对接口的实现关系。我所想到的一共有两种情况,即:类重复实现某一个接口;类实现了重复继承的接口。
类图如下:
二 四个单元中的架构设计与OO方法的理解
第一单元是可怕的求导的单元,初学Java时由于根本不了解什么是面向对象,什么是架构,所以三次作业中,次次重构,次次爽翻~在编写程序之前也从网上看过几份代码,但都是一个Class的,因此我当时认为除了一些愈发不一样之外,其他的按照C语言写应该能正常运行。写在main之外的方法(函数)不能运行的话加个static就好了。。只针对某个特定的需求编码,这样就导致如果需求稍微一改变,那么自己的代码或许会翻天覆地的变化。
第二单元开始初步学会分Class,每个Class中的实例化以及this是干什么用的。但是毕竟还是理解不到位,认为只要是与这个类有关的东西都应该在这个类中,甚至某些本应该是属于控制器的操作。因为第二单元是电梯作业,而作业在进行一次次的拓展的时候也只是进行了一部电梯像多部电梯这样的变化,而原来写好的电梯类基本不用变化,基本只是加个id来区分不同的电梯就好了。
在第三单元JML规格(数据结构还债课)中,我们逐步实现了对一个地铁线路图的分析。在这一单元中我才真正认识到了架构的重要性。尤其是第二次作业像第三次作业的过渡中,因为涉及到多个图的构建,我充分体验了接下来要写的代码之前似乎已经写过类似的但由于架构没设计好不得不再去写一遍的感受。假如我在第二次作业的编写中就采用指导书安利的构建一个Map类的话,那么第三次作业我就可以直接用这个类而不是在第二次作业辛苦的构建完一个特定的Map的基础上再去写一个MyMap类了。
最后一单元架构设计的思路相对来说清楚一些,在建完对应的图之后,便可以迅速的定位到要查询的类及操作。不足的地方就是因为自己写的像MyClass这样的类没有继承对应的Uml类而导致了一些不必要的方法的加入。
三 测试的理解与改进
在刚开始学习Java的时候,对自己和同一个room内的同学的测试都是采用自己构造数据。考虑到老师上课讲的编写的程序理论上应该能够应付各种输入,因此我在测试时主要是针对的边界条件的测试。
显而易见的这种测试虽然针对性强一些,但是测试的覆盖面很小,测试就不全面。后来了解到有的同学可以自己写一个自拍器甚至是评测机,我才开始意识到原来测试可以这样进行。在进行第三单元的测试的时候,我也试着编写了一个随机数据的生成器,虽然功能很不完善,只是限于随机的生成数据,但是也还是学到了一丢丢其他的知识的~~
四 课程收获
首先,我通过这门课初步了解了Java编程的一些语言,并能进行一系列的编程来应对不同的需求。甚至Java有时可以用于生活中,当想起某个问题的时候,或许可以通过Java编程来实现?(毕竟相比于C,Java自己实现了许多经常用的函数)
其次,我开始了解这门课程一直努力向我们传输的面向对象的思想。现在感觉一个Class应该是一个整体,就类似电路板上的各个不同的元件,当给它所需要的输入(实例化)时,就能得到对应的输出。而完成一项需求的时候可以将整个需求划分为几个部分,一个Class代表一个部分,完成一个或几个功能。这样多个Class凑成一个整体,来实现对应的需求。
在这门课中我认为最重要的是我的学习能力有了比较大的提高。因为这门课几乎不会去教学生应该怎样去编写Java,从第一单元就开始要求同学们实现难度比较高的需求。而相关的Java语法、Java容器等部分都是靠学生自己去学习与探索。在自主学习中编程,这能极大的提高我们的学习能力~
五 课程改进建议
-
感觉实验课体验不是很好,上午上完课下午就要接着去用,虽然实验课的目的是一边学习一边应用,但是那样的话时间还是有些紧。
-
第一单元的作业对于初学者来说有点大,尤其是第三次作业,要在设计实现的方法的同时自己去探索自己的想法用Java语言能不能实现。
-
最后几次作业可能是因为时间太紧迫了,指导书会有好几个版本。如果可以稍稍稳定一下就好了
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。