包图 – 系统模块的“收纳整理术” 📦

236次阅读

一、包图是啥?—— 大型系统的“收纳箱”🧺

关键字:包图、系统模块化、模型组织、模块依赖

🧠

当系统规模变大(比如包含成百上千个类、用例)时,直接管理这些元素会杂乱无章——包图就是用来“收纳”这些元素的工具:它把相关的模型元素(类、用例、对象等)分组到“包”里,再描述包之间的关系,让系统结构从“一堆零散元素”变成“分层的模块集合”。

🤖 类比:

包图就像“电脑文件夹”——把“图片”“文档”“视频”分别放进不同文件夹(包),文件夹之间的引用关系(比如文档里插入图片)就是包的依赖关系。

✍️ 核心作用:

从“模块层级”把握系统的静态结构,实现“高内聚、低耦合”(包内元素关联紧密,包之间依赖松散)。

二、包图的“零件”:包 + 依赖关系 🧩

关键字:包、包的嵌套、可见性、依赖关系、引入

👆 1. 包:模型元素的“收纳盒”

包是 UML 中的“容器”,用于分组模型元素(类、用例、甚至其他包),在图中显示为“带小矩形的文件夹形状”,包含包名和内部元素。

📌 包的关键属性:

  • 包名:唯一标识,支持“路径名”(如com::system::GUI,表示包的嵌套层级);
  • 包内元素:一个元素只能属于一个包(不能“狡兔三窟”),包删除则内部元素也会被删除;
  • 包的嵌套:包可以包含其他包(比如“系统包”包含“用户模块包”“订单模块包”),但嵌套层数不宜过深(建议 2 - 3 层);
  • 可见性:控制包外元素对包内元素的访问权限:
    • +(公有):包外可访问;
    • #(保护):仅子包可访问;
    • -(私有):仅包内可访问。
  • 构造型:描述包的类型,比如<>(整个系统)、<>(子系统)、<>(框架包)。

🔗 2. 包的依赖关系:包之间的“引用绳”

包之间的依赖关系表示“一个包需要用到另一个包的元素”,用“带箭头的虚线”表示(箭头指向被依赖的包)。

⚠️ 常见问题:循环依赖

若包 A 依赖包 B,包 B 又依赖包 A,会导致代码编译错误、系统耦合过高——解决方法是拆分出“公共包”,让 A 和 B 都依赖公共包。

📥 引入(import):包的“访问权限”

引入是依赖的一种特殊形式,表示“一个包可以访问另一个包的公有元素”,类似 Java 的 import 或 C# 的using。例如“订单包”引入“商品包”,就能直接使用商品包的公有类。

三、包的“收纳原则”:让系统更整洁 🧹

关键字:高内聚、低耦合、分包原则

合理分包是包图的核心,需遵循以下原则:

  • 元素不能“狡兔三窟”:一个元素只能属于一个包;
  • 包内元素不重名:同一包中同类元素名称必须唯一(避免混淆);
  • 包内元素紧密联系:包内元素应具有相同的语义或功能(高内聚);
  • 包与包保持独立:减少包之间的依赖(低耦合),避免修改一个包影响其他包。

四、包图的建模步骤:从零散到有序 📋

关键字:建模技术、组成元素建模、体系结构建模

1. 对组成元素建模:分组零散元素

  • 找出“语义相近”的元素(比如“用户注册、登录、注销”相关的类);
  • 将这些元素放进同一个包,考虑包的嵌套(比如“用户模块包”包含“登录子包”“个人信息子包”);
  • 设置包内元素的可见性(非必要开放的元素设为私有);
  • 用引入依赖表示包之间的关系。

2. 对体系结构建模:系统的顶层拆分

用包图表示系统的“顶层视图”(比如“4+ 1 视图”),将系统拆分为“用户层、业务逻辑层、数据层”等包,展示系统的宏观架构。

五、包图的实战价值:大型项目的“必需品”🚀

在大型项目中,包图是团队协作的“沟通语言”——开发者可以明确“自己负责哪个包”“哪些包可以调用”,避免代码混乱;同时,包图也是后续代码分层(比如 Java 的 MVC 分层)的依据,让系统易维护、易扩展。

☁️ 复杂场景:框架与子系统

对于包含多个子系统的大型系统(比如电商系统包含“订单子系统”“支付子系统”),包图可以清晰展示子系统的划分及依赖关系,甚至可以用 <> 构造型标识可复用的框架包(比如“通用支付框架包”)。

正文完
 0