oop - 책임 - 인터페이스 분리 원칙 예제
인터페이스 분리 원리-인터페이스에 프로그램 (4)
솔리드 (SOLID)와 다른 디자인 원리에 대해 읽었습니다. 나는 ISP가 "프로그램이 아닌 인터페이스에 대한 구현"이라고 생각했다. 그러나 이것들이 다른 원리 인 것처럼 보입니까?
차이점이 있습니까?
IWorker 인터페이스 :
public interface IWorker { public void work(); public void eat(); }
개발자 클래스 :
public class Developer implements IWorker { @Override public void work() { // TODO Auto-generated method stub System.out.println("Developer working"); } @Override public void eat() { // TODO Auto-generated method stub System.out.println("developer eating"); } }
로봇 클래스 :
public class Robot implements IWorker { @Override public void work() { // TODO Auto-generated method stub System.out.println("robot is working"); } @Override public void eat() { // TODO Auto-generated method stub throw new UnsupportedOperationException("cannot eat"); } }
더 완벽한 예를 보려면 here .
ISP는 하나의 이산적이고 응집력있는 행동을 나타내는 각 인터페이스의 개념에 중점을 둡니다.
즉, 객체가 수행해야하는 각각의 논리 그룹은 단일 특정 인터페이스에 매핑됩니다. 클래스는 여러 가지 작업을 수행하려고 할 수 있지만 각 작업은 해당 동작을 나타내는 특정 인터페이스에 매핑됩니다. 아이디어는 각 인터페이스가 매우 집중되어 있습니다.
로버트 마틴 (Robert Martin)은 "Java 프로그래머를위한 UML"이라는 책에서 인터페이스 분리 원리 (Interface Separation Principle, ISP)에 대해 아주 잘 설명하고있다. 이를 바탕으로, 나는 ISP가 하나의 논리적이고 일관된 일들에 초점을 맞추고 있다고 생각하지 않는다. 왜냐하면, 그것은 말도하지 않습니다. 또는, 적어도 그것은 말없이 가야한다. 각 클래스, 인터페이스 또는 추상 클래스는 그렇게 설계되어야합니다.
그렇다면 ISP는 무엇입니까? 예를 들어 설명해 드리겠습니다. 클래스 A는 클래스 A의 클라이언트이고 클래스 B는 클래스 A의 클라이언트입니다. 클래스 A에는 10 개의 메소드가 있으며 그 중 두 개만 B에서 사용합니다. 이제 B는 A의 10 가지 메소드 모두에 대해 알아야합니다. ? 아마 정보 숨기기의 원칙이 아닙니다. 더 많이 노출할수록 더 많은 커플 링 기회를 창출 할 수 있습니다. 따라서 두 클래스 (분리) 사이에 인터페이스를 삽입 할 수 있습니다 (C). 이 인터페이스는 B가 사용하는 두 가지 메소드 만 선언 할 것이고 B는 A에 직접 의존하지 않고 그 인터페이스에 의존 할 것이다.
그래서 지금,
class A {
method1()
method2()
// more methods
method10()
}
class B {
A a = new A()
}
될 것입니다
interface C {
method1()
method2()
}
class A implements C{
method1()
method2()
// more methods
method10()
}
class B {
C c = new A()
}
이것은 B가해야 할 것보다 더 많이 알지 못하게합니다.
위의 두 대답에 모두 동의하십시오. 위의 TrueWill 의 코드 냄새의 예제를 제공하기 위해 다음을 수행해서는 안됩니다.
@Override
public void foo() {
//Not used: just needed to implement interface
}