Ningún cliente debe depender de métodos que no usa
Ningún cliente debe verse forzado a depender de métodos que no utiliza. Las interfaces deben ser cohesivas y pequeñas respecto a los roles que los consumidores requieren; una interfaz «gorda» acopla a todos los implementadores a preocupaciones ajenas.
El ISP es el hermano del SRP aplicado a contratos: muchas interfaces específicas suelen mejorar que una general que mezcla responsabilidades ortogonales.
Si obligas a un desarrollador de librería interna a implementar deployToProduction() porque comparte interfaz con el equipo de SRE, introduces métodos vacíos, UnsupportedOperationException o mentiras en el contrato. Mejor modelar roles separados: quien codea, quien revisa PRs, quien tiene guardia.
Una sola interfaz «empleado tech» mezcla implementación de features, revisión de código y guardia on-call.
public interface TechEmployee { void implementFeature(String ticketId); void reviewPullRequest(String prUrl); void acknowledgePagerDutyAlert(String incidentId); } public final class JuniorDeveloper implements TechEmployee { @Override public void implementFeature(String ticketId) { /* … */ } @Override public void reviewPullRequest(String prUrl) { throw new UnsupportedOperationException("aún no reviso PRs"); } @Override public void acknowledgePagerDutyAlert(String incidentId) { throw new UnsupportedOperationException("no estoy en on-call"); } }
El mismo humano puede implementar varios roles; cada consumidor solo pide el rol que necesita.
public interface FeatureContributor { void implementFeature(String ticketId); } public interface CodeReviewer { void reviewPullRequest(String prUrl); } public interface OnCallResponder { void acknowledgeAlert(String incidentId); } public final class JuniorDeveloper implements FeatureContributor { @Override public void implementFeature(String ticketId) { /* … */ } } public final class StaffEngineer implements FeatureContributor, CodeReviewer, OnCallResponder { @Override public void implementFeature(String ticketId) { /* … */ } @Override public void reviewPullRequest(String prUrl) { /* … */ } @Override public void acknowledgeAlert(String incidentId) { /* … */ } }
El servicio de asignación de revisiones depende solo de CodeReviewer; el orquestador de incidentes solo de OnCallResponder. Nadie arrastra métodos fantasma.