[BUAA-OO]第四单元总结

前言

不知不觉来到OO课程的尾声啦,写这篇博客的时候正好是6.8号高考的第二天,竟让我想起来那年考完最后一科生物合上笔盖的那一瞬间。总之不管结果如何,我也算走过来了,在过程中学到了很多也收获到了很多。

正向建模与开发

在面向对象编程中,正向建模与开发是指从需求分析到系统实现的一种开发方法。它强调从问题域的角度出发,通过建立模型来描述系统的结构、行为和关系,并将这些模型转化为可执行的代码。

在本单元作业中,这个模型就是UML图。

正向建模与开发在工程领域有十分重要的作用:

  • **有助于团队协作开发。**UML提供了一种标准化的图形表示方法,使得系统设计和架构可以更容易被团队成员和利益相关者理解和沟通。它提供了一种通用的语言,帮助人们更好地理解和讨论系统的不同方面。这大大提高了团队工作的效率。虽然在本课程的个人任务中并没有体会到这一点,或许可以成为以后课程改革的方向?
  • **指导代码开发。**UML建模提供了对代码开发的指导,帮助开发人员更好地理解系统的结构和组织,并根据类图、状态图、顺序图等UML图表编写相应的代码。这有助于提高开发人员的效率和代码质量。这一点在本单元的任务中得到了充分体现。由于图书管理系统的庞大规模,如果直接上手进行代码编写,很可能会乱了手脚,制造出意想不到的bug,而UML图则给我们提供了一个非常直观的整体的架构说明,让我们可以在编写代码的时候参照UML图进行编写,大方向定了细节实现起来也就不难了。
  • **便于bug修复。**通过使用UML进行正向建模,可以在实际编码之前发现和解决潜在的设计问题。这可以降低开发过程中的风险,并减少后期修改的成本和工作量。我们可以对比修改前后的UML图发现新增或修改了哪些方法,这些方法可能会影响怎样的状态转移,与其他类有怎样的关联关系,从中我们可以更轻松的定位到bug产生的地方,进而修复。

总而言之,在面向对象编程中,正向建模与开发的思想可以很好的帮助编程者进行团队协作,高效且高质量地完成大型工程的开发。

本单元的类图、状态图、顺序图如下:
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

本单元的设计与架构

hw13

本次作业要求初步建立一个图书管理系统的框架,后续作业都在这个基础上进行小规模的功能扩充,因此第一次作业的架构至关重要,也是本单元三次作业中耗时最长的一次作业。

图书管理员类

本次作业的图书可能存在于四个位置,分别是读者处、书架处、借还处、预约处,这一点在状态图中有很直观的体现(UML图的好处这就体现出来了吧)。

最朴素的方法是在Library类中为这四个地方分别建立一个容器进行存储,并编写对应的方法进行管理,但这样会造成各个地方的数据和数据管理不够独立和明确,同时在后续功能增多的情况下很可能造成Library类的冗长。所以我采取为每个地方建立一个管理员类,负责对数据的存储和管理,这点也很容易由现实中的图书管理员而联想到。

容器选择

这次图书管理员处的存储图书的容器选择也是一个值得注意的点。

  • 书架处shelf:有可能存储多种id的图书,并且每个图书可能有多个副本,因此书架处的图书是二元的元组,很容易想到用HashMap来进行管理,也能很大程度上加快查询的速度(但也需要注意边遍历边删除的方式)。
  • 借还处broBooks:同书架一样的性质。
  • 预约处aoBooks:根据要求,在存储图书的时候需要存储相应预约的人的id以及预约时间等其他数据,这明显不是简单的二元组了。但我们也可以使之成为类二元组,为了实现这一点,我编写了Book类和RegisterBook类,分别代表位于预约处的图书预约成功还未送达的图书,前者需要有id,readerId,inDay(到达预约处日期)等成员变量,后者只需要有id,readerId的信息即可。因此我用HashMap<LibraryBookId,ArrayList<Book>>HashMap<LibraryBookId,ArrayList<RegisterBook>>作为容器,很好的存储了所有需要的信息。
  • 读者处haveBooks:读者处的书由于本次作业的限制,一个人不能拥有两本以上的同id的书,因此只需要用ArrayList存储图书的id即可,以后若有其他信息需要存储只需要用HashMapLibraryBookId和相关信息进行绑定即可,可扩展性较强。
消息传递

当我们接收到一个指令时,我们该通过怎样的流程一步步传递给底层进行数据管理呢?顺序图就能很直观地反应这一流程(所以UML是非常好的!)。

拿图中所示的图书预约来说,首先Main接收到这个指令,将其发送给Library进行处理,这是因为Main只负责输入输出的功能,这也符合高内聚低耦合的思想。接着Library接收相应指令进一步下发给OrderLibrarian进行处理,这里Library更像是一个指挥官(图书馆的boss),OrderLibrarian负责新增预约请求,在闭馆后由Library读取预约请求进行图书的整理和转运,进而通知读者来取书,完成预约和拿取的过程。

hw14

本次作业新增图书漂流处、续借以及图书借阅期限的要求。

对于图书漂流处我们只需要新增一个管理图书漂流处的管理员类,并为其添加相应的容器和操作即可。对于续借和借阅期限的需求,我们则需要给Reader类加上有关于借阅时间的容器,并对其维护,这里我采取的是存储图书到达读者手上的时间(不太准确),当续借成功时相关的inDay进行相应的增加延长,作为我们判断是否延期的依据。

hw15

