2

次のようなメソッドを作成しました。

public TimeSlotList processTimeSlots (DateTime startDT, DateTime endDT, string bookingType, IList<Booking> normalBookings, GCalBookings GCalBookings, List<DateTime> otherApiBookings) {
{

..... common process code ......

    while (utcTimeSlotStart < endDT)
    {

        if (bookingType == "x")
        {
            //process normal bookings using IList<Booking> normalBookings

        }
        else if (bookingType == "y") {

            //process google call bookings using GCalBookings GCalBookings
        }
        else if (bookingType == "z" {

            //process other apibookings using List<DateTime> otherApiBookings

        }

    }

}

そのため、3 つの異なる場所からこれを呼び出しています。毎回異なる予約タイプを渡し、各ケースで処理に関心のある予約と、この予約タイプに使用されていない 2 つの空のオブジェクトを渡します。

予約をすべて同じデータ型にすることはできません。これにより、これが簡単になり、予約の種類ごとに異なる処理が必要になるため、これをどのように改善できるかわかりません。

4

4 に答える 4

3

呼び出しコードを変更できる場合は、共通の基本クラスを使用して、異なる予約プロセッサごとに個別のクラスを作成することをお勧めします。

public abstract class BookingProcessor<TBookings> {
  public TimeSlotList ProcessTimeSlots(DateTime startDT, DateTime endDT, TBookings bookings) {
    // ..... common process code ......
    while (utcTimeSlotStart < endDT) {
      ProcessTimeSlots(utcTimeSlotStart, bookings);
      // ...
    }
  }
  protected abstract ProcessTimeSlots(DateTime utcTimeSlotStart, TBookings bookings);
}

特定の予約処理業者は、次のパターンに従います。

public class NormalBookingsProcessor : BookingProcessor<IList<Booking>> {
  protected override ProcessTimeSlots(DateTime utcTimeSlotStart, IList<Booking> bookings) {
    // process normal bookings using IList<Booking> normalBookings 
  }
}

この方法では、1 つのタイプの予約を処理するコードが他のタイプとは分離されているため、テスト容易性と保守容易性が向上します。

于 2012-06-22T10:30:32.607 に答える
1

3つのデータ構造を予約クラスにします。これらはすべて、インターフェースを持つ共通の親から継承します。

public TimeSlotList processTimeSlots (DateTime startDT, DateTime endDT)

また

同様であるがよりよく説明された答えを参照してくださいhttps://stackoverflow.com/a/11154505/537980

また

3つのルーチンを書く

public TimeSlotList processTimeSlots_Normal (DateTime startDT, DateTime endDT, string bookingType, IList<Booking> normalBookings) {
{
    common_process_code(local_vars);

    //process normal bookings using IList<Booking> normalBookings
}

また

オリジナルをプライベートにし、3つのパブリックラッパーを作成します(これはスケーラビリティが低くなります)。

于 2012-06-22T10:23:30.080 に答える
1

あなたが言った

「すべての予約を同じデータ型に入れることができません」

そして私は「どうして」と言いますか?

最下位レベルでこれらの予約オブジェクトが他のタイプから継承する場合、構成を使用し、それらのオブジェクトを AbstractBooking クラスの 3 つのサブクラス (NormalBooking、GoogleBooking、OtherBooking) のメンバーとして保持します。

この時点で、投稿に基づいてわかっていると思いますが、各サブクラスにカスタム予約コードを含めることができます。

于 2012-06-22T13:32:54.877 に答える
1
// Just do extract method for each booking type processign logic
// also use typed booking type (enum) to leverage switch() conditional flow
// rather than multiple nested if/else

public enum BookingType
{
    X,
    Y,
    Z
}

private void EntryPoint(DateTime startDT, 
    DateTime endDT, 
    string bookingType, 
    IList<Booking> normalBookings, 
    GCalBookings GCalBookings, 
    List<DateTime> otherApiBookings)
{

    // common logic

    BookingType type = (BookingType)Enum.Parse(bookingType.ToUpperInvariant(), typeof(BookingType));

    switch (type)
    {
        case BookingType.X:
            ProcessNormalBookings(startDt, endDt, normalBookings);
            break;
        case BookingType.Y:
            ProcessGcCalBookings(startDt, endDt, GCalBookings);
            break;
        case BookingType.Z:
            ProcessOtherApiBookings(startDt, endDt, otherApiBookings);
            break;
    }
}
于 2012-06-22T10:13:33.750 に答える