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

软件设计原则之ISP接口隔离原则

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

核心原则

不应该强迫客户程序依赖它们不用的方法。

场景描述

在大家的认知中,大多数鸟类都有翅膀并可以飞行。但是在奇妙的大自然中总有一些特例,如鸵鸟虽然有翅膀,但是不会飞行。

如果我们设计一个鸟的基类,并含有飞行相关方法,则这类方法将不适用于鸵鸟。

因此一些设计者会喜欢在这类方法中抛出异常或者使用断言的方式来进行处理。

#include <cassert> #include <iostream> class Bird { public: virtual void sleep() = 0; virtual void fly() = 0; }; // 鸽子 class Pigeon : public Bird { public: void sleep() override { std::cout << "The pigeon is sleeping" << '\n'; } void fly() override { std::cout << "The pigeon is flying" << '\n'; } }; // 鸵鸟 class Ostrich : public Bird { public: void sleep() override { std::cout << "The ostrich is sleeping" << '\n'; } void fly() override { std::cout << "The ostrich can not fly" << '\n'; assert(false); } }; int main() { Ostrich bird; bird.sleep(); // 鸵鸟不会飞,不合理 bird.fly(); }

问题暴露

显然,既然方法是存在的,那难免会有不熟悉的开发者去调用它。并且在一些多态接口中,接口内部不知道外部传入的对象是什么,极有可能会去调用这些不合理的函数。

因此我们需要解耦,将各类方法的力度更加细化,不同的对象只去实现它应该并且能够实现的接口。

#include <cassert> #include <iostream> class CanSleep { public: virtual void sleep() = 0; }; class CanFly { public: virtual void fly() = 0; }; // 鸽子 class Pigeon : public CanSleep, public CanFly { public: void sleep() override { std::cout << "The pigeon is sleeping" << '\n'; } void fly() override { std::cout << "The pigeon is flying" << '\n'; } }; // 鸵鸟 class Ostrich : public CanSleep { public: void sleep() override { std::cout << "The ostrich is sleeping" << '\n'; } }; int main() { Ostrich bird; // 只使用,该对象可以使用的方法 bird.sleep(); }
http://www.jsqmd.com/news/794467/

相关文章:

  • 跨平台光标同步工具:技术原理、实现与多屏开发效率优化
  • 3分钟解锁音乐自由:ncmdump音乐格式转换终极指南
  • 为什么SharpShooter成为红队首选?深度剖析其优势与实战价值
  • repobase:基于元数据与声明式配置的代码仓库批量管理工具
  • Cursor AI 编辑器环境配置指南:从入门到精通的自动化配置实践
  • CANN/ge ACL设置Tensor格式
  • 3步实现智能自动化:三月七小助手如何每天为你节省90分钟游戏时间?
  • CANN/asc-devkit ReduceMax API参考
  • ghpm:GitHub仓库依赖管理的轻量级解决方案
  • 海鲜商城购物|基于SprinBoot+vue的海鲜商城系统(源码+数据库+文档)
  • 绝巧弃利之后,ABAP 才回到可升级的常道
  • 医疗设备智能警报系统设计与安全规范
  • 从绝圣弃智到少造机关,老子这一句放进 SAP HANA 开发里,讲的是把聪明收回到模型、数据和执行计划本身
  • StofDoctrineExtensionsBundle的IpTraceable扩展:自动记录用户IP地址的简单实现指南 [特殊字符]
  • AI赋能辅助生殖:深度学习如何革新胚胎评估与妊娠预测
  • 基于STM32HAL库的平衡小车设计(二)--CubeMX配置说明
  • CANN/ops-nn自适应层归一化算子
  • 手把手教你用9款AI工具,30分钟生成20万字计算机论文并自动匹配代码 - 麟书学长
  • 革命性云原生运维平台SREWorks:一站式解决企业运维难题
  • NCM解密工具终极指南:3步解锁网易云音乐加密文件
  • CANN Ascend C uint32转bfloat16函数
  • 5分钟告别百度网盘提取码烦恼:智能获取工具全解析
  • GE模型加载卸载API
  • 终极指南:3步解决Dell G15笔记本过热问题,开源温度控制中心完全解析
  • XUnity.AutoTranslator完全指南:轻松实现Unity游戏实时翻译的终极方案
  • CANN/asc-devkit Reset函数说明
  • CANN/Ascend C SetSkipMsg API
  • 见素抱朴的 SAP UI5 开发之道, 从「绝圣弃智」到少代码、少炫技、少内耗的前端工程
  • Seraphine:英雄联盟玩家的智能数据助手,三步解锁游戏信息优势
  • BepInEx 6.0.0插件框架稳定性修复:从崩溃现象到IL2CPP签名耗尽问题的深度解析