BUAA-2024年春-OO第四单元总结

news2024/11/28 13:44:57

正向建模与开发

在本单元中,我们需要模拟一个小型的图书管理系统,完成图书馆所支持的相关业务,并遵守一定的规章制度。与前几次不同的是,本单元中,我们需要预先将自己的设计思路用UML来实现,然后进行编程。

具体而言,在本单元中,我们分别使用UML类图、状态图和顺序图来进行正向建模。类图主要展示各个类之间的关联、依赖、组合、聚合关系等;状态图则需要通过trigger、guard等来表示不同状态之间的转化;顺序图则反应一个对象之间的消息传递和时序问题。

笔者在每单元的作业中会先进行较为粗略的建模,从而确定大致的编程思路。为了通过公测,我会在代码完成编写之后再对UML图进行补充和修改。

架构设计

下图是我完成hw15后的代码规模。

这是我本单元的UML类图。 

 我在本单元中一共实现了12个类,除了Main类之外,我建立了Library类、BookShelf类、AppOffice类、BrOffice类和BdCorner类来作为图书馆的主体,建立AppInfo类、ReserveInfo类、PersonInfo类和BsBookInfo类、BdcBookInfo类来作为存储信息的载体,用于保存和Book相关的信息。

对于图书馆的业务请求,我采用将请求逐级进行判断的方式,以BookShelf中的书籍为例,用户的query请求,因其不涉及对于书籍的改动,所以直接在Library中调用BookShelf的方法即可;而对于用户的borrow请求,我首先在Library中调用BookShelf中的attemptBorrow()方法,而在attemptBorrow方法中我再调用PersonInfo的canBorrow方法,实现了自顶向下的实现方法。

对于用户的信息,我在Library中建立了一个HashMap<StudentId, PersonInfo> personMap来记录所有用户的信息,在AppOffice类、BrOffice等具体部门类的构造方法中传入personMap,从而使得personMap的起始地址在各个部门中都能够访问,而不需要重复占用内存。

OO课程架构设计推进

其实在OO的每一个单元和OOpre中都用到了架构设计的思想,但是在之前的作业中没有要求使用UML来绘制架构设计图。

第一单元:我在第一单元中最开始关于架构设计完全摸不着头脑,我的设计完全是根据实验部分的代码修改而来,可能是课程组没有想在第一单元就这么考察我们的设计能力罢。第一单元中我认为最突出的是层次化设计,从expr、term到factor,层层深入。同时第一单元也警示我们好的设计架构可以避免后续扩展中不必要的麻烦甚至是重构的风险。

第二单元:在此单元中我第一次接触了多线程的思想,我认为在第二单元中锻炼的更多的是对于多线程中共享资源的认知和保护,同时也涉及了诸如生产者-消费者模型以及LOOK等电梯算法的思想。

第三单元:我认为在这个单元中架构设计没有前几个单元突出,主要是对JML进行编程实现,只有在需要考虑降低复杂度等特殊情况下才需要从总体架构出发进行优化,对于一些简单的方法似乎并不太需要对于架构有一个很好的把握,只需要选择合适的容器就可以独立编程实现。

第四单元:在本单元中我学习了UML类图、状态图和顺序图等与架构设计建模密切相关的知识。虽然本单元中实现的图书馆管理系统并没有前几个单元的作业难度那么大,但是很好地帮助我们理解正向建模给人带来的思维上的清晰。

OO课程测试思维推进

由于没有自己独立地搭建评测机,我在测试中更多的是采用手动捏造数据的方法来检测自己的程序是否实现相应的功能。但是这种方法很难覆盖较大范围的数据,而且也不易发现代码的bug,往往只能满足最基础的功能需求。

课程收获

OO是目前为止对代码量要求最大的一门课。正如荣文戈老师所说,“写一百万行代码的程序员和写一千万行代码的程序员,就是不一样”。虽然我远远没有达到那种境界,但是经过一学期的锻炼我确实感受颇多。举个例子,在这学期初,我的一个高中同学曾让我帮忙写他们学校布置的计算机大作业,内容也是实现一个图书馆管理系统,甚至比OO第四单元需要实现的要求还要少很多,但当时的我却无法帮他完成。而经过前三个单元的历练,我认为第四单元远远没有想象中那么困难。可见OO对于一个程序员的锻炼作用。

OO更像是一个全方位的锻炼,我们不仅需要在短时间内编写大量的代码,还需要考虑多线程、算法、架构设计等诸多问题。回首OO,虽然自己在有些作业中表现不佳,但是能完完整整经历OO的洗礼,真的让人成就满满。

希望课程组能够越来越好,给明年的xdx更大的考验(不是)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1815941.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Coze+Discord:打造你的免费AI助手(教您如何免费使用GPT-4o/Gemini等最新最强的大模型/Discord如何正确连接Coze)

文章目录 📖 介绍 📖🏡 演示环境 🏡📒 文章内容 📒📝 准备Discord📝 准备Coze🔌 连接💡 测试效果⚓️ 相关链接 ⚓️📖 介绍 📖 你是否想免费使用GPT-4o/Gemini等最新最强的大模型,但又不想花费高昂的费用?本文将教你如何通过Coze搭建Bot,并将其转发…

RAG系统进阶(五)文本分割优化技巧及代码

背景 前边在介绍RAG系统时提到了文本分割&#xff08;或分段&#xff09;的作用和重要性。也提到了分段后所带来的一些问题&#xff0c;比如由于分段导致检索出来的TOP-n的结果可能未包含完整的答案。 粒度太大可能导致检索不精准&#xff0c;粒度太小可能导致信息不全面问题的…

教你一段代码激活计算机系统

方法简单粗暴&#xff0c;再也不用遭受未激活的烦恼了&#xff01; 新建文本 输入代码&#xff0c;把文件后缀.txt改.bat slmgr /skms kms.03k.org slmgr /ato

2024-2025最新软考系统架构设计师的复习资料教材,解决如何快速高效通过该考试,试题的重点和难点在哪里?案例分析题和论文题的要点和踩坑点分析

目录 引言考试概述 考试结构考试内容 复习策略 制定复习计划学习资源 知识点详解 系统架构基础设计原则与模式系统分析与设计软件开发过程项目管理系统集成性能与优化安全性设计新兴技术 试题解析 选择题案例分析题论文题 重点与难点分析模拟试题与答案参考资料总结 引言 系…

DeepSpeed Pipeline并行

DeepSpeed为了克服一般Pipeline并行的forward时weights,和backward时计算梯度的weights, 二者不相同的问题&#xff0c;退而求其次&#xff0c;牺牲性能&#xff0c;采用gradient-accumulate方式&#xff0c;backward时只累积梯度至local&#xff0c;并不更新weights&#xff1…

css display:grid布局,实现任意行、列合并后展示,自适应大小屏幕

现有6X7列的一个布局&#xff0c;如下图所示 想要用户能组成任意矩形盒子&#xff0c;并展示内容&#xff0c;具体效果如下&#xff08;仅为一个示例&#xff0c;其实可以任意组合矩形&#xff09;&#xff1a; html代码&#xff1a; <div class"grid-container"…

SQL 截取函数

目录 1、substring 2、left 3、right 4、substring_index 1、substring 用途&#xff1a;字段截取从指定开始的字符开始&#xff0c;截取要的数&#xff1b;指定开始的字符数字可以用负的&#xff0c;指定开始的字符从后往前(向左)数&#xff0c;截取要的数不能为负。 语…

BoxSizer布局

自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 在前面的实例中&#xff0c;使用了文本和按钮等控件&#xff0c;并将这些控件通过pos参数布置在pannel画板上。虽然这种设置坐标的方式很容易理解&am…

GitLab教程(四):分支(branch)和合并(merge)

文章目录 1.分支&#xff08;branch&#xff09;&#xff08;1&#xff09;分支的概念&#xff08;2&#xff09;branch命令 2.合并&#xff08;merge&#xff09;&#xff08;1&#xff09;三个命令pullfetchmergegit fetchgit mergegit pull &#xff08;2&#xff09;合并冲…

C++开源软件:跨平台本地密码管理器KeePassXC/KeePassDX

KeePassXC、KeePass和KeePassDX在功能、平台和特点上有所区别&#xff0c;以下是对这三款密码管理器的清晰区分&#xff1a; KeePassXC&#xff1a; 平台&#xff1a;跨平台&#xff0c;支持Windows、macOS和Linux等主流操作系统。 安全性&#xff1a;使用AES加密算法&#x…

路虽远,行则将至 - 附暑期实习、秋招历程经验分享

前言 大家好 许久没有时间静下心来打开编辑器写文章了 忙碌暂过&#xff0c;难得一闲时 求学三年&#xff0c;终到离别时 回忆过往&#xff0c;枯燥且多彩 有一点经验&#xff0c;以文字形式分享&#xff0c;希望帮助到大家 可能是这段时间事多且杂&#xff0c;加上很长一…

NSS题目练习8

[SWPUCTF 2022 新生赛]numgame 打开发现不能直接更改数值&#xff0c;会变成负数&#xff0c;快捷键不能用&#xff0c;输入view-source查看源代码&#xff0c;发现js文件 点开后发现最下面有个酷似flag的东西 提交后是错的&#xff0c;看着像是base64&#xff0c;解码后得到另…

The Sandbox 游戏创作比赛|巴黎 CITY JAM

The Sandbox City Jam 邀请大家参与 The Sandbox 全新 Game Jam&#xff1a;City Jam&#xff01;活动将以社区为中心&#xff0c;每次一个城市&#xff0c;旨在将国际文化带入The Sandbox。你可以通过参与比赛赢得奖品&#xff0c;发展技能&#xff0c;并与其他创作者为伴&…

autosleep框架设计与实现

在低功耗系统中&#xff0c;autosleep是一个较小的模块&#xff0c;是低功耗主流程的入口。在Linux内核中&#xff0c;autosleep是休眠流程的触发点和入口点&#xff0c;PM Core的休眠流程入口pm_suspend()就是被autosleep的睡眠工作队列调用而进入休眠的。 该功能的支持受宏…

反向代购系统建站技术详解

一、引言 随着全球化趋势的深入和电商行业的快速发展&#xff0c;反向代购&#xff08;Reverse Daigou&#xff09;作为一种新兴的商业模式逐渐受到关注。反向代购&#xff0c;即海外消费者通过国内电商平台购买国内商品并委托平台或第三方进行国际配送&#xff0c;满足了海外…

[Java基本语法] 从0到1带你精通Java基本语法

&#x1f338;个人主页:https://blog.csdn.net/2301_80050796?spm1000.2115.3001.5343 &#x1f3f5;️热门专栏:&#x1f355; Collection与数据结构 (92平均质量分)https://blog.csdn.net/2301_80050796/category_12621348.html?spm1001.2014.3001.5482 &#x1f9c0;线程与…

类和对象(二)(C++)

初始化列表 class Date{public:Date(int year, int month, int day){_year year;_month month;_day day;}private:int _year;int _month;int _day;}; 虽然上述构造函数调用之后&#xff0c;对象中已经有了一个初始值&#xff0c;但是不能将其称为对对象中成员变量的初始化…

第十五篇——条件熵和信息增益:你提供的信息到底值多少钱?

目录 一、背景介绍二、思路&方案三、过程1.思维导图2.文章中经典的句子理解3.学习之后对于投资市场的理解4.通过这篇文章结合我知道的东西我能想到什么&#xff1f; 四、总结五、升华 一、背景介绍 通过这篇文章&#xff0c;我知道了条件熵和信息增益&#xff1b;如果你试…

创建应用程序

自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 使用wxPython之前&#xff0c;先来了解两个基础对象&#xff1a;应用程序对象和顶级窗口。 应用程序对象管理主事件循环&#xff0c;主事件循环是wx…

JavaScript的运算符(算术、比较、赋值、逻辑、条件)

天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物。 每个人都有惰性&#xff0c;但不断学习是好好生活的根本&#xff0c;共勉&#xff01; 文章均为学习整理笔记&#xff0c;分享记录为主&#xff0c;如有错误请指正&#xff0c;共同学习进步。…