2011-10-21 4 views
4

예약을 예약하고, 기존 예약을 수정하고, 기존 예약을 취소 할 수있는 예약 시스템이 있습니다. 인터페이스 분리 원칙을 살펴 봤는데 인터페이스를 얼마나 얇게 만들어야하는지, 그리고 위반 사항이 단일 책임 원칙인지 궁금합니다.얇은 인터페이스와 굵은 인터페이스 사이의 "얇은 선"은 무엇입니까?

interface IReservation 
{ 
    void Book(); 
    void Modify(); 
    void Cancel(); 
} 

하지만 나는 하나의 예약 시스템 경우, 예약을위한 다음 방법 중 하나를 그냥 예를 들어 예약과 우려를 구현할 필요가없는 것, 생각, 그래서 다음을했다 : 내 intial 디자인했다 :

interface IReservation : IBooking 
{ 


} 

또는

:

interface IBook 
{ 
    void Book(); 
} 


interface IModify 
{ 
    void Modify(); 
} 

interface ICancel 
{ 
    void Cancel(); 
} 

지금은 이런 식으로 뭔가를 할 수

그래서 질문은 내가 이것을 이렇게 엷게하는 것으로 가져 간다. 또한 인터페이스 이름을 생각하기가 어려워집니다. 예를 들어, IModify 또는 ICancel (IReservation 인터페이스에 있어야하는 메서드와 비슷합니다)을 좋아하지 않습니다. 인터페이스에 무엇이 들어가야하는지, 다른 인터페이스, 클래스 등으로 세분화되어야하는지 결정하는 방법은 무엇입니까?

+0

당신이 이걸로 멀리 가는지 알기 란 쉽지 않습니다. 이 예제를 문자 그대로 사용한다면 - 그렇습니다. 이런 경우 (작은 것들) YAGNI 원리가 결정되면 IMO가 더 커지면 다른 요인들이 더욱 중요해진다. – kubal5003

+0

제한된 대답으로 질문을 망치고 싶지는 않지만 두 접근법 모두에 대해 말할 수 있습니다. 가장 직관적 인 첫 번째 것은 모두가 시작할 것입니다. 두 번째는 IEnumerable 등의 프레임 워크 수준 인터페이스와 다소 비슷합니다.이 작업은 프레임 워크를 만드는 일회성 작업입니까? – kroonwijk

답변

5

당신은 당신이 당신의 인터페이스의 범위를 볼 때 고려해야 할 두 가지가 있습니다

  1. IReservation마다 이러한 구성원을 구현해야한다고 생각하는 것이 맞습니까?
  2. 회원이없는 X을 참조하는 것이 합리적입니까? Y?

처음은 당신이 다루었으며 "아니오"의 결론에 도달했습니다. 둘째로, 마찬가지로 중요합니다. 다른 것을 할 수 없다면 "수정할 수 있습니다"라고 생각하는 것이 합리적입니까? 그렇지 않은 경우 IReservationIModifiableReservation 또는 기타 기능 그룹화를 고려하십시오.

예를 들어, CancelModify이 서로 가깝기 때문에 IModifiableReservation에 둘을 모두 모은 다음 해당 인터페이스를 구현하도록 할 수 있습니다.

당신이 가지고있는 것처럼, 그것은 너무 세분화 된 것처럼 보입니다.

+0

간단하고 효과적인 답변을 주셔서 감사합니다. – Xaisoft

+0

뚱뚱한 IReservation을 만들 필요는 없지만 세분화 된 다른 IBookableReservation을 추가하십시오. 아래의 답변에 내 생각을 넣었습니다. http://stackoverflow.com/a/16492280/52277 –

0

응용 프로그램이 다른 종류의 예약을 지원해야하고 나중에 일부 공통 논리가 다음을 수행 할 수 있어야합니다. 그들 모두를 처리 - 나는 서비스 유형별로 별도의 인터페이스를 소개하고 예약 자체 당 하나의 인터페이스를 제안하는 것이 좋습니다 - 예약은 서비스 세트를 제공하므로 공통 인터페이스 IReservationService으로 추상화 된 서비스 목록을 공개하고 다중 인터페이스 구현을 제거 할 수 있습니다 각 예약 시스템에 대해 그냥 서비스 당 하나의 클래스를 생성하고 고객의의 ctor를 통해 서비스를 등록 :

var reservationWithBooking = 
    new Reservation(new List<IReservationService { new BookingService() }); 

var reservationWithCancellation = 
    new Reservation(new List<IReservationService { new CancellationService(); }); 

var mixedReservation = 
    new Reservation(new List<IReservationService 
          { 
           new BookingService(), 
           new CancellationService() 
          }); 

인터페이스 :

interface IReservationService 
{  
} 

interface IBookingService : IReservationService 
{ 
    void Book(...); 
} 

interface ICancellationService : IReservationService 
{ 
    void Cancel(...); 
} 

interface IReservation 
{ 
    IEnumerable<IReservationService> Services { get; } 
} 

class Reservation : IReservation 
{ 
    private IList<IReservationService> services; 

    public Reservation(IEnumerable<IReservationService> services) 
    { 
     this.services = new List<IReservationService>(services); 
    } 

    public IEnumerable Services<IReservationService> 
    { 
     get 
     { 
      return this.services; 
     } 
    } 
} 
1

나는 Adam Robinson

interface IModifiableReservation 
{ 
    void Modify(); 
    void Cancel(); 
} 

당신은 IReservation 인터페이스를 만들 필요가 없습니다에 의해 두 개의 인터페이스

interface IBookableReservation 
{ 
    void Book(); 
} 

as suggested를하는 것이 좋습니다,하지만 IBookableReservation 및 IModifiableReservation 모두에서 직접 클래스를 상속한다. 클라이언트는 하나 또는 둘 모두의 인터페이스를 사용할 수 있습니다.

단일 클래스의 공용 메소드를 복제하는 인터페이스를 만들 필요가 없습니다. 인터페이스의 이름이 "I"접두사를 가진 클래스와 동일한 이름 인 경우 코드 냄새입니다. 이는 1:1 relationship between the interface and the concrete classes that implement임을 나타 내기 때문입니다.

Reused Abstractions Principle (RAP)

하고 위치를 실제 사례를 숨 깁니다 여러 구현을하지 않을 경우 인터페이스를 사용 http://martinfowler.com/bliki/InterfaceImplementationPair.html

이 sync.Furthermore 모든 것을 유지하기 위해 별도의 노력에서보기 복수 구현을 제공하십시오.

+0

'Foo'는 모의 객체로 사용되는'FakeFoo' 클래스가 있기 때문에'IFoo' 인터페이스를 구현할 수 있습니다. 반드시 코드 냄새가 전혀 아닙니다. –

+0

Google은 키워드 인터페이스가 아닌 논리적 인터페이스를 테스트하고 있으며, 논리적 인터페이스가 클래스 또는 인터페이스에서 제공되는지 여부는 중요하지 않습니다. 대부분의 movking 프레임 워크는 가상 메소드의 조롱을 지원합니다. 실제로 필요하지 않은 인터페이스로 코드베이스를 부 풀리지 마십시오. 참조 http://stackoverflow.com/questions/12174304/is-it-recommended-to-mock-concrete-class –

관련 문제