308
社区成员
发帖
与我相关
我的任务
分享随着第四单元图书馆管理系统最后一次强测的落幕,这学期的OO课程也画上了圆满的句号。回首这四个单元的历程,从最初面对多项式求导的无从下手,到如今能够熟练利用 UML 图进行正向的系统级架构设计,我感慨又欣喜。这不仅是代码行数的积累,更是思维维度的全面提升。
在第四单元的实践中,“正向建模”是绝对的核心。过去我们习惯于“边写边构思”,而本单元强制要求我们先画图(建模),再写代码,这是一种典型的自顶向下的工程思维。
在这一过程中,两阶类图(一阶设计图与二阶最终图)扮演了不可替代的角色:
LibraryManager 的任何一行逻辑之前,一阶类图强迫我去思考系统的边界和实体的划分。比如,我决定采用“中心调度 + 充血模型”的星型架构,由 LibraryManager 统筹全局,下设 Bookshelf、AppointmentOffice、BorrowAndReturnOffice 等独立的地点类。通过在类图中绘制有向关联线(Directed Association),我提前确立了数据的流向和各类的职责。一阶类图就像是与自己签订的开发契约,避免了在后续复杂的业务(如借书、预约、逾期结算)中迷失方向。restore 方法,在代码实现时为了图省事想用 returnBook 替代,结果评测机精准报错。这让我深刻认识到:模型不是代码的草图,而是严格的领域规约。 二阶类图的严格审查,有效防止了架构的腐化。本单元我的最终架构设计是一个典型的中心调度模式。代码设计与 UML 模型之间保持了 严格的映射追踪关系:
LibraryManager 类完美映射了 UML 中的调度中心,包含了处理各种命令(borrow, order, read, arrange 等)的方法。Bookshelf, ReadingRoom, TreasuredBookshelf)。在 UML 图中,LibraryManager 通过带有 Role Name(如 -readingRoom)的实线箭头指向它们;在代码中,这严格映射为 LibraryManager 中的 private final ReadingRoom readingRoom; 成员属性。Book)的生命周期流转,我在代码中不仅使用了 @Trigger 注解,还为了满足 Guard 条件互斥检验,特意引入了 targetState 这一辅助变量。这样不仅符合了状态图的逻辑闭环,也让代码的可测试性大大增强。orderNewBook 等核心交互方法的可见性严格设为 public,并添加 @SendMessage 注解。代码中方法的调用链与顺序图中的 Lifeline 消息传递(:User -> :LibraryManager)严丝合缝。在本单元复杂的架构搭建和令人抓狂的图评测排错中,我深刻体验到了使用大模型(LLM)辅助开发的威力。要想让大模型在复杂场景中真正发挥作用,需要掌握科学的引导策略:
LibraryManager 调度架构”、“类名必须包含官方关键词覆盖率”),以及代码规范(如 CheckStyle 的单行 100 字符限制)。OPEN/CLOSE 触发”这一逻辑漏洞。大模型理解后,立刻给出了基于数学日期比对的完美 arrange 补缴清理逻辑,而不需要重构整个时间轴系统。Delete from Model)的区别。引导大模型不仅分析 Java 代码,还要分析开发工具的底层逻辑,是解决疑难杂症的利器。回顾这四个单元,我的架构设计思维经历了一场蜕变:
与架构演进相伴的,是测试思维的不断升级:
历时一学期的 OO 课程是一场真正的淬炼。
首先,我的代码规范得到了前所未有的重塑。CheckStyle 的红线曾经让我痛苦不堪,但现在,良好的命名、合理的单行长度、以及低耦合的包管理已经成为了肌肉记忆。
其次,我真正理解了什么是“软件工程”。代码只是表达逻辑的载体,而架构设计、UML 建模、JML 契约、多线程安全,这些才是支撑起一个健壮软件的钢筋铁骨。
最后,是抗压能力与问题排查能力的提升。无数个在评测机前“提心吊胆”的夜晚,无数次被 R1-R5 规则和“时间跳跃 Bug”卡住后的抽丝剥茧,让我逐渐褪去了普通 Coder 的青涩,开始以一名软件工程师的严谨视角去审视每一行代码。
感谢 OO,让我完成了这学期最痛苦却也最宝贵的蜕变。