BUAA OO Unit4总结

BUAA OO Unit4总结

前言

第三单元学习的主题是了解UML 图的相关知识,了解正向建模和与开发并将其付诸实践,以此提升程序架构的设计和抽象能力,以及UML建模能力。
整体而言,这个单元的难度并不高,尤其是去掉了互测和性能分,压力肉眼可见的降低,同时提升的UML建模能力却让我感觉受益匪浅,可以说是性价比极高()。

正向建模与开发

正向建模与开发是指从需求到实现的一种软件开发方法论。在正向建模与开发中,首先明确系统的需求,然后根据需求进行设计,接着进行编码,最后对软件进行测试和维护。这是一种从上而下的开发方法,也是一种迭代的开发过程。

在这一单元中,我完成三次作业的顺序都是首先阅读题目要求和提供的官方包的实现并据此在草稿纸上画出UML草图,在具体编程过程和结束后再用软件进行UML建模。在提前画过类图后,编程过程的思路明显会更加清晰,当然也有可能是因为本单元的实现逻辑相对简单。在依据UML开发的过程基本上是在原有设计的基础上拆分一些方法出来,使代码的模块性更强。

本单元作业的架构设计

这里以第三次作业类图为例

请添加图片描述

  • 整体上由Main类处理输入,并依据指令不同调用不同类(指令发起类)的相关方法。Main类中的addPerson()方法可以做到同时维护persons数组并获取当前指令person.
    private static Person addPerson(ArrayList<Person> persons, LibraryRequest request) {
        Person person = null;
        for (Person person1 : persons) {
            if (person1.getId().equals(request.getStudentId())) {
                person = person1;
                break;
            }
        }
        if (person == null) {
            person = new Person(request.getStudentId());
            persons.add(person);
        }
        return person;
    } //添加person,获取对应person
  • Person类用来实例化学生,这里实现了还书、续借、逾期、查询信誉分操作。
  • Yuyue类用来实例化预约处,实现了预约,取书以及预约处的整理流程。
  • Piaoliu类用来实例化漂流处,实现了捐献和从此处发出的借书操作。
  • Shujia类用来实例化书架,实现了初始化,书籍查询和向书架发出的借书操作。
  • Jianhuan类用来实例化借还处,仅实现了借还处的整理流程
  • Book类用来实例化图书,储存了书籍ID,预约和被借书的到期时间,允许续借的开始时间,被借阅同学ID,漂流书借阅次数。

这里主要讲一下整理流程,首先,我将整理流程全部放在了开馆前,因此需要一个确定的整理顺序,依据要求,最终实现的顺序包括四个流程:

  • 首先对现有每个同学检查是否存在逾期的书;
  • 检查预约处的书是否有逾期的,并还到书架;
  • 之后,进行借还处的整理流程,判断书籍还到书架或漂流处;
  • 最后响应预约处储存的已接受的预约。
      if (command instanceof LibraryOpenCmd) { //依次调用借还处和预约处的整理方法
           for (Person it1 : persons) {
               it1.zhengLi(command);
           }
           ArrayList<LibraryMoveInfo> info1 = yuyue.zhengLi(shujia,command,persons);
           info1.addAll(jianhuan.zhengLi(shujia,piaoliu));
           info1.addAll(yuyue.zhengLi1(shujia,command));
           PRINTER.move(command.getDate(),info1);
      }

架构设计思维的演进

  1. 第一单元虽然在之前经历了先导课的学习,但因为过了一个寒假,几乎又重学了一遍基础语法知识(不过确实快了不少),也是初步开始接受多态、分装、继承的思想,开始将单个功能分装,模块化,也使自己的编程风格愈发完善,这一单元主要采用了递归下降的层次化设计,递归解析表达式,正是这一单元的学习奠定了整个课程编程面向对象的基调。
  2. 第二单元多线程的引入是一个难点,尤其是之前几乎没有任何基础,因此这一单元是我花费精力最多的一个单元。但也同样收获巨大,第一次学会了构建一个多个线程同时运行的程序,同时需要考虑线程安全、避免死锁、轮询的问题。
  3. 第三单元学习的主题是JML规格化设计,强化根据 JML 给出的规格编写 Java 代码的能力,这一单元需要自己架构设计的地方较少,主要是对于算法的选择,并符合JML所给的接口要求。
  4. 第四单元,也就是本单元,是对过去所学的一个汇总,这个单元最大的特征就是相关限制和要求极少,从UML建模,到是否使用多线程,具体的代码实现都有我们自己的想法决定。同时UML导向的设计对架构设计的要求更高,需要综合考虑所给的接口、要求,以及实现的效率。这一单元的学习让我真正感受到了宏观设计对于实际编程的指导性和积极作用,在依据UML编程后,后续几乎没有测出任何bug,强测也是非常顺利地全部通过。我也将会在今后地事件中广泛应用正向建模与开发的思想。

测试思维的演进

总的来说,四个单元我在测试方面下的功夫都不够多,主要是并没有搭建自己的评测机,这是一个很大的遗憾,一方面是效率问题,时间确实不足,另一方面还是主观能动性不够,没有敢于迈出第一步。但是在对于自己代码的测试上,仍然感受到了课程为我带来的进步:

  • 第一单元和第二单元在白盒测试之余会根据题目所给的边界限制构造一些数据,例如表达式中的指数函数多次迭带,取得了一定的成效,在这一过程中也与其他同学交流了可能没有考虑到的边界情况。
  • 第三单元主要的进步是开始采用编写junit的方式进行测试,由于在向导课已经有过相关经历,设计过程还算顺利,主要需要注意的点是如何覆盖多种情况:一方面,我结合自己的想法和JML的条件构造了一部分边界数据,另一方面就是大规模的随机数据生成,反映在第三次作业中就是对于图构造的随机性。
  • 第四单元由于本身逻辑和代码量都比较简单,再加上正向建模使我对于整个题目有了较为充足的把握,因此主要采用了白盒测试的方式,具体来说,在每个方法前用注释描述整体逻辑,同时在关键语句处再加注释并加以再次验证。最终三次强测均顺利通过,并没有出现问题。

收获与体会

第一次听到OO课程还是在大一分流前,那时听到的评价往往是负面的。但经过这半年的学习,我却觉得OO课程的整体感受是几门核心专业课中最好的,我能明确地感受到自己在某一方面的提高,并且莫名感觉很实用(可能是因为这门课更注重方法论?),而且没有理论期末考试确实给人的感受良好(乐),因为上面的两个演进已经写了不少收获,这里主要提提感受:
在这短短几个月的学习中,有bug难以de出的彻夜难眠,也有因一个小小的错误而无法通过强测的痛苦,有与同互测房同学互相激情hack的别样体验,但同样也有收获的喜悦,写OO的过程给了我一个能够专注的朝着一个目标前进而不被外物所扰的体验,只是可惜偶尔的debug过程会破坏这种美好的体验,但世上本就没有完美的事,这样的不完美反而可以让我们感受到生命的张力与韧性。
最后,感谢所有助教和老师的付出,为我们提供了优质的课程、指导书与学习平台。这是OO课程的结束,但绝不是我面向对象编程之旅的结束,感谢这段美好而又稍有遗憾的时光,就如同我过去所逝去的与未得的一切。

  • 8
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值