OO Unit4 总结

陈嘉民-23371149 2025-06-11 02:22:50

正向建模和开发

一、 正向建模流程

  1. 需求分析先行
  • 每次迭代前深入理解新增功能需求(如第14次的热门书架/阅读功能、第15次的信用分系统)
  • 明确系统边界和关键约束条件(如整理流程规则、状态转移条件)
  1. UML设计驱动开发
  • 类图设计定义核心实体(Book, User, Shelf等)及其关系
  • 状态图设计(第14/15次):
    • 定义书籍的6种状态(普通书架/热门书架/借还处/预约处/阅览室/用户)
    • 使用@Trigger注解关联状态转移方法与UML
  • 顺序图设计(第15次):
    • 绘制"预定新书"和"取书"场景的交互流程
    • 通过@SendMessage注解映射消息路径
  1. 编码实现
  • 严格遵循UML设计实现核心类
  • 关键方法添加UML关联注解:
// 状态转移注解示例
@Trigger(from="bs", to="user")
public void borrowBook() { ... }

// 顺序图消息注解示例
@SendMessage(from="User", to="AppointmentOffice")
public void orderBook() { ... }
  1. 设计回溯调整
  • 编码过程中发现设计缺陷时更新UML图
  • 保持代码与UML的60%以上一致性(类属性/方法)

二、建模关键挑战

  1. 状态一致性维护
  • 书籍状态与物理位置同步
  • 信用分变化触发权限变更(状态机隐式转移)
  1. 时间维度处理
  • 预约有效期计算(开/闭馆送达差异)
  • 借阅期限的日历计算(非固定天数)
  1. 规则冲突解决
  • 整理流程约束(如开馆后借还处需清空)
  • 信用分权限与基础规则的叠加校验

架构设计和追踪关系

一、 核心类职责划分

  1. BookCollection(书籍集合)
  • 管理同一ISBN下的所有副本

  • 提供副本查找、可用副本检索功能

  • 实现开馆/闭馆时的整理策略:

    // 开馆整理示例
    public List<LibraryMoveInfo> sortAfterOpen(LocalDate date, LibraryBookState destState) {
        // 处理不同位置的书籍移动逻辑
    }
    
  1. BookCopy(书籍副本)

    • 维护单本书籍的状态信息:

      private LibraryBookState location; // 当前位置
      private User reservedFor;         // 预约用户
      private LocalDate reserveExpiry;  // 预约有效期
      
    • 记录移动历史轨迹

    • 管理借阅期限计算:

      public void setBorrowDate(LocalDate date) {
          borrowDate = date.plusDays(bookId.isTypeB() ? 30 : 60);
      }
      
  2. 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));
      }
      
  3. Library(系统核心)

    • 全局状态管理:

      private Map<LibraryBookIsbn, BookCollection> collections; // 书籍集合
      private Map<String, User> users;                        // 用户集合
      private Set<LibraryBookIsbn> hotBooks;                  // 热门书籍
      
    • 指令路由中心:

      public void processCommand(LibraryCommand cmd) {
          // 路由到不同处理逻辑
      }
      

二、UML

  1. 类图:

img

  1. 状态图:

img

  1. 顺序图:

img

由上图可见,UML与项目代码基本上保持了很高的统一性。

  • 类图:各类的属性方法及类与类间的关系基本一一对应。
  • 状态图:涵盖了所有书籍的转移状态,与代码高度一致。
  • 顺序图:由于正向建模时的结构就很简单,所以顺序图也会很简单。

引导大模型架构设计

一、提炼关键

将题目描述发送给大模型,向其提出提取关键问题信息的询问。如:各种类书籍的限制、用户操作成功条件、整理规则等。

二、初步构建

接着提取核心业务类,并附以提供含义说明的请求。

三、细节补充

在二步骤的基础上,进一步补全核心业务类的属性和方法等,同时也可实现一定的代码补全。

架构设计思维演进