本次作业新增读者信用积分的概念。这次作业的功能实现十分简单,只需要在读者类新增一个成员变量credit,并在读者完成相应操作时增加或减少credit即可,并在进行一些操作时判断credit是否符合要求,若不符合则拒绝此次操作即可。本次作业十分善良,完成时间不到两个小时。

架构思维的演进

第一单元

第一单元主题是“表达式展开”,主要是想让我们初步体会面向对象的思想,体会层次化编程的好处。面向对象即一切皆是对象,从本单元作业就能很好的体现,从宏观来看多项式是对象,通过一个个单项式连接,单项式也是对象,单项式由一个个因子组成,因子也是对象,因子有很多不同的种类,这些不同种类的因子都是对象。因为刚开始接触oo,对面向对象的思维并不熟悉和掌握,因此我的第一次作业的耦合度是无法想象的,因此在看到第二次作业的要求的时候我就傻了眼,在挣扎一天一夜后不得已选择重构,这也是四个单元里我唯一进行重构的一次作业,但这也让我对层次化编程的重要性有了更深的认识——通过从问题中抽象出一系列对象,我们可以建立一个层次化、模块化的结构,从而降低了问题的复杂度。hw2重构之后,由于良好的架构,第三次作业也完成的十分迅速和得心应手。

第二单元

第二单元的主题是”电梯调度“,私以为是四个单元中难度的巅峰,要求我们掌握多线程的创建和维护,并警惕线程安全问题。在多线程的情境下,对象之间的交互时机、交互结果都具有了不确定性,带来了很大的安全隐患,并且多线程还会存在死锁、轮询等额外的线程不安全问题,而由于结果的不可复现性,对bug的定位和修复也变得格外困难,这都对我们编写多线程程序提出了更高的要求。因此,我们需要结合实际场景对线程安全问题进行分析和解决——哪些对象之间的交互存在着安全隐患?如何合理的加锁既能防止死锁,又能保证效率? 只有解决了线程安全问题,才能保证对象之间的交互"乱中有序"、符合预期。

第三单元

第三单元的主题是”JML规格“,要求我们能够理解JML语言,基于规格进行代码实现,或是编写相应的规格。虽然JML是一个十分冷门的语言,初看并不理解这单元的用处。但随着完成本单元三次作业之后,我能感受到课程组是想让我们感受到**”契约式编程“的魅力——高可靠性、高复用性、便于测试。另外本单元也让我明白契约仅仅是对程序的功能做出了限制,在不违背契约的前提下,还需要重点关注如何高效的实现契约,在本单元中我学习并采用了并查集、堆优化的dijkstra算法、变量维护等优化方法,学习到了很多巧妙的算法**知识。

第四单元

第四单元的主题是”UML建模语言“,要求我们掌握正向建模与设计的思想,能够使用UML图辅助我们进行程序设计 ,这个单元使我们进一步感受到UML语言的"面向对象"本质,进一步加深对面向对象思想的理解。

测试思维演进

第一单元

手捏特殊数据进行功能性和形式化测试,但缺点是覆盖不全,一些特殊数据如exp((-x^2))这样的数据没测出来bug,第二次作业因此错了一个点。

第二单元

利用评测机捏随机数据进行大量测试,但由于多线程的特性,即使通过部分测试,多线程仍可能存在不安全的问题,在互测中就得到充分体现(第二单元挨了最多刀)。此外就是捏边界数据进行压力测试,这也是第二单元我互测的主要思想。

第三单元

编写Junit进行单元测试,在写完一个功能的方法后就对其进行测试,构造覆盖率尽可能大的数据,减少无效数据,例如在hw9中我构造了:没人、有人没关系、有人有关系无三角关系、全关系、随机关系等数据,尽可能做到所有情况全覆盖,全面测试方法。

第四单元

由于本单元既没有类似第二单元的结果不可复现性,也没有第三单元的算法要求,所以本单元的测试还是十分简单的,一方面仍是构造大量随机数据进行黑箱测试,另一方面便是构造类似刚好预期或是刚好不逾期的边界数据进行测试,此外利用大佬写的评测机也是一个很方便的测试方法。本单元也很幸运的没有出现一个bug。

课程收获

太不容易了!!经过一个学期没日没夜的学习,我们终于爬上了”昆仑“的顶峰。回顾这个学期的摸爬滚打,很感谢那个不轻言放弃的自己,感谢在我沮丧和压力大的时候鼓励我的女朋友,也很感谢给我提供很多帮助的同学们,感谢编写评测机的大佬们,特别感谢为我解答问题的助教们,感谢传授知识的老师们。

在oo课程的学习中我收获了许多:

  • 很大程度上掌握了java语言编写代码,代码能力有大幅度的提高
  • 掌握面向对象设计的思想,帮助我更好地解决问题
  • 学会了很多测试的思想和方法,包括但不限于黑箱测试、白箱测试、Junit等,提高了我写数据生成器进行评测的能力,让我了解了写评测机的思想和过程
  • 掌握了很多模型,如生产者-消费者模型、契约化编程模型、UML模型等,帮助我更好、更直观地理解要求并实现
  • 编写和阅读博客能力提高。在完成每次作业的过程中,阅读学长学姐的博客总能给我很大的启发,同时在进行单元总结时也能很好地表达自己的架构思路
  • 在debug和对拍的过程中认识很多优秀的人,促使我努力向他们学习

就说这么多吧,再次感谢所有帮助过我的人。

2024年面向对象设计与构造 完结撒花

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值