在SOLID原则中,能否违反SRP而不违反ISP,或反之亦然?
SRP与ISP:仅违反其一的场景
你的理解是准确的:SRP聚焦于类自身的职责单一性,ISP聚焦于客户端视角的接口最小化。确实存在仅违反其中一项原则的情况,下面用具体场景说明:
1. 仅违反SRP,不违反ISP
假设你有一个UserHandler类,它同时负责两个独立职责:
- 处理用户数据库的增删改查(数据持久化职责)
- 生成用户的权限校验令牌(身份认证职责)
现在有两个客户端:
UserAdminPanel只调用该类的数据库操作方法AuthService只调用该类的令牌生成方法
这个UserHandler明显违反了SRP——一个类承担了两个完全独立的职责。但每个客户端都只用到自己需要的方法,没有被强迫依赖不需要的接口/方法,所以完全符合ISP的要求。
2. 仅违反ISP,不违反SRP
定义一个过于宽泛的接口Machine,包含start()、stop()、refuel()三个方法。然后实现一个ElectricCar类,它的唯一职责就是作为电动交通工具运行(完全符合SRP)。
但因为ElectricCar实现了Machine接口,它必须空实现refuel()方法(电动车不需要加油)。此时,任何依赖Machine接口来使用ElectricCar的客户端,都会被迫看到这个完全无用的refuel()方法——这就违反了ISP(客户端被强迫依赖不需要的方法),但ElectricCar本身职责单一,并没有违反SRP。
内容的提问来源于stack exchange,提问作者Jaime Arroyo Morales
相关产品推荐
相关产品推荐

