Single Responsibility principle : 단일 책임 원칙
Open Close Principle : 개방 폐쇄 원칙
Liscov Substitution Principle : 리스코프 치환 원칙
Interface Sergregation Principle: 인터페이스 분리 원칙
Dependency Inversion Principle : 의존성 역전 원칙
좋은 객체 지향 설계의 5가지 원칙 중 인터페이스 분리 원칙(ISP)에 대해 알아보겠습니다.
Interface Segregation Principle
특정 클라이언트를 위한 인터페이스 여러 개가 범용 인터페이스 하나보다 낫다
기존과 동일하게 마우스로 예시를 들어보도록 하겠습니다.
다른 회사 제품과 다르게 특별한 기능을 넣기 위해 마우스에 특수 키를 적용하여 개발하였습니다.
개발을 위해 마우스 기본 인터페이스는 아래와 같이 구성되어 있습니다.
public interface Mouse {
void moveLeft(); // 마우스 왼쪽 이동
void moveRight(); // 마우스 오른쪽 이동
void moveUp(); // 마우스 위쪽 위동
void moveDown(); // 마우스 아래쪽 이동
void clickLeftButton(); // 마우스 왼쪽 버튼 클릭
void clickRightButton(); // 마우스 오른쪽 버튼 클릭
void moveWheelUp(); // 마우스 휠 스크롤 업
void moveWheelDown(); // 마우스 휠 스크롤 다운
void clickFunctionButton(); // 마우스 특수 키 클릭
}
마우스 기본 인터페이스로 모델 A를 개발하였습니다.
public class ModelA implements Mouse{
@Override
...
}
마우스에 특수키를 적용하여 다른 회사 제품 대비 5% 높은 가격을 책정하여 판매를 시작하였습니다.
높은 가격의 영향인지 매니아층만 마우스를 구매하여, 일반 사용자에게 마우스를 판매하기 위해 특수키를 제거하기로 하였습니다.
public interface Mouse {
...
// void clickFunctionButton(); // 마우스 특수 키 클릭 키 제거
}
마우스 인터페이스를 수정하여 Model B를 개발하였습니다.
public class ModelB implements Mouse{
@Override
...
}
이때 Model A에 문제가 발생하였습니다.
Model B를 위해 마우스 특수 클릭 키를 제거했기 때문입니다.
이 상황이 ISP를 위반한 상황입니다.
Model A, Model B는 마우스 하나에 의존하였기 때문에 Mouse interface가 변경함에 따라 영향을 미치는 상황입니다.
ISP를 지키기 위해 Mouse interface를 아래와 같이 분리합니다.
// 마우스 이동 interface
public interface MouseMove {
void moveLeft(); // 마우스 왼쪽 이동
void moveRight(); // 마우스 오른쪽 이동
void moveUp(); // 마우스 위쪽 위동
void moveDown(); // 마우스 아래쪽 이동
}
// 마우스 클릭 interface
public interface MouseBasicButton {
void clickLeftButton(); // 마우스 왼쪽 버튼 클릭
void clickRightButton(); // 마우스 오른쪽 버튼 클릭
}
// 마우스 wheel interface
public interface MouseWheelButton {
void moveWheelUp(); // 마우스 휠 스크롤 업
void moveWheelDown(); // 마우스 휠 스크롤 다운
}
// 마우스 특수 키 interface
public interface MouseFunctionButton {
void clickFunctionButton(); // 마우스 특수 키 클릭
}
이렇게 분리한 interface를 각 Model에 적용합니다.
public class ModelA implements MouseMove, MouseBasicButton, MouseWheelButton, MouseFunctionButton{
@Override
...
}
public class ModelB implements MouseMove, MouseBasicButton, MouseWheelButton{
@Override
...
}
추후 신규 모델을 개발하더라도 기존 모델에는 영향이 가지 않습니다.
'클린코드' 카테고리의 다른 글
DPI: 의존관계 역전 원칙 (0) | 2023.04.18 |
---|---|
LSP: 리스코프 치환 원칙 (0) | 2023.04.15 |
OCP: 개방 - 폐쇄 원칙 (0) | 2023.04.14 |
SRP: 단일 책임 원칙 (0) | 2023.04.12 |
계층형 아키텍처 (0) | 2023.04.11 |