广州企业网站建设推荐摄影展示网站源码

张小明 2026/1/11 6:51:42
广州企业网站建设推荐,摄影展示网站源码,成都网站设计成功柚v米科技,网页系统制作公司接口隔离原则#xff08;Interface Segregation Principle#xff0c;ISP#xff09;强调#xff1a;客户端不应该被迫依赖它不需要的方法。换句话说#xff0c;一个接口#xff08;或抽象类#xff09;应该尽可能小而精#xff0c;不应把不相关的功能塞进同一个接口里…接口隔离原则Interface Segregation PrincipleISP强调客户端不应该被迫依赖它不需要的方法。换句话说一个接口或抽象类应该尽可能小而精不应把不相关的功能塞进同一个接口里让使用者承担无意义的依赖。虽然 Python 是动态语言没有编译期接口强制约束但接口隔离原则在设计类、抽象基类、协议Protocol或者服务边界时依然非常重要。ISP 是 SOLID 原则中最强调“避免臃肿结构”的原则。一、接口隔离原则是什么接口隔离原则的核心思想• 将大型接口拆分为多个小接口• 每个接口只负责一种相对独立的能力• 客户端只依赖它真正用到的能力而不是被迫实现不需要的方法从软件设计角度看接口隔离原则避免“胖接口”fat interface和“万能基类”God Interface让系统更灵活、更易维护、更容易测试也更便于未来演进。Python 虽然没有 interface 关键字但可以用以下方式实现 ISP• 抽象基类ABC使用 abstractmethod 定义多个小型抽象基类• 协议typing.ProtocolPython 3.8 推荐的方式支持结构化子类型• 组合composition使用组合替代大型继承结构• 鸭子类型duck typingPython 特色的最小化接口约束• 函数签名约束通过类型注解和 Callable 定义精确定义的接口二、接口过大的典型问题想象一个多功能设备接口from abc import ABC, abstractmethod class MultiFunctionDevice(ABC): abstractmethod def print(self, text: str): ... abstractmethod def scan(self) - str: ... abstractmethod def fax(self, number: str): ...现在一个简单的家用打印机只能打印不支持扫描和传真class SimplePrinter(MultiFunctionDevice): def print(self, text: str): print(text) def scan(self): raise NotImplementedError(SimplePrinter does not support scanning) def fax(self, number: str): raise NotImplementedError(SimplePrinter does not support fax)问题• SimplePrinter 被迫实现不需要的方法• NotImplementedError 是代码坏味道破坏了接口的抽象性• 当子类数量增多时代码中将充满“空实现”或“异常实现”• 修改基类会影响所有子类即使它们并不需要某些功能• 违反了里氏替换原则因为子类无法完全替代父类这就是典型的接口污染Interface Pollution会导致代码难以维护和扩展。三、遵守 ISP 的正确做法拆分接口将大接口拆分为多个独立的能力接口from abc import ABC, abstractmethod class Printer(ABC): abstractmethod def print(self, text: str): ... class Scanner(ABC): abstractmethod def scan(self) - str: ... class Faxer(ABC): abstractmethod def fax(self, number: str): ...设备按需组合能力class SimplePrinter(Printer): def print(self, text: str): print(text) class AdvancedPrinter(Printer, Scanner): def print(self, text: str): print(f[高级打印] {text}) def scan(self) - str: return 扫描完成 class OfficeMachine(Printer, Scanner, Faxer): def print(self, text: str): print([办公设备打印], text) def scan(self): return [扫描数据] def fax(self, number: str): print(f传真发送至 {number})优势• 类的职责明显接口清晰• 使用者只依赖自己需要的接口• 扩展更灵活支持按需组合• 减少代码冗余和重复实现• 测试更容易只需关注相关功能四、使用 Protocol 的 Pythonic 实现方式Python 3.8 推荐使用 Protocol 定义接口能力这种方式更加灵活和 Pythonic。from typing import Protocol, runtime_checkable runtime_checkableclass Printable(Protocol): def print(self, text: str) - None: ... runtime_checkableclass Scannable(Protocol): def scan(self) - str: ... runtime_checkableclass Faxable(Protocol): def fax(self, number: str) - None: ...客户端只依赖自己需要的接口def send_document_to_printer(device: Printable, text: str): device.print(text) def process_scan(scanner: Scannable) - str: return scanner.scan()无论对象来自哪里只要实现相应方法就能被识别为对应协议class VirtualPrinter: def print(self, text: str): print(f[虚拟打印机] {text}) class SmartPhone: def print(self, text: str): print(f[手机打印] {text}) def scan(self) - str: return [手机扫描] # 使用示例send_document_to_printer(VirtualPrinter(), Hello)send_document_to_printer(SmartPhone(), World) # 类型检查assert isinstance(VirtualPrinter(), Printable)assert isinstance(SmartPhone(), Printable)assert isinstance(SmartPhone(), Scannable)这就是 Python 特色的鸭子类型与 ISP 的完美结合。五、真实工程中的 ISP 场景1大型服务拆分微服务 / 领域驱动设计避免“万能 API”应根据业务能力拆分• UserQueryService用户查询接口• UserManagementService用户管理接口• UserPermissionService用户权限接口客户端按需依赖避免对无关 API 产生耦合。2数据访问层Repository避免“巨型 repository”把读写拆分为独立接口from typing import Protocol, TypeVar, List, Generic T TypeVar(T) class ReadRepository(Protocol, Generic[T]): def get(self, id: str) - T: ... def find_all(self) - List[T]: ... class WriteRepository(Protocol, Generic[T]): def save(self, entity: T) - None: ... def delete(self, id: str) - None: ...应用按需依赖class UserReadRepository(ReadRepository[User]): def get(self, id: str) - User: # 实现查询逻辑 pass def find_all(self) - list[User]: # 实现查询逻辑 pass class UserQueryService: def __init__(self, repo: ReadRepository[User]): self.repo repo3GUI / 前端组件能力拆分不要把所有组件操作都塞进一个控件接口里。“可点击”、“可拖拽”、“可渲染”应该是不同能力。4机器人、硬件驱动能力拆分不同产品型号的能力不同ISP 极为关键class Moveable(Protocol): def move(self, distance: float) - None: ... class Detectable(Protocol): def detect_obstacle(self) - bool: ... class Communicable(Protocol): def send_signal(self, signal: str) - None: ...按型号组合能力class BasicRobot(Moveable): def move(self, distance: float): print(f移动 {distance} 米) class AdvancedRobot(Moveable, Detectable, Communicable): def move(self, distance: float): print(f高级机器人移动 {distance} 米) def detect_obstacle(self) - bool: print(检测障碍物...) return False def send_signal(self, signal: str) - None: print(f发送信号{signal})ISP 在硬件抽象中尤其重要。六、违反 ISP 的坏味道• 类中大量抛出 NotImplementedError 异常• 类过度继承“功能无关”的方法• 客户端被迫依赖“肥胖基类”• 修改基类影响所有子类涟漪效应• 使用者不清楚哪些方法是“必须实现”的• 接口包含多个不相关的职责• 单元测试变得复杂需要模拟不相关的功能当你看到这些现象通常意味着接口拆得不够细。七、遵守 ISP 的设计建议1保持接口尽可能小每个接口只表达一种能力避免“什么都想管”。一个简单的判断标准是能否用一句话清晰描述接口的职责。2优先使用多个小接口而不是一个大接口让客户端按需组合能力而不是被迫依赖全部功能。使用组合而非继承来复用功能。3避免在继承中加入过多职责“越方便越危险”胖接口一旦成型扩散很快。谨慎设计继承层次。4使用组合替代继承组合多个能力比继承一堆“不需要的方法”更灵活、更易维护。# 使用组合class OfficeMachine: def __init__(self, printer: Printer, scanner: Scanner, faxer: Faxer): self.printer printer self.scanner scanner self.faxer faxer def print(self, text: str): self.printer.print(text) def scan(self) - str: return self.scanner.scan() def fax(self, number: str) - None: self.faxer.fax(number)5协议Protocol优先在 Python 中Protocol 是最自然的接口隔离形式支持鸭子类型和结构化子类型。6从客户端角度出发设计接口考虑以下问题• 谁要调用这个接口• 调用者真正需要哪些方法• 有没有方法可以进一步拆分• 不需要的东西不要暴露给调用者。7遵循单一职责原则SRPISP 与 SRP 紧密相关一个接口应该只有一个变化的原因。如果接口需要因多个不同原因而改变就应该拆分它。8使用依赖倒置原则DIP依赖于抽象接口/协议而不是具体实现这自然促进接口的合理设计。 小结如果说里氏替换原则关注继承结构是否“可替换”那么接口隔离原则则关注接口是否“最小化”。ISP 的核心是避免客户端被迫依赖不需要的方法通过将大型接口拆分为专注的小接口来提高代码的灵活性、可维护性和可测试性。在 Python 中结合 Protocol 和鸭子类型可以优雅地实现 ISP创建出清晰、专注的接口设计。遵循 ISP 不仅能减少代码耦合还能使系统在面对需求变化时保持稳定和易于扩展。“点赞有美意赞赏是鼓励”
版权声明:本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

郑州做定制网站的公司哪家好怎么做关注网站

5分钟掌握Typst数学符号:从入门到精通的完整指南 【免费下载链接】typst A new markup-based typesetting system that is powerful and easy to learn. 项目地址: https://gitcode.com/GitHub_Trending/ty/typst 还在为复杂的数学公式排版而烦恼吗&#xff…

张小明 2026/1/10 21:29:17 网站建设

网站开发的四个高级阶段包括教做潮男的网站

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容: 创建一个智能家居语音控制MVP,功能:1. 开灯等基础指令识别;2. 模拟设备状态反馈;3. 场景模式切换(如观影模式&#xff09…

张小明 2026/1/9 0:39:38 网站建设

常州网站公司怎么选制作一个网站的流程

Neovim智能补全:告别手残党,3步打造你的AI编程助手 【免费下载链接】neovim 一个基于 Vim 编辑器的衍生版本,其主要改进和优化方向是提升编辑器的扩展能力和用户使用体验。 项目地址: https://gitcode.com/GitHub_Trending/ne/neovim …

张小明 2026/1/9 0:52:41 网站建设

设计的素材网站有哪些seo工具箱

Windows热键冲突终极解决方案:3分钟快速定位占用快捷键的程序 【免费下载链接】hotkey-detective A small program for investigating stolen hotkeys under Windows 8 项目地址: https://gitcode.com/gh_mirrors/ho/hotkey-detective 还在为快捷键失灵而烦恼…

张小明 2026/1/9 1:12:46 网站建设

网站开发技术入股协议wordpress指针

网上的合作项目,创建自己的分支。确认本地仓库状态(先看当前分支、修改内容):# 查看关联 git remote -v # 查看当前分支 git branch # 查看本地修改(确认要备份的内容) git status # 提交本地所有修改&…

张小明 2026/1/9 14:57:44 网站建设

网站建设要钱吗seo推广联系方式

Blockly Games:编程启蒙的终极指南与学习路径 【免费下载链接】blockly-games Games for tomorrows programmers. 项目地址: https://gitcode.com/gh_mirrors/bl/blockly-games 在当今数字化时代,编程已成为孩子必备的核心技能之一。Blockly Game…

张小明 2026/1/9 2:37:56 网站建设