UML之类图学习

UML 类图在 C/C++ 中的工程化理解

一、设计约束(核心认知)

UML 类图不是"语法图",而是"设计意图图"

UML 中的可见性符号表达的是设计约束,而不是语言语法本身:

  • +:我允许你用(对外接口)
  • -:你不该碰(内部实现细节)
  • #:给子模块/派生模块留的

C/C++ 只是实现方式,不是 UML 的限制


二、C++ 视角下的 UML 类图

1. UML 与 C++ 的直接映射关系

UML 概念 C++ 对应
类(Class) class
属性(Attribute) 成员变量
方法(Operation) 成员函数
继承 : public Base
+ / - / # public / private / protected

2. C++ 示例代码

cpp 复制代码
class SerialPort {
public:
    void init();
    void send(uint8_t* buf, int len);
private:
    int fd;
};

3. 对应的 UML 类图表示

复制代码
┌────────────────────────────┐
│        SerialPort          │
├────────────────────────────┤
│ - fd : int                 │
├────────────────────────────┤
│ + init() : void            │
│ + send(buf : uint8_t*,     │
│        len : int) : void   │
└────────────────────────────┘

4. 设计含义说明

  • fd 被标记为 -:外部模块不应该直接操作底层资源

  • init()、send() 被标记为 +:对外提供的稳定 API


三、C 语言视角下的 UML 类图

C 语言没有 class,但 UML 允许你"逻辑上当成 class"

在 C 项目中,UML 类图表达的是模块设计意图。

1. C 语言中的工程约定

  • static 函数/变量 → UML 中的 -(private)
  • .h 中暴露的 API → UML 中的 +(public)
  • struct + 函数 → 逻辑上的一个"类"

2. C 语言示例代码

c 复制代码
typedef struct {
    UART_HandleTypeDef *huart;
    uint8_t rxBuf[128];
    uint16_t rxLen;
    UartState state;
} UartDriver_t;

void Uart_Init(UartDriver_t *drv, UART_HandleTypeDef *huart);
void Uart_Send(UartDriver_t *drv, uint8_t *buf, uint16_t len);
void Uart_StartReceive(UartDriver_t *drv);
UartState Uart_GetState(UartDriver_t *drv);

3. 对应的 UML 类图表示

注意 :UartDriver_t *drv 在 UML 中是隐含的 this,不需要画出来

复制代码
┌────────────────────────────────────┐
│            UartDriver              │
├────────────────────────────────────┤
│ - huart : UART_HandleTypeDef*      │
│ - rxBuf : uint8_t[128]             │
│ - rxLen : uint16_t                 │
│ - state : UartState                │
├────────────────────────────────────┤
│ + init(huart : UART_HandleTypeDef*)│
│ + send(buf : uint8_t*, len : u16)  │
│ + startReceive() : void            │
│ + getState() : UartState           │
└────────────────────────────────────┘

4. 设计含义说明

  • struct 成员在设计上属于 private 属性

    • → 即使语法上可访问,也不代表设计上允许访问
  • 对外函数即 UML 中的 public 方法

  • UartDriver_t *drv 是 C 语言模拟的 this 指针


四、关键理解总结(非常重要)

  1. UML 类图表达的是"边界",不是语法

  2. + / - / # 表达的是"谁能用",不是"怎么写"

  3. C 语言完全可以按照 UML 的类图思想来设计模块

  4. 一个设计良好的 C 模块,本质上就是一个 UML 类


补充说明

为什么这种理解很重要?

在嵌入式开发和系统编程中,即使使用 C 语言,我们仍然需要:

  • 模块化设计:清晰的接口边界
  • 封装性:隐藏实现细节
  • 可维护性:通过设计约束减少耦合

UML 类图为我们提供了一种语言无关的设计思维方式,帮助我们在 C 语言中也能实现良好的面向对象设计原则。

实践建议

  1. 设计先行:先画 UML 类图,再写代码
  2. 注释规范:在头文件中标注哪些是公开 API,哪些是内部使用
  3. 命名约定 :使用命名规范来体现模块边界(如 模块名_函数名)
  4. 代码审查:检查是否有违反设计意图的访问行为
相关推荐
前进的李工33 分钟前
Agent 学习笔记 05:系统提示词应该怎么写
笔记·学习·prompt·agent·个人开发·few-shot·ai应用开发
正在走向自律2 小时前
【3/5】人工智能训练师 三级/高级工 考证学习方向:从“独立执行”到“设计、归因与全链条负责”
人工智能·学习·人工智能训练师·注方案设计·数据质控负责人·模型评测与调优辅助·ai训练项目交付
CCIE-Yasuo4 小时前
网络安全-学习数据库-Mysql-2
数据库·学习·mysql
La Pulga4 小时前
【FreeRTOS源码学习笔记】任务切换
单片机·mcu·学习·嵌入式·freertos·实时操作系统
li星野5 小时前
【学习记录】逻辑分析仪完全入门:从品牌方案到采样率、存储深度的核心概念解析
学习
旖旎夜光5 小时前
【C++ 基础入门】类和对象(上):封装、对象模型与 this 指针
开发语言·c++·笔记·学习
WEI_YANG_JU6 小时前
初中数学教学中合作学习的研究与实践
学习
码农小韩6 小时前
FPGA学习(一)——LED点灯与开发流程
学习·fpga开发·入门·环境配置·仿真·点灯
李长渊哦7 小时前
Qoder 自定义子智能体(Subagent)学习笔记
chrome·笔记·学习
代码山河8 小时前
基本类型转换:自动类型转换与强制类型转换
java·学习·架构·教程·面向对象·项目