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

Interface Segregation Princeple(ISP 接口隔离原则)

一. What is ISP(Interface Segregation Princeple)

接口隔离原则,旨在确保接口的设计是专门化和细粒度的。根据ISP,一个类不应该被迫依赖于它不使用的方法或属性。
换句话说:宁愿拆成很多小接口,也不要搞一个超级大的胖接口。


二.ISP错误举例

1.1 串口温度传感器

非常臃肿的uart驱动接口,违反ISP原则。

// 超级大接口 - 所有模块都必须实现所有函数
typedef struct {void (*init)(void* self);void (*read)(void* self, uint8_t* buf, size_t len);void (*write)(void* self, const uint8_t* buf, size_t len);void (*flush)(void* self);void (*get_status)(void* self);void (*sleep)(void* self);void (*wakeup)(void* self);void (*set_baudrate)(void* self, uint32_t baud);void (*set_parity)(void* self, uint8_t parity);void (*ioctl)(void* self, int cmd, void* arg);   // 万能控制
} uart_ops;   // ← 非常胖的接口

使用时非常尴尬。

// 只想用作只读传感器的模块,却被迫实现一堆无关函数
typedef struct {uart_ops ops;// ...
} temperature_sensor;void temperature_read(void* self, uint8_t* buf, size_t len) { ... }void temperature_init(void* self) { ... }// 下面这些传感器根本不需要,却被迫实现
void temperature_write(...)     { return; }     // 空实现
void temperature_flush(...)     { return; }
void temperature_sleep(...)     { return; }
void temperature_set_baudrate(...) { return; }
void temperature_ioctl(...)     { return; }     // 最痛苦的空实现

1.2 机器人

非常臃肿的worker接口,roboter被迫实现所有函数。

typedef struct {void (*work)(void* self);void (*eat)(void* self);void (*sleep)(void* self);void (*take_break)(void* self);void (*attend_meeting)(void* self);
} worker;   // ← 超级胖void robot_eat(void* self)    { /* 机器人不吃饭 */ }
void robot_sleep(void* self)  { /* 机器人不睡觉 */ }
void robot_take_break(...)    { /* 无意义 */ }

三.ISP正确举例

3.1 串口温度传感器

划分为应用层和驱动层抽象接口, 按需实现。

// ---------- 温度传感器应用层抽象接口 ----------
typedef struct {void (*init)(void* sensor);int  (*read_temperature)(void* sensor, float* temp);void (*deinit)(void* sensor);
} temperature_ops;// ---------- UART驱动层抽象接口 ----------
typedef struct {void (*init)(void* uart);int  (*write)(void* uart, const uint8_t* data, size_t len);int  (*read)(void* uart, uint8_t* buf, size_t len);void (*set_baud)(void* uart, uint32_t baud);
} uart_ops;

3.2 机器人

typedef struct { void (*work)(void*); }          IWorkable;
typedef struct { void (*eat)(void*); }           IEatable;
typedef struct { void (*sleep)(void*); }         ISleepable;
typedef struct { void (*take_break)(void*); }    IBreakable;typedef struct {IWorkable*  workable;// 人类才有的IEatable*   eatable;ISleepable* sleepable;
} Human;typedef struct {IWorkable* workable;// 机器人没有其他接口
} Robot;

3.3 函数指针数组

使用函数指针数组实现接口隔离。

typedef enum {INTERFACE_LIFECYCLE = 0,INTERFACE_READABLE,INTERFACE_WRITABLE,INTERFACE_POWER,INTERFACE_COUNT
} interface_type_e;typedef struct {void* impl;void* vtable[INTERFACE_COUNT];
} interface_provider;

四.ISP和LSP

ISP的目的是把大的臃肿,功能不相关的接口拆成多个小接口,防止"客户端"被迫实现。


LSP的目的是使用组合、去掉不合理的继承关系。例如正方形继承自矩形,但是改width会连带改height;一般的鸟都可以飞,但是鸵鸟继承鸟不会飞,运行出错。


在实际编码中,“写小接口 + 谨慎使用继承” 是同时满足 ISP 和 LSP 最有效的一招。

http://www.jsqmd.com/news/405769/

相关文章:

  • Liskov Substitution Principle(LSP 里氏替换原则)
  • python: Visitor Pattern
  • python+uniapp微信小程序的毕业论文选题系统设计与实现
  • python+uniapp微信小程序的校园外卖点餐点单系统 商家协同过滤
  • 闲置不用的沃尔玛购物卡可以回收变现吗 - 抖抖收
  • 你说 还未解锁,那么“/data/log/“; 为什么这个路径可以?不是还未解锁吗?
  • 白嫖永久免费域名,托管到 CloudFlare
  • 2026年目前比较好的金属探测门品牌找哪家,金属探测门/安检仪/安检设备/智能安检/安检机,金属探测门源头厂家排行榜单 - 品牌推荐师
  • 兑换的京东e卡套装在哪里回收划算? - 抖抖收
  • 超级人工智能(AGI)是否是大模型的必然发展方向?
  • 破解合规与迭代双重难题:研发项目管理系统的全行业适配方案——全星研发管理APQP软件系统
  • 高端制造企业QMS选型指南:QMS系统全方位解读——全星质量管理QMS软件系统推荐
  • 基于单片机的防火防盗报警系统设计方案
  • 用SHAP进行多模型解释性分析:类别与数值预测案例
  • CT断层成像系列09——三维锥束Shepp-Logan头模型设计实现与正向投影实现(附Matlab代码)
  • 2026曝气池清理厂家推荐,专业实力看得见,专业的曝气池清理公司推荐榜深度剖析助力明智之选 - 品牌推荐师
  • Czkawka下载安装完整教程:免费重复文件清理工具(附安装包,2026最新) - xiema
  • 笛卡尔树
  • 外包项目压力山大,XinServer 是我的救命稻草
  • 2026年欧曼增压器市场:直销厂家口碑现状解析,欧宝A14net增压器/福康增压器,增压器厂商排行 - 品牌推荐师
  • [AI提效-30]- 2026年国内OPC社区全景地图
  • 2026污水处理设备指南:口碑佳的品牌推荐,智能一体化污水处理设备/帘式MBR膜,污水处理设备厂家哪家靠谱 - 品牌推荐师
  • P7708 题解
  • 大模型时代交互革命:小白也能秒懂,收藏必备,开启认知新纪元!
  • 保姆级实测!小白5行代码接入谷歌Gemini 3.1 Pro,复杂推理能力翻倍,速收藏!
  • JVM--16-面试题2:请详细描述 JVM 的运行时数据区
  • CF1304C
  • 技术演进中的开发沉思-371:final 关键字(中)
  • 常规正则表达式手册
  • 一款纯VF控制的变频器方案方案说明:可做0.2KW7.5KW/220V,0.2KW75KW/380V