第一单元:递归下降(语法分析)

  • 核心架构思维自顶向下的模块化分解
    通过递归下降法解析表达式,将复杂语法规则分解为相互递归的子模块(如 Lexer 词法分析、Parser 语法解析、Expr 表达式树)。
  • 关键设计原则
    1. 层次化抽象:将表达式拆分为因子(Factor)项(Term)表达式(Expr)的层次结构,降低复杂度。
    2. 单一职责:每个类仅处理一种语法规则(如 AddSubParser 处理加减法)。
    3. 可扩展性:通过工厂模式动态添加新运算符(如乘方、三角函数),避免修改核心解析逻辑。
  • 演进意义
    从面向过程转向模块化设计,学会用递归思想分解问题,奠定后续复杂架构的基础。

第二单元:多线程(电梯调度)

  • 核心架构思维并发资源的协作与隔离
    设计多线程电梯系统时,重点解决线程安全、死锁预防和任务调度问题。
  • 关键设计原则
    1. 生产者-消费者模型:调度器(Scheduler)作为任务队列,解耦请求输入线程与电梯工作线程。
    2. 线程安全边界:通过BlockingQueuesynchronizedReentrantLock封装共享资源(如请求队列)。
    3. 状态模式:电梯运行状态(Running, Idle, Maintenance)封装为独立类,避免条件分支膨胀。
  • 演进意义
    从静态模块化转向动态行为设计,掌握资源竞争与协作的平衡,强化系统鲁棒性思维。

第三单元:JML规格(社交网络)

  • 核心架构思维契约式设计与行为约束
    基于JML规格实现社交网络系统,将需求转化为形式化契约,确保代码与设计一致。
  • 关键设计原则
    1. 规格驱动开发:前置条件(requires)、后置条件(ensures)指导方法实现,如addPerson()需满足非空约束。
    2. 数据不变性:用invariant定义核心属性(如network中无重复节点),保证系统状态始终合法。
    3. 算法与实现分离:JML仅定义getShortestPath()的输入输出,内部用Dijkstra或并查集自由优化。
  • 演进意义
    从“如何实现”转向“如何精确描述需求”,培养形式化验证思维,提升代码的可验证性与可靠性。

第四单元:UML建模(快递系统)

  • 核心架构思维系统级抽象与分层架构
    使用UML对快递系统建模,从用例图到类图、状态图,全面抽象业务逻辑。
  • 关键设计原则
    1. 分层架构
      • 表现层(UI):处理输入输出
      • 业务层(DeliveryService):调度快递订单
      • 数据层(Database):存储用户信息
    2. 设计模式应用
      • 观察者模式:物流状态变更时通知用户(OrderTrackerUser
      • 状态模式:订单状态(Pending, Shipped, Delivered
    3. 关系可视化:类图明确继承(车辆类型)、组合(订单与包裹)、依赖(调度器使用路径规划)。
  • 演进意义
    从局部设计跃升至全局系统视角,用模型驱动开发(MDD),实现需求→设计→代码的全链路可控。

可维护性成为贯穿始终的主线:
递归下降的表达式树易扩展 → 多线程的解耦提升容错性 → JML确保代码与需求一致 → UML模型直接对应业务逻辑。

这一演进过程本质是问题复杂度的升维应对:从语法树(单一领域)→ 并发(资源竞争)→ 契约(行为规范)→ 系统建模(多模块协作),每一步都在扩充架构设计的武器库。

测试思维演进

第一单元:递归下降(语法分析)

测试核心:功能正确性 & 边界输入验证

主要方法:

  • 黑盒测试为主: 构建大量边界用例(如多层嵌套括号、超大指数、空输入、非法字符)和复杂表达式组合,验证输出结果是否与预期(如手动计算、Matlab等工具)完全一致。
  • 白盒补充: 通过代码覆盖率(如Jacoco)确保所有语法规则分支(如不同运算符、括号嵌套层数)都被执行到。
  • 单元测试: 对关键模块(如Lexer.nextToken(), Parser.parseFactor())进行独立测试。

测试思维: “找错” - 重点在于发现解析逻辑中的漏洞(如运算符优先级处理错误、括号匹配错误、异常输入崩溃)。

第二单元:多线程(电梯调度)

测试核心:并发安全性 & 调度策略有效性 & 系统稳定性

主要方法:

  • 压力/负载测试: 模拟高峰请求(如瞬间涌入大量请求)、长时间运行,观察系统是否崩溃、死锁、活锁或响应时间剧增。
  • 并发干扰测试: 刻意构造特定时序的并发操作(如多个乘客同时呼叫电梯、电梯在临界点改变方向时收到新请求),使用Thread.sleep()CountDownLatch等工具模拟时序,检查共享资源(如请求队列、电梯状态)是否被正确同步。
  • 随机性测试: 利用随机请求生成器进行长时间测试,暴露非确定性Bug(如偶发的数据竞争、死锁)。
  • 性能测试: 衡量平均/最长等待时间、吞吐量(单位时间运送乘客数),评估调度算法优劣。
  • 死锁检测工具: 使用jstack分析线程堆栈,或借助VisualVM等工具监控线程状态。

测试思维: “破坏” - 重点在于模拟极端和异常并发场景,“攻击” 系统以暴露其脆弱性(线程安全、死锁、资源耗尽)。

第三单元:JML规格(社交网络)

测试核心:规格符合性 & 数据一致性

主要方法:

  • 规格驱动测试:
    • 基于requires的无效输入测试: 对每个方法的requires子句,构造违反前置条件的输入(如添加已存在的Person,查询不存在的PersonValue),验证是否抛出指定异常(如PersonIdConflictException, PersonNotFoundException)。
    • 基于ensures/invariant的有效输入测试: 对满足前置条件的输入,验证方法执行后结果是否满足后置条件,以及类不变式是否始终保持(如addRelation后两人acquaintance列表是否相互包含,groupValueSum是否正确更新)。
  • 路径/分支覆盖: 结合规格要求,确保代码中所有逻辑路径(尤其是边界条件处理)被覆盖。

测试思维: “验证” - 重点在于证明代码行为严格符合形式化规格定义的所有约束(前置条件、后置条件、不变式)。

第四单元:UML建模(快递系统)

测试核心业务流程完整性 & 模型实现一致性 & 系统交互有效性

主要方法:

  • 基于场景/用例的测试:
    • 正向流程: 模拟完整的业务场景(如用户下单→仓库拣货→快递员接单→配送→签收),验证系统状态转换(对应状态图)和数据流(对应序列图/活动图)是否符合设计。
    • 异常/分支流程: 模拟业务规则中的异常(如库存不足、订单取消、配送超时、用户拒收),验证系统是否能按模型设计的替代路径正确处理。
  • 模型一致性检查:
    • 验证代码实现是否与类图(类结构、关系)、状态图(对象状态转换)、序列图(对象间交互时序)保持一致。
  • 集成/系统测试:
    • 重点测试不同子系统/模块(如订单管理、库存管理、物流跟踪)之间的接口交互是否符合UML协作图/组件图的定义。
  • 用户验收测试模拟:
    • 根据UML用例图设计的参与者(Actor)和用例(Use Case),构造测试用例,验证系统是否满足最终用户需求。

课程收获

四个单元的学习让我实现了从技术实现者系统设计者的蜕变:递归下降教会我用分治思想拆解复杂语法规则,奠定模块化设计基础;多线程实战赋予我驾驭并发混沌的能力,通过资源隔离与状态机设计保障系统健壮性;JML规格训练我以数学契约精神精确锚定需求与实现,让代码成为可验证的逻辑命题;UML建模则引导我构建业务与技术的桥梁,用分层架构与设计模式实现从现实场景到软件系统的抽象映射——最终凝练成应对复杂性的核心方法论:分解、隔离、约束、抽象,让我真正理解软件工程不仅是写代码,更是为现实世界构建可持续进化的数字孪生。

...全文
16 回复 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

272

社区成员

发帖
与我相关
我的任务
社区描述
2025年北航面向对象设计与构造
学习 高校
社区管理员
  • Alkaid_Zhong
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