面向对象课程总结

面向对象课程总结

1. 第四单元作业的架构设计

1.1 UML元素的结构

本单元作业需要实现一个UML解析器,支持对UML类图、UML顺序图和UML状态图的解析,并实现有效性检查。

UML是按照树型结构来组织的,因此我们的解析器也按照树形结构来存储UML的信息。具体而言,三种UML图的树形架构如下:

在类图中,类/接口是基本的组成单元。每一个类或者接口有五个属性:属性,操作,关联的类/接口,继承的类/接口,实现的接口。

状态图中,MyState是基本的组成单位,每一个状态里面记录了它可到达的状态及其对应的转换和事件。

顺序图中,生命线和消息是并联的组成单位,统一储存在MyInteraction中。

1.2 功能实现

因为本次作业的查询大多要通过名字来完成,因此各种UML元素都使用Hashmap来存储,可以达到快速匹配的目的。

值得一提的是,为了实现检查循环继承,多重继承的功能,这一些方法在调用的时候使用了了in-out参数。调用者会为其传递一个集合,被调用者往这个集合里面加入它所继承的元素,而不是通过返回值来传递。

public boolean checkRepeatExtend(HashSet<MyInterface> extendInterfaces) {
        for (MyInterface myInterface : superInterfaces) {
            if (extendInterfaces.contains(myInterface)) {
                return true;
            } else {
                extendInterfaces.add(myInterface);
                boolean temp = myInterface.checkRepeatExtend(extendInterfaces);
                if (temp == true) {
                    return true;
                }
            }
        }
        return false;
    }

这个理念反映了面向对象设计中“never pass by value”思想。

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

2.1 第一单元--语法、封装与多态

对我而言,第一单元的收获有两个,其一是掌握了java语言的编写,其二是初步建立了面向对象的思想。第一次作业的架构很简单,上机时候也给了一个相似的模板,直接往上套就完事了。第二次作业的难度则有一个质的提升,需要考虑括号带来的运算顺序问题。我认为这次作业的难点并不在于面向对象思想本身,反而对编程能力的要求更高一点。当然了,面向对象思想可以辅助我们设计出更好的结构,以便于进一步扩展。

我最终的设计架构是一棵表达式树,可以对每个结点进行递归的求导。完成了第一单元的作业后,我对于面向对象方法的理解主要体现在封装与多态上。运算符或者数字都可以统一作为一个结点,对他们进行求导时候不必了解它内部是如何完成的,方便了调用者的使用。学习数据结构过程中大量使用的if-else类型判断,终于可以节省掉了。

2.2 第二单元--多线程

第二单元的任务是电梯调度,涉及到多线程并发的处理。经历了第一单元从面向过程到面向对象的转变,我利用工厂模式,继承多态等思想,在三次作业中很好地实现了迭代开发,后两次作业都仅需要稍加改动,进行一些功能的扩充,就可以高效率地完成任务。

我在设计时候开启了三类线程:输入线程,调度器线程和电梯线程。输入线程将请求送给调度器线程,调度器线程再将请求分发给各个电梯。这是一个多级的生产者-消费者模型。

第二单元给我带来最大的收益是生产者-消费者模式的熟练掌握。我一开始并不是很了解多线程的原则,临界区设定的特别大,导致scan算法退化成了fcfs算法。后来直到第三次作业真正搞明白了生产者-消费者模式的原理,很好的完成了任务。

2.3 第三单元--JML

第三单元几乎不需要自己去架构,官方包已经把架构给设好了,填充方法就可以了。

第三单元的收获是对JML的理解。与自然语言相比,JML语言可以更明确的表达我们的意图,这在软件开发过程中是非常有必要的。

2.4 第四单元--UML

第四单元的架构如上文所示,设计了一个树型的结构。与Jml不同,这次没有给出具体的描述,因此首先需要的是理解Uml三种图的展示形式,从而自主的对各个元素的内容提取,在实现对应方法的时候使用。这可以说是一次综合性的架构测试,是对面向对象设计思想的一个最终检验。

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

OO作业的测试无非是手动构造数据测试与自动生成随机数据两种模式。我第一单元使用了随机模式,后三单元都是手动构造,这里没有什么好深入分析的,和面向过程语言的测试没有什么不同。让我有一个演进式理解的是Junit这个工具的使用。

第三四单元,课程组推荐了我们使用JUnit进行单元测试。我本来以为它可以智能地 根据JML来自动测试,没想到需要自己构造测试样例并设置答案。我当时很不理解这种测试方法,感觉纯粹是多此一举。后来查阅资料才明白Junit的意义。在一些大型的程序,例如淘宝中,可能有上万个方法,运行的成本要远高于单元测试的成本。并且在现代的软件开发中,开发和测试往往需要并行工作,即如下图所示:

JUnit其实在某种程度上体现了封装的思想。我们自己写程序调试时候可以随意改动代码,加一点输出来debug。但是实际软件开发中,测试人员是没有这个权限的。他们只能模块化工作,最终进行一个整合。

当然,对于我们自己写作业而言,JUnit在这几单元作业中似乎确实没什么用。。。

4. 课程收获

java是我目前收获最大的一门核心专业课了(虽然可能分数是最低的qwq)。主要收获有以下几个:

  • java语法与容器的使用
  • 正则表达式、多线程、JML、UML的使用
  • 面向对象思想:封装、继承、重写、多态、重载。。。。
  • 代码风格的改进
  • 设计模式:工厂模式,生产者-消费者模式等等
  • 被hack爆了之后的平常心

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

  • 实验课最好能在课后公布成绩。填空的还好,编程这块真的挺虚的,不知道自己写的对不对。
  • 第四单元的描述最好能够清楚详细一点,一开始的版本有很多歧义。
  • 强测时候一个bug可能被hack多次,希望在bug修复阶段能够进行合并。因为一个bug被干到20多,挺搞心态的。
posted @ 2021-06-26 20:09  苍穹一粟  阅读(163)  评论(0编辑  收藏  举报