4

予約、既存の予約の変更、および既存の予約のキャンセルを可能にする予約システムがあります。私はインターフェイス分離の原則を調べていましたが、インターフェイスをどれだけ薄くするべきか、単一責任の原則に違反しているかどうか疑問に思っていました。私の最初の設計は次のとおりです。

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

しかし、ある予約システムが予約のためにこれらのメソッドのいずれかを実装する必要がなく、たとえば予約にのみ関心がある場合はどうなるか考えたので、次のようにしました。

interface IBook
{
     void Book();
}


interface IModify
{
    void Modify();
}

interface ICancel
{
    void Cancel();
}

今、私はこのようなことができます:

interface IReservation : IBooking
{


}

また

interface IReservation : IBooking, IModify
{


}

だから問題は、このように間引いて遠くまで持っていくのかということになります。また、インターフェイスの名前を考えるのが難しくなります。たとえば、IModify や ICancel は好きではありません (これらは IReservation インターフェイスにあるはずのメソッドのように思えます)。インターフェイスに何を入れる必要があり、別のインターフェイス、クラスなどに何を分離する必要があるかをどのように判断しますか...

4

3 に答える 3

5

インターフェイスのスコープを検討する際に考慮しなければならないことが 2 つあります。

  1. IReservationこれらのメンバーを実装するためにすべての人を要求することは理にかなっていますか?
  2. Xmemberなしで memberを参照するのは理にかなっていますYか?

最初のものはあなたがカバーしたものであり、「いいえ」という結論に達しました。ただし、2番目も同様に重要です。何かを「変更可能」であり、他に何もできないと考えるのは理にかなっていますか? そうでない場合は、IReservationIModifiableReservation、またはその他の機能のグループ化を検討してください。

たとえば、 と は密接に関連しているように見えるCancelのでModify、両方を にまとめてIModifiableReservation、クラスにそのインターフェースを実装させたいと思うかもしれません。

あなたが持っているように、それは少し粒度が高すぎるようです。

于 2011-10-21T20:58:54.113 に答える
0

あなたのアプリケーションが本当に異なる種類の予約をサポートする必要があり、後で共通のロジックでそれらすべてを処理できるようにする必要がある場合 - サービスの種類ごとに個別のインターフェースを導入し、予約自体ごとに単一のインターフェースを導入することをお勧めします - 予約は一連のサービスを提供します。したがって、共通のインターフェースによって抽象化されたサービスのリストを公開するだけIReservationServiceで、予約システムごとに複数のインターフェースの実装を取り除くことができます。サービスごとに 1 つのクラスを作成し、Reservation の 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;
       }
    }
}
于 2011-10-21T20:58:14.417 に答える