309
社区成员
发帖
与我相关
我的任务
分享在本单元的实践中,我们经历了从“面向代码编程”到“面向模型编程”的思维转变。正向建模与开发的核心思想是“先设计,后实现”,即将思考的过程前置,通过UML(统一建模语言)等工具,在动手编写代码之前,先从宏观架构、类间关系、状态转移和消息交互等多个维度刻画出系统的蓝图。这种方式极大地降低了在复杂业务逻辑中“边写边改”带来的试错成本和架构崩塌风险。
在这个过程中,两阶类图发挥了至关重要且截然不同的作用:
一阶类图:
一阶类图是在仔细阅读指导书、理解业务需求后绘制的。它的主要作用是领域抽象和确立骨架。在这个阶段,我们不需要关注具体的实现细节(如使用 HashMap 还是 ArrayList),而是关注系统中有哪些实体(如 LibraryManager, User, Book, Bookshelf, AppointmentOffice 等),以及它们之间的基本关系(如关联、依赖、继承)。一阶类图强迫我站在更高的抽象层次上思考问题,确保我们的业务逻辑和对象划分在概念上是合理的,为后续的编码指明了大致方向。
二阶类图:
随着编码的深入,往往会发现一阶类图中的某些设计过于理想化,或者缺少了实现某些复杂逻辑所需的辅助类、中间状态和辅助方法。此时,我们需要在代码实现的基础上,对一阶类图进行迭代和细化,形成二阶类图。二阶类图的作用是代码映射和架构固化。它真实地反映了系统最终的物理形态。通过对比一阶和二阶类图,我们可以清晰地看到设计与实现之间的鸿沟是如何被填平的,也能促使我们反思初期设计的不足,从而提高架构设计能力。
本单元的图书馆管理系统具有明显的模块化特征,整体架构可以分为以下几个核心部分:
LibraryManager 为核心,作为整个图书馆的管理者,负责接收并调度来自外部的指令。UserManager 负责管理所有用户实体。Bookshelf(普通书架)、TreasuredBookshelf(精品书架)、AppointmentOffice(预约处)、BorrowReturnOffice(借还处)和 ReadingRoom(阅览室)。这些类各自封装了内部的图书管理逻辑(如增删查改)。User(用户,记录信用分、借阅状态、预约状态等)、Book(图书),以及辅助记录的 BorrowRecord 等。在正向建模中,UML模型不再是简单的“示意图”,而是具有强约束力的设计契约。最终的代码设计与UML模型之间存在着严密的追踪关系(Traceability):
.java 文件或定义。类图中的属性名、可见性、类型,以及方法的签名(名称、参数类型、返回值)在代码中得到了精准的复现。LibraryManager 持有 UserManager 和各部门的实例);泛化/实现关系在代码中体现为 extends 和 implements 关键字。@Trigger 注解严格标记,且 Guard 条件对应了代码中 if 判断的业务逻辑。UML顺序图中的生命线(Lifeline)和消息传递(Message)则通过 @SendMessage 注解与具体的方法调用(如 LibraryManager 与 User 之间的 orderNewBook 和 addOrder 调用)一一对应。在本次复杂场景的架构设计中,我尝试使用了大语言模型(LLM)来辅助正向建模,体验深刻。大模型在处理繁杂规则、提供代码框架和解决UML语法细节上具有极大的优势,但在面对庞大且高度耦合的业务逻辑时,如果不加引导,很容易产出偏离需求甚至产生幻觉的输出。
总结而言,引导大模型完成复杂架构设计任务,需要掌握以下策略:
Context 投喂:从宏观到微观的规则输入
在让其设计架构前,首先要将复杂的业务场景(如官方包说明、各类图书借阅限制、信用分增减规则)进行结构化拆解,以清晰的 Prompt 喂给模型。可以先让模型总结规则,确认其理解无误后,再进入设计阶段。
分步设计:先核心,后细节
引导模型设计架构时,应采用“迭代式”问答(参考上机训练的内容)。
精准定位:利用大模型解决UML与代码转换的痛点
在绘制状态图和顺序图时,经常会遇到概念不清或工具使用障碍的问题。例如,当遇到“在代码中 LibraryManager 并没有直接作为局部变量存在,顺序图的 Lifeline 该如何画”时,向大模型清晰描述代码现状和 StarUML 工具的约束(如 obj: User 命名规范),大模型能够迅速给出正确的画法和 @SendMessage 的注解占位方案。
人工审核与纠偏
大模型生成的架构和代码片段可能会忽略某些隐蔽的边界条件(如 C 类书的同 ISBN 约束,或者闭馆后逾期的扣分结算时机)。因此,必须由开发者主导架构的最终决定权,对大模型生成的类图设计进行语义完整性检查和相似度审查,发现偏差及时通过 Prompt 予以纠正。
随着课程的推进,我的测试思维也经历了从“被动修Bug”到“主动保证质量”的转变:
这门课程不仅在教授Java,更是让我们学习系统化的工程实践。