Interface Segregation Principle (ISP; 인터페이스 분리 원칙)
특정 클라이언트를 위한 인터페이스 여러 개가 범용 인터페이스 하나보다 낫다.
위반 사례
이 ATM기는 총 3개의 모듈을 가지고 있는데, 어떤 거래(transaction)에 대해서 입금(Deposit), 출금(Withdrawal), 송금(Transfer) 모듈을 각자 만들었다.
각 모듈은 전문화된 기능을 가지기 위해 분리되었지만, 무언가 이상하다.
입금 거래 모듈은 입금만 하면 되는데, 위 구조와 같다면 코드가 이럴것이다.
publicclassDepositTransactionextendsTransactionimplementsUI { @OverridepublicvoidrequestDepositAmount() {System.out.println("Request deposit"); } @OverridepublicvoidrequestWithdrawalAmount() {thrownewUnsupportedMethodException("Can not withdrawal at Deposit Transaction"); } @OverridepublicvoidrequestTransferAmount() {thrownewUnsupportedMethodException("Can not transfer at Deposit Transaction"); } @Overridepublicvoidexecute() {requestDepositAmount(); }}
publicclassWithdrawalTransactionextendsTransactionimplementsUI { @OverridepublicvoidrequestDepositAmount() {thrownewUnsupportedMethodException("Can not deposit at Withdrawal Transaction"); } @OverridepublicvoidrequestWithdrawalAmount() {System.out.println("Request withdrawal"); } @OverridepublicvoidrequestTransferAmount() {thrownewUnsupportedMethodException("Can not transfer at Withdrawal Transaction"); } @Overridepublicvoidexecute() {requestWithdrawalAmount(); }}
publicclassTransferTransactionextendsTransactionimplementsUI { @OverridepublicvoidrequestDepositAmount() {thrownewUnsupportedMethodException("Can not deposit at Transfer Transaction"); } @OverridepublicvoidrequestWithdrawalAmount() {thrownewUnsupportedMethodException("Can not withdrawal at Transfer Transaction"); } @OverridepublicvoidrequestTransferAmount() {System.out.println("Request transfer"); } @Overridepublicvoidexecute() {requestTransferAmount(); }}
입금 거래 모듈을 개발하는 입장에서, 송금이 되지 않는다는 걸 작성하는 일은 필요하지 않고 옳지 못하다.