272
社区成员




先来简单回顾一下本单元完成的任务:利用UML进行正向建模,并完成一个小型的图书馆管理系统
- hw13:实现借阅,预约,预约取书,还书等基本流程
- hw14: 实现图书室借阅功能,并增加热门书架与普通书架
- hw15:引用用户信用积分限制
正向建模与开发是指在软件开发过程中,根据需求说明书或者业务逻辑出发,通过抽象分析构建系统模型,指导我们后续的设计、开发以及测试流程。正向建模强调顶层设计,通过模型定义系统结构、行为以及类之间的交互方式等,并不直接陷入编码细节。
OO作业是迭代性任务,一个良好的初期架构对于后期作业的顺利完成是十分重要的。在前几个单元中,我是通过阅读分析指导书,手绘简易的架构设计图,包括了类及其属性的设计,以及类之间交互关系的设计。
本单元中,课程组的初衷是先绘制UML类图等进行正向建模,并据此进行后续开发。本单元指导书的一大特点就是内容多而繁杂,如若不加思考便着手编码,很难得到一个良好码风与正确性兼具的代码。我是先通过阅读分析指导书,规划得到其中的基本对象类(预约处、借还处、书架等),并确定其基本属性,并对业务流程加以分析,确定类之间的交互关系与工具类(Runner也即其他同学设计的抽象Library类)。实际上,我是在纸上简单设计其代码架构图,确保各个业务流程能够良好完成,并未直接开展UML设计,不经过编码过程中的一些思考直接得到较为准确的UML类图对我来说还是太难。(但这应该也并不违背课程组初衷)
利用UML等正向建模可以在开发初期便为系统搭建一个良好清晰的架构图,避免边写代码边该架构的混乱,提前暴露出一些逻辑漏洞,同时也便于团队开发,减少架构设计人员、开发人员、测试人员之间的理解偏差。但需注意的是建模深度与开发效率二者之间的平衡,不必为所有功能绘制复杂UML图,也不必一开始陷入非常细节的功能设计。
第一次功能相对简单,实现了以下几个类
AppointmentOffice
:预约处,处理预约请求并为对应顾客留存对应的书BorrowReturnOffice
:借还处,用于通过借阅以及预约取书拿到的书都会在此处归还Bookshelf
:书架,保存依旧属于书架中的书User
、Book
:用户类以及图书类QueryMachine
:查询机,主要完成查询请求Runner
:类似于一个抽象的图书馆类,用于各个部门与输入输出的交互实现实际上,代码中应有的类在指导书以及oolens
的推送中已经暗示的非常明显了。
但在本人的作业实现中,我感受到了query功能的一些不足,我是通过在queryMachine中存储了所有出现过的书籍的引用,并在Book书这一对象中利用容器存储其对应的转移路径。但联系现实生活,一本物理存在的书不应知道除书本记录的文字内容之外的信息。所以我任务我们应该额外构建某个容器类,在其中存储所有书籍的信息,可能起到类似数据库的作用吧。
本次作业新增了热门书架,阅读,归还等功能。
为避免对架构的改变,我在Bookshelf中设置了两个数据结构,分别对应普通书架与热门书架。并在开馆整理时候将对应的书移到相应书架,并通过removeBook
的返回值来告知外界其来自哪个书架。
新增阅读室,完成阅读以及归还功能,并在每日闭馆的整理过程中将阅读室剩余的书整理回书架。
本次作业中引入了用户信用分系统,对用户的行为做进一步限制,同时新增了图书借阅期限的限制。
我们在Runner中维护一个noReturnBooks
容器,在其中记录所用被借阅或者预约取书拿走还未通过return请求归还的书。在借阅和取书成功后加入该容器,并在书中存储对应的截止日期与用户id等信息。在每日闭馆后对逾期未还书的用户进行信用分扣除。
由于开馆闭馆日期的不连续,我们需要注意在每日开馆时候扣除包括两次开馆之间间隔天数对应的信用积分。
实际上本单元三次迭代UML建模与代码设计是相辅相成的
- UML草图绘制,有基本的架构逻辑体现
- 初步开始写代码,细节实现逐渐清晰,开始下一步画最终UML图
- 绘制UML图
- 完成代码
- 校对UML图
题目提炼:对于复杂场景,其自然语言描述的需求说明往往较为繁杂,对于设计者来说很难很快从其中获取所需关键信息。首先可以借助LLM总结题目所要求的任务以及场景描述及任务流程
例如,在第一次迭代时,可以询问AI“总结图书馆所需要实现的功能以及可能的功能流程,并列出细节”
模型提取:完成基本业务类模型建立。例如“需要完成哪些业务类,该业务类中需要保存什么属性,对外提供哪些方法”
层次设计:你认为应该如何组织其中类之间的层次架构关系,(引导是否有合适的继承关系或者接口关系),并按照合适的格式输出
重复修改:指出认为不合理的地方(阐明自己的思考逻辑给AI),让AI按照相同逻辑修改改进
关系挖掘: 输出类之间关系
当然在实际应用时候需要加上以下提问技巧
以下框架展示摘自
第八次实验
ROSES框架在RTF框架的基础上将输入细分为5个核心部分,以确保清晰、有目的的交互。ROSES在明确角色和目标的基础上,更强调场景和解决方案。
[Role] 你是某科技公司的公关经理。
[Objective] 为即将发布的智能手表撰写一篇吸引投资人和媒体的演讲稿。
[Scenario] 发布会面向投资者、科技媒体和潜在消费者,需突出产品创新性和市场潜力。
[Expected Output] 一篇800字左右的演讲稿,包含开场白、产品亮点、技术参数、市场定位和结尾呼吁。
[Steps]
- 用故事或数据开场,引起听众兴趣;
- 分模块介绍核心功能(健康监测、续航能力、设计美学);
- 引用第三方机构的市场预测数据;
- 结尾强调品牌愿景,呼吁合作。
例如:
[Role] 你是某科技公司的公关经理。 [Objective] 为即将发布的智能手表撰写一篇吸引投资人和媒体的演讲稿。 [Scenario] 发布会面向投资者、科技媒体和潜在消费者,需突出产品创新性和市场潜力。 [Expected Output] 一篇800字左右的演讲稿,包含开场白、产品亮点、技术参数、市场定位和结尾呼吁。 [Steps] 1. 用故事或数据开场,引起听众兴趣; 2. 分模块介绍核心功能(健康监测、续航能力、设计美学); 3. 引用第三方机构的市场预测数据; 4. 结尾强调品牌愿景,呼吁合作。
经历层次化设计、多线程设计、JML规格设计、UML正向建模与开发四个单元的训练,我们的架构设计能力有了较大的设计
对于测试来说,我一般会经历以下流程:基本功能测试——搭建评测机进行黑盒测试——边界测试——白盒测试
在OO学习的过程中,我的架构设计能力有了较大的进步。在之前的学习中,通常是编写一个不是很长的程序来完成某一功能,架构设计能力并未经过很好的训练。在OO学习中,我们每一单元是完成一个小型的系统,并且迭代式任务对架构提出了更高的要求,我的架构设计能力有了长足的进步。虽然每一单元第一次作业都要思考很久才开始写...
同时通过强测以及互测机制,我的测试能力也进步不少,学习并完成了评测机搭建。以前的C语言以及数据结构作业中,我们可以在平台即时得到最终反馈,每次都是本地如果可以跑起来就交上去看看,如果对了就不会再管了,这也导致我的测试能力接近于0。这学期为了不使强测炸锅以及互测顺利,我也在手动构造性测试基础上学习了评测机搭建,锻炼了测试能力。
OO作业好像一个时间计数器,让我清晰的知道了"第几周"这个概念。每一周的迭代开发并没有像CO那样给我带来精神上的摧残,反倒有一点点享受——阅读分析指导书、思考与设计架构、编码、测试、debug、测试。不管怎么说,OO是结束了,希望之后的数据库、软件工程等课程能善待我。