2011-10-21 10 views
4

私はあなたが予約を予約し、既存の予約を変更し、既存の予約を取り消すことができる予約システムを持っています。私はInterface Segregation Principleを検討していましたが、私がインターフェースをどのように細くしなければならないのか、私が違反しているのかSingle Responsibility Principleを考えていました。薄いインターフェースと太いインターフェースの間の「細い線」とは何ですか?

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

が、その後私は1つの予約システムならば、予約のためのこれらの方法のいずれかを実装する必要があり、例えば予約とちょうど懸念しているので、私は次のようでしたしないものを、考えた:私のintialデザインされました:

interface IReservation : IBooking 
{ 


} 

または

interface IBook 
{ 
    void Book(); 
} 


interface IModify 
{ 
    void Modify(); 
} 

interface ICancel 
{ 
    void Cancel(); 
} 

今、私はこのような何かを行うことができます

だから私はそれをこれほど薄くして遠くに持っていくことになります。また、IModifyやICancelが好きではないなど、インターフェースの名前を考えるのが難しくなります(IReservationインターフェース上にあるはずのメソッドのように思えます)。インターフェイスに入るべきものと、別のインターフェイス、クラスなどにセグメンテーションされるべきものを決定する方法...

+0

これで遠くに行くのかどうかは分かりません。あなたがこの例を文字通り取るなら - はい。このような場合(小さなもの)のIMOではYAGNIの原則が決まりますが、それが大きくなると他の要因がより重要になります。 – kubal5003

+0

私の限定された答えであなたの質問を台無しにしたくないですが、私は両方のアプローチのために何かを言うことができます。最初のものは、最も直感的で、誰もが始めるでしょう。もう1つは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

私はあなたがIReservationインターフェイスを作成する必要がありますが、IBookableReservationとIModifiableReservationの両方から直接あなたのクラスを継承しない2つのインターフェイスAdam Robinson

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

によって

interface IBookableReservation 
{ 
    void Book(); 
} 

as suggestedを持ってお勧めします。クライアントは、1つまたは両方のインターフェイスを使用できます。

インターフェイスを作成する必要はなく、ただ1つのクラスのパブリックメソッドを複製するだけです。 interfaceが "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'は' mooとして使われる 'FakeFoo'クラスもあるので' IFoo'インターフェースを実装することができます。必ずしもコードの臭いではありません。 –

+0

我々は、(キーワードインタフェースではなく)論理インタフェースに対してテストしており、その論理インタフェースがクラスまたはインタフェースによって提供されるかどうかは関係ありません。ほとんどのmovkingフレームワークは、仮想メソッドのモックをサポートしています。実際には必要ない可能性のあるインタフェースでコードベースを肥大化させないでください。 http://stackoverflow.com/questions/12174304/is-it-recommended-to-mock-concrete-classを参照してください。 –

関連する問題