272
社区成员




@Trigger
注解关联状态转移方法与UML@SendMessage
注解映射消息路径// 状态转移注解示例
@Trigger(from="bs", to="user")
public void borrowBook() { ... }
// 顺序图消息注解示例
@SendMessage(from="User", to="AppointmentOffice")
public void orderBook() { ... }
管理同一ISBN下的所有副本
提供副本查找、可用副本检索功能
实现开馆/闭馆时的整理策略:
// 开馆整理示例
public List<LibraryMoveInfo> sortAfterOpen(LocalDate date, LibraryBookState destState) {
// 处理不同位置的书籍移动逻辑
}
BookCopy(书籍副本)
维护单本书籍的状态信息:
private LibraryBookState location; // 当前位置
private User reservedFor; // 预约用户
private LocalDate reserveExpiry; // 预约有效期
记录移动历史轨迹
管理借阅期限计算:
public void setBorrowDate(LocalDate date) {
borrowDate = date.plusDays(bookId.isTypeB() ? 30 : 60);
}
User(用户)
管理用户状态:
private Map<LibraryBookIsbn, BookCopy> borrowedBooks; // 已借书籍
private LibraryBookIsbn reservedIsbn; // 预约ISBN
private int creditScore = 100; // 信用分
实现信用分规则:
public void updateCreditScore(int alter) {
creditScore = Math.max(0, Math.min(180, creditScore + alter));
}
Library(系统核心)
全局状态管理:
private Map<LibraryBookIsbn, BookCollection> collections; // 书籍集合
private Map<String, User> users; // 用户集合
private Set<LibraryBookIsbn> hotBooks; // 热门书籍
指令路由中心:
public void processCommand(LibraryCommand cmd) {
// 路由到不同处理逻辑
}
由上图可见,UML与项目代码基本上保持了很高的统一性。
将题目描述发送给大模型,向其提出提取关键问题信息的询问。如:各种类书籍的限制、用户操作成功条件、整理规则等。
接着提取核心业务类,并附以提供含义说明的请求。
在二步骤的基础上,进一步补全核心业务类的属性和方法等,同时也可实现一定的代码补全。
Lexer
词法分析、Parser
语法解析、Expr
表达式树)。因子(Factor)
→项(Term)
→表达式(Expr)
的层次结构,降低复杂度。AddSubParser
处理加减法)。Scheduler
)作为任务队列,解耦请求输入线程与电梯工作线程。BlockingQueue
、synchronized
和ReentrantLock
封装共享资源(如请求队列)。Running
, Idle
, Maintenance
)封装为独立类,避免条件分支膨胀。requires
)、后置条件(ensures
)指导方法实现,如addPerson()
需满足非空约束。invariant
定义核心属性(如network
中无重复节点),保证系统状态始终合法。getShortestPath()
的输入输出,内部用Dijkstra或并查集自由优化。DeliveryService
):调度快递订单Database
):存储用户信息OrderTracker
→ User
)Pending
, Shipped
, Delivered
)继承
(车辆类型)、组合
(订单与包裹)、依赖
(调度器使用路径规划)。可维护性成为贯穿始终的主线:
递归下降的表达式树易扩展 → 多线程的解耦提升容错性 → JML确保代码与需求一致 → UML模型直接对应业务逻辑。
这一演进过程本质是问题复杂度的升维应对:从语法树(单一领域)→ 并发(资源竞争)→ 契约(行为规范)→ 系统建模(多模块协作),每一步都在扩充架构设计的武器库。
测试核心:功能正确性 & 边界输入验证
主要方法:
Jacoco
)确保所有语法规则分支(如不同运算符、括号嵌套层数)都被执行到。Lexer.nextToken()
, Parser.parseFactor()
)进行独立测试。测试思维: “找错” - 重点在于发现解析逻辑中的漏洞(如运算符优先级处理错误、括号匹配错误、异常输入崩溃)。
测试核心:并发安全性 & 调度策略有效性 & 系统稳定性
主要方法:
Thread.sleep()
或CountDownLatch
等工具模拟时序,检查共享资源(如请求队列、电梯状态)是否被正确同步。jstack
分析线程堆栈,或借助VisualVM
等工具监控线程状态。测试思维: “破坏” - 重点在于模拟极端和异常并发场景,“攻击” 系统以暴露其脆弱性(线程安全、死锁、资源耗尽)。
测试核心:规格符合性 & 数据一致性
主要方法:
requires
的无效输入测试: 对每个方法的requires
子句,构造违反前置条件的输入(如添加已存在的Person
,查询不存在的Person
的Value
),验证是否抛出指定异常(如PersonIdConflictException
, PersonNotFoundException
)。ensures
/invariant
的有效输入测试: 对满足前置条件的输入,验证方法执行后结果是否满足后置条件,以及类不变式是否始终保持(如addRelation
后两人acquaintance
列表是否相互包含,group
的ValueSum
是否正确更新)。测试思维: “验证” - 重点在于证明代码行为严格符合形式化规格定义的所有约束(前置条件、后置条件、不变式)。
测试核心业务流程完整性 & 模型实现一致性 & 系统交互有效性
主要方法:
四个单元的学习让我实现了从技术实现者到系统设计者的蜕变:递归下降教会我用分治思想拆解复杂语法规则,奠定模块化设计基础;多线程实战赋予我驾驭并发混沌的能力,通过资源隔离与状态机设计保障系统健壮性;JML规格训练我以数学契约精神精确锚定需求与实现,让代码成为可验证的逻辑命题;UML建模则引导我构建业务与技术的桥梁,用分层架构与设计模式实现从现实场景到软件系统的抽象映射——最终凝练成应对复杂性的核心方法论:分解、隔离、约束、抽象,让我真正理解软件工程不仅是写代码,更是为现实世界构建可持续进化的数字孪生。