-
Notifications
You must be signed in to change notification settings - Fork 0
SOLID: Interface Segregation Principle (인터페이스 분리 원칙)
VG edited this page Dec 19, 2020
·
11 revisions
인터페이스를 상속 받았을 때, 자신이 사용하지 않는 메소드는 구현하지 말아야 한다.
다양한 기능을 가지고 있는 한개의 인터페이스보다,
단일 기능을 가지고 있는 여러 인터페이스를 구현하는것이 낫다는 말이다.
public interface IArithmetic
{
float plus(float a, float b);
float minus(float a, float b);
float mul(float a, float b);
float div(float a, float b);
}
public class CalculatorPM : IArithmetic
{
public float plus(float a, float b) {return a + b;}
public float minus(float a, float b) {return a - b;}
public float mul(float a, float b) {Debug.WriteLine("지원하지 않는 함수"); return null;}
public float div(float a, float b) {Debug.WriteLine("지원하지 않는 함수"); return null;}
}
public class CalculatorMD : IArithmetic
{
public float plus(float a, float b) {Debug.WriteLine("지원하지 않는 함수"); return null;}
public float minus(float a, float b) {Debug.WriteLine("지원하지 않는 함수"); return null;}
public float mul(float a, float b) {return a * b;}
public float div(float a, float b) {return a / b;}
}
IArithmetic 인터페이스는 모든 사칙연산 기능을 가지고 있다.
∴IArithmetic를 상속받는 클래스들은 모든 사칙연산 메소드를 구현해야 한다.
그러나,
CalculatorPM 클래스는 덧셈와 뺄셈 만을 지원하고,
CalculatorMD 클래스는 곱셈과 나눗셈 만을 지원한다.
IArithmetic인터페이스를 상속 받는다는 이유로, 지원하지 않는 기능을 구현해야만 하는 상황이 생긴 것이다.🛑ISP위반
그렇다면 어떻게 고쳐야 할까?
public interface IPlus { float plus(float a, float b); }
public interface IMinus { float minus(float a, float b); }
public interface IMul{ float mul(float a, float b); }
public interface IDiv { float div(float a, float b); }
public class CalculatorPM : IPlus, IMinus
{
public float plus(float a, float b) {return a + b;}
public float minus(float a, float b) {return a - b;}
}
public class CalculatorMD : IMul, IDiv
{
public float mul(float a, float b) {return a * b;}
public float div(float a, float b) {return a / b;}
}
각각의 연산 기능을 각각의 인터페이스로 분리하였고,
이렇게 해서, 이칙 연산 클래스가 원하는 기능만 상속, 구현할 수 있게 되었다.
여러 출처를 바탕으로 최대한 오류를 범하지 않도록 작성하였으나, 이 페이지를 작성하는 저 또한 해당 학문을 공부하는 학생입니다.
∴해당 페이지의 정보를 맹신하지 마시길 바랍니다.
-
생성 패턴
-
구조 패턴
- 데코레이터 패턴 (Decorator pattern)
- 어댑터 패턴 (Adapter pattern)
- 퍼사드 패턴 (Facade pattern)
- 프록시 패턴 (Proxy pattern)
- 이터레이터, 컴포지트 패턴 (Iterator, Composite pattern)
-
동작 패턴
- 옵저버 패턴 (Observer pattern)
- 템플릿 메소드 패턴 (Template pattern)
- 커맨드 패턴 (Command pattern)
- 스트래티지 패턴 (Strategy pattern)
- 스테이트 패턴 (State pattern)
-
기타 패턴
- 컴파운드 패턴 (Compound pattern)
- 메소드 체이닝 (Method chaining)
- Dispose 패턴 (Dispose pattern)