当前位置: 首页 > news >正文

Dependency inversion principle(DIP依赖倒置原则)

一.what is dependency inversion principle( DIP依赖倒置原则 )

DIP 是指高层模块不应该依赖于低层模块,二者都应该依赖于抽象;抽象不应该依赖于细节,细节应该依赖于抽象。

二.DIP的设计准则

  • 高层模块不应该依赖于低层模块:高层模块(如业务逻辑)不应该直接依赖于低层模块(如芯片SDK)。相反,它们应该依赖于抽象(接口或抽象类)。
  • 抽象不应该依赖具体实现
  • 细节应该依赖于抽象:具体实现(如类或函数)应该依赖于抽象(接口或抽象类),而不是直接依赖于其他具体实现。

三.举例

3.1 设备开关反例

不符合 DIP 的写法(高层switch.c直接依赖低层具体实现light.h),Switch 模块硬编码依赖了具体的 Light 实现,换成风扇、蜂鸣器就得改 Switch 代码。

// light.h / light.c
void Light_On()  { /* 点亮 GPIO */ }
void Light_Off() { /* 熄灭 GPIO */ }// switch.c (高层模块)
#include "light.h"void Switch_Press() {static int state = 0;state = !state;if (state) Light_On();else       Light_Off();
}

3.2 设备开关符合 DIP 的写法

高层(switch.c、switch.h)依赖抽象层(device.h),低层的具体实现(led.c、buzzer.c)也依赖抽象层(device.h)。





device.h(抽象层)

点击查看代码
// device.h   ← 抽象层(接口定义)
#ifndef DEVICE_H
#define DEVICE_Htypedef struct {void (*turn_on)(void);   // 函数指针void (*turn_off)(void);
} DeviceOperations;void Switch_Press(const DeviceOperations* dev);#endif



switch.c(高层模块只依赖抽象)

点击查看代码
// switch.c
#include "device.h"
#include <stdio.h>static int state = 0;void Switch_Press(const DeviceOperations* dev) {state = !state; /*只做演示,实际每个设备都需维护一个状态*/if (state) {printf("Switch: ON → ");dev->turn_on();} else {printf("Switch: OFF → ");dev->turn_off();}
}



led.c(低层模块也依赖抽象)

点击查看代码
// led.c   ← 具体低层实现1
#include <stdio.h>
#include "device.h"static void Led_On(void)  { printf("LED 点亮\n"); }
static void Led_Off(void) { printf("LED 熄灭\n"); }const DeviceOperations LedDevice = {.turn_on  = Led_On,.turn_off = Led_Off
};

buzzer.c

点击查看代码
// buzzer.c   ← 具体低层实现2(可替换)
#include <stdio.h>
#include "device.h"static void Buzzer_On(void)  { printf("蜂鸣器鸣叫\n"); }
static void Buzzer_Off(void) { printf("蜂鸣器静音\n"); }const DeviceOperations BuzzerDevice = {.turn_on  = Buzzer_On,.turn_off = Buzzer_Off
};



main.c(测试代码)

点击查看代码
// main.c
#include "device.h"
#include "switch.c"   // 为了演示,实际项目中用 .h + .c 分离extern const DeviceOperations LedDevice;
extern const DeviceOperations BuzzerDevice;int main(void) {printf("使用 LED 设备:\n");Switch_Press(&LedDevice);Switch_Press(&LedDevice);printf("\n使用 蜂鸣器 设备:\n");Switch_Press(&BuzzerDevice);Switch_Press(&BuzzerDevice);return 0;
}
http://www.jsqmd.com/news/406089/

相关文章:

  • 2026AI大模型学习路线,只看这一篇就够了!大模型应用开发就这么简单!
  • AI教材编写新利器!低查重率保障,高效产出优质教材!
  • 工具落地的核心,是“为人服务”
  • R 环境安装指南
  • ADC的SOC转换
  • 比赛策略
  • 从Hadoop到Spark:大数据描述性分析的平台对比
  • EPWM故障捕获子模块EPMW动作
  • ADC的基本转换原理
  • Mid-Training大模型训练“中场调整”:收藏这份深度解析,小白也能秒懂提升性能的秘诀!
  • 兰亭妙微作品一 一起海带APP设计
  • HTML5 新元素
  • AI写论文大推荐!4款AI论文写作工具,助你轻松应对毕业论文!
  • Web 品质标准
  • API 类别 - 小部件
  • 主导大型互联网公司AI大模型落地三年,我总结了这套AI大模型
  • AI写论文新选择!4款AI论文生成神器,让你的论文写作更高效!
  • 兰亭妙微作品一交大思源安徽应急广播大屏交互优化及界面设计
  • AI写论文大揭秘!这4款AI论文写作工具,写期刊论文超高效!
  • 2026债务优化律所哪家好?负债人亲测避坑指南 - 代码非世界
  • 【2026 最新】nvm无法自动下载低版本的npm解决方法error installing 14.21.3: open C:\Users\lenovo\AppData\Local\Temp
  • 为什么学习AI大模型应用开发? AI大模型应用开发:从入门到精通的体系化学习路线 (2026版)
  • AI写论文首选!这4款强大的AI论文生成工具,快速搞定学术难题!
  • 信用卡逾期3个月,我靠这个方法3天上岸!2026债务优化律所真实选择指南 - 代码非世界
  • Markdown 标题
  • AI写论文的秘密武器!4款AI论文生成工具,开启论文写作新模式!
  • 联考题一则
  • AI写论文不再迷茫!4款AI论文生成工具,开启论文写作新体验!
  • 可验证AI:形式化方法在可控性证明中的应用
  • 2026负债人上岸实测:债务优化律所哪家靠谱?不踩坑指南来了 - 代码非世界