ISP에서 기사를 읽을 때 ISP에 대해 두 가지 상반되는 정의가있는 것 같습니다.
첫 번째 정의에 따르면 ( 1 , 2 , 3 참조) ISP는 인터페이스를 구현하는 클래스가 필요하지 않은 기능을 구현하도록 강요해서는 안된다고 말합니다. 따라서 뚱뚱한 인터페이스IFat
interface IFat
{
void A();
void B();
void C();
void D();
}
class MyClass: IFat
{ ... }
더 작은 인터페이스로 분할되어야 ISmall_1
하고ISmall_2
interface ISmall_1
{
void A();
void B();
}
interface ISmall_2
{
void C();
void D();
}
class MyClass:ISmall_2
{ ... }
이 방법 때문에 내 MyClass
유일한 방법이 필요 (구현 할 수 D()
및 C()
도에 대한 더미 구현을 제공하도록 강요하지 않고,) A()
, B()
과 C()
:
그러나 두 번째 정의에 따르면 ( 1 , 2 , Nazar Merza의 답변 참조 ) ISP는 MyClient
호출하는 메소드 가 필요하지 않은 MyService
메소드를 인식해서는 안된다고 MyService
말합니다. 즉, 및 MyClient
의 기능 만 필요한 경우 대신C()
D()
class MyService
{
public void A();
public void B();
public void C();
public void D();
}
/*client code*/
MyService service = ...;
service.C();
service.D();
MyService's
메소드를 클라이언트 별 인터페이스 로 분리해야합니다 .
public interface ISmall_1
{
void A();
void B();
}
public interface ISmall_2
{
void C();
void D();
}
class MyService:ISmall_1, ISmall_2
{ ... }
/*client code*/
ISmall_2 service = ...;
service.C();
service.D();
따라서 이전 정의에서 ISP의 목표는 " IFat 인터페이스를 구현하는 클래스의 수명을보다 쉽게 만드는 것 "이고, 후자의 경우 ISP의 목표는 " MyService의 메소드를 호출하는 클라이언트의 삶을 더 쉽게 만드는 것 "입니다.
ISP의 두 가지 정의 중 실제로 올바른 것은 무엇입니까?
@MARJAN VENEMA
1.
따라서 IFat를 더 작은 인터페이스로 분할하려고 할 때 멤버의 응집력에 따라 ISmallinterface를 결정해야하는 방법이 있습니다.
동일한 인터페이스 내에 응집성있는 방법을 사용하는 것이 합리적이지만 ISP 패턴을 사용하면 클라이언트의 요구가 인터페이스의 "응집성"보다 우선한다고 생각했습니다. 다시 말해, ISP를 통해 특정 인터페이스에 필요한 방법을 동일한 인터페이스에 포함시켜야한다고 생각했습니다. 비록 응집력을 위해 해당 인터페이스에 포함되어야하는 방법도 동일한 인터페이스에 포함시켜야합니까?
따라서 전화해야 할 클라이언트가 CutGreens
많았지 만 GrillMeat
ISP 패턴을 준수 하지 않으 려면 두 가지 방법이 응집력이 뛰어나더라도 CutGreens
내부 에만 배치해야 ICook
하지만 내부 에 배치해서는 안됩니다 GrillMeat
!
2.
나는 당신의 혼란이 첫 번째 정의에서 숨겨진 가정에 기인한다고 생각합니다. 구현 클래스는 이미 단일 책임 원칙을 따르고 있습니다.
"SRP를 따르지 않는 클래스를 구현"함으로써 구현하는 클래스 IFat
또는 ISmall_1
/ 를 구현하는 클래스를 참조하고 ISmall_2
있습니까? 구현하는 클래스를 참조한다고 가정 IFat
합니까? 그렇다면 왜 SRP를 아직 따르지 않았다고 가정합니까?
감사