oop - 책임 - 인터페이스 분리 원칙 예제




인터페이스 분리 원리-인터페이스에 프로그램 (4)

솔리드 (SOLID)와 다른 디자인 원리에 대해 읽었습니다. 나는 ISP가 "프로그램이 아닌 인터페이스에 대한 구현"이라고 생각했다. 그러나 이것들이 다른 원리 인 것처럼 보입니까?

차이점이 있습니까?


  1. IWorker 인터페이스 :

    public interface IWorker {
        public void work();
        public void eat();
    
    }
    
  2. 개발자 클래스 :

    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");
    
         }
    
    }
    
  3. 로봇 클래스 :

    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
}




isp-principle