C# 实例解释面向对象编程中的接口隔离原则
在面向对象编程中,SOLID 是五个设计原则的首字母缩写,旨在使软件设计更易于理解、灵活和可维护。这些原则是由美国软件工程师和讲师罗伯特·C·马丁(Robert Cecil Martin)提出的许多原则的子集,在他2000年的论文《设计原则与设计模式》中首次提出。
SOLID 原则包含:
- S:单一功能原则(single-responsibility principle)
- O:开闭原则(open-closed principle)
- L:里氏替换原则(Liskov substitution principle)
- I:接口隔离原则(Interface segregation principle)
- D:依赖反转原则(Dependency inversion principle)
本文我们来介绍接口隔离原则。
接口隔离原则
接口隔离原则(Interface segregation principle,ISP)认为“多个特定用户接口要好于一个宽泛用途的接口”。
它指明用户(client)不应被迫使用对其而言无用的方法或功能。接口隔离原则将庞大臃肿的接口拆分成为更小、更具体的接口,让用户仅需知道他们感兴趣的方法。这种缩小了的接口也被称为角色接口(role interfaces)。接口隔离原则的目的是将系统解耦,从而使其易于重构、更改和重新部署。
C# 示例
糟糕的示范
创建一个包含公司部门的 ICompanyDepartment 接口。
interface ICompanyDepartment
{
public void AdminDepartment();
public void FinanaceDepartment();
public void HRDepartment();
public void ITDepartment();
}
让我们首先为 A 公司实现 ICompanyDepartment 接口,文件名为 ACompany.cs:
class ACompany : ICompanyDepartment
{
public void AdminDepartment()
{
//DO SOMETHING
}
public void FinanaceDepartment()
{
//DO SOMETHING
}
public void HRDepartment()
{
//DO SOMETHING
}
public void ITDepartment()
{
//DO SOMETHING
}
}
假如现在有一个从事制造业的 B 公司,他们没有 IT 部门,而多了一个生产部门,那么上面的实现就有问题了。
如果在接口 ICompanyDepartment 上添加一个 ManufacturingDepartment 生产部门,那我们就不得不在 ACompany 和 BCompany 两个类上都实现该签名。
也就是说,为了使用 ICompanyDepartment 接口,我们不得不在 ACompany 类上实现不必要的 ManufacturingDepartment 方法,在 BCompany 类上实现不必要的 ITDepartment 方法。这明显违反了接口隔离原则。
为了使其符合接口隔离原则,我们需要进行一些修改。
正确的示范
根据接口隔离原则,我们要将 ITDepartment 和 ManufacturingDepartment 方法从接口 ICompanyDepartment 拆分出来,形成两个独立的角色接口:
- IACompanyUniqueFeature
- IBCompanyUniqueFeature
这样我们就拥有了三个接口:
interface ICompanyDepartment
{
public void AdminDepartment();
public void FinanaceDepartment();
public void HRDepartment();
}
interface IACompanyUniqueFeature
{
public void ITDepartment();
}
interface IBCompanyUniqueFeature
{
public void ManufacturingDepartment();
}
类 ACompany 和 BCompany 的实现如下:
class ACompany : ICompanyDepartment, IACompanyUniqueFeature
{
public void AdminDepartment()
{
//DO SOMETHING
}
public void FinanaceDepartment()
{
//DO SOMETHING
}
public void HRDepartment()
{
//DO SOMETHING
}
public void ITDepartment()
{
//DO SOMETHING
}
}
class BCompany : ICompanyDepartment, IBCompanyUniqueFeature
{
public void AdminDepartment()
{
//DO SOMETHING
}
public void FinanaceDepartment()
{
//DO SOMETHING
}
public void HRDepartment()
{
//DO SOMETHING
}
public void ManufacturingDepartment()
{
//DO SOMETHING
}
}
这样,以上的接口设计便遵循了接口隔离原则。
总结
本文我介绍了 SOLID 原则中的接口隔离原则(Interface segregation principle),并通过 C# 代码示例简明地诠释了它的含意和实现,希望对您有所帮助。
作者 : 技术译民
出品 : 技术译站
参考文档:
- https://en.wikipedia.org/wiki/SOLID
- https://www.c-sharpcorner.com/blogs/interface-segregation-principle-in-c-sharp
C# 实例解释面向对象编程中的接口隔离原则的更多相关文章
- C# 实例解释面向对象编程中的单一功能原则
在面向对象编程中,SOLID 是五个设计原则的首字母缩写,旨在使软件设计更易于理解.灵活和可维护.这些原则是由美国软件工程师和讲师罗伯特·C·马丁(Robert Cecil Martin)提出的许多原 ...
- C# 实例解释面向对象编程中的开闭原则
在面向对象编程中,SOLID 是五个设计原则的首字母缩写,旨在使软件设计更易于理解.灵活和可维护.这些原则是由美国软件工程师和讲师罗伯特·C·马丁(Robert Cecil Martin)提出的许多原 ...
- C# 实例解释面向对象编程中的里氏替换原则
在面向对象编程中,SOLID 是五个设计原则的首字母缩写,旨在使软件设计更易于理解.灵活和可维护.这些原则是由美国软件工程师和讲师罗伯特·C·马丁(Robert Cecil Martin)提出的许多原 ...
- C# 实例解释面向对象编程中的依赖反转原则
在面向对象编程中,SOLID 是五个设计原则的首字母缩写,旨在使软件设计更易于理解.灵活和可维护.这些原则是由美国软件工程师和讲师罗伯特·C·马丁(Robert Cecil Martin)提出的许多原 ...
- 设计原则:接口隔离原则(ISP)
接口隔离原则的英文是Interface Segregation Principle,缩写就是ISP.与里氏替换原则一样其定义同样有两种 定义1: Clients should not be force ...
- [.net 面向对象编程基础] (16) 接口
[.net 面向对象编程基础] (16) 接口 关于“接口”一词,跟我们平常看到的电脑的硬件“接口”意义上是差不多的.拿一台电脑来说,我们从外面,可以看到他的USB接口,COM接口等,那么这些接口的目 ...
- C#中面向对象编程中的函数式编程详解
介绍 使用函数式编程来丰富面向对象编程的想法是陈旧的.将函数编程功能添加到面向对象的语言中会带来面向对象编程设计的好处. 一些旧的和不太老的语言,具有函数式编程和面向对象的编程: 例如,Smallta ...
- Dart编程实例 - Dart 面向对象编程
Dart编程实例 - Dart 面向对象编程 class TestClass { void disp() { print("Hello World"); } } void main ...
- 第2章 面向对象的设计原则(SOLID):4_接口隔离原则(ISP)
4. 接口隔离原则(Interface Segregation Principle,ISP) 4.1 定义 (1)使用多个专门的接口,而不使用单一的总接口,即客户端不应该依赖那些它不需要的接口.类间的 ...
随机推荐
- 大一/初学者学C语言前必看!!!(建议收藏)
目录 数据类型 常量.变量 数组 字符串.转义字符 选择语句 循环语句 函数 操作符 结构体 指针 神秘的学习资料基地jq.qq.com/?_wv=1027&k=5kWJsY1z 一.数据类 ...
- XCTF练习题---MISC---misc_pic_again
XCTF练习题---MISC---misc_pic_again flag:hctf{scxdc3tok3yb0ard4g41n~~~} 解题步骤: 1.观察题目,下载附件 2.拿到手是一张图片,直接上 ...
- HTTP协议4.14
测试开发学习笔记 一. Saas software as a service 软件即服务 Platform as a service 平台即服务 单体架构---垂直架构---面向服务架构---微服务架 ...
- CoreWCF 1.0.0 发布,微软正式支持WCF
2022年4月28日,我们达到了一个重要的里程碑,并发布了CoreWCF的1.0.0版本.对Matt Connew (微软WCF团队成员)来说,这是5年前即 2017年1月开始的漫长旅程的结束.Mat ...
- react实战系列 —— 我的仪表盘(bizcharts、antd、moment)
其他章节请看: react实战 系列 My Dashboard 上一篇我们在 spug 项目中模仿"任务计划"模块实现一个类似的一级导航页面("My任务计划") ...
- Springboot 整合 MyBatisPlus[详细过程]
Springboot 整合 MyBatisPlus[详细过程] 提要 这里已经将Springboot环境创建好 这里只是整合MyBatis过程 引入Maven依赖 添加MyBatisPlus启动依赖, ...
- 一文带你读懂zookeeper在大数据生态的应用
一个执着于技术的公众号 一.简述 在一群动物掌管的世界中,动物没有人类聪明的思想,为了保持动物世界的生态平衡,这时,动物管理员-zookeeper诞生了. 打开Apache zookeeper的官网, ...
- DH问题汇总
本节内容主要转载于:弄清楚DL,D-H,CDH problem,CDH assumption,DDH,BDDH,BCDH. DLP(Discrete Logarithm Problem) 在乘法群\( ...
- 微信小程序云开发如何实现微信支付,业务逻辑又怎样才算可靠
今天打了几把永劫无间后,咱们来聊一聊用云开发来开发微信小程序时,如何实现微信支付,并且保证业务逻辑可靠. @ 目录 注册微信支付商户号 小程序关联商户号 业务逻辑 代码实现 注册微信支付商户号 点击& ...
- Linux下切换root用户提示Authentication failure错误的解决方法(亲测有效)
第一种情况可能是root密码输入错误造成的,再仔细检查一遍是否输入错误 第二种是刚安装完,没有设置root用户密码导致的,我的就是最小化安装,就会出现这种小问题 解决办法:sudo passwd 然后 ...