نمط أو أوصى ديباكتورينج للطريقة

لقد كتبت طريقة تبدو كالتالي:

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

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

    while (utcTimeSlotStart < endDT)
    {

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

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

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

            //process other apibookings using List otherApiBookings

        }

    }

}

لذلك أنا أتصل بهذا من 3 أماكن مختلفة ، في كل مرة يمر فيها نوع حجز مختلف ، وكل حالة تمر في الحجوزات التي أرغب في معالجتها ، بالإضافة إلى عنصرين فارغين لا يستخدمان لهذا النوع من الحجز.

لا يمكنني الحصول على جميع الحجوزات في نفس نوع البيانات ، الأمر الذي سيجعل ذلك أسهل ويجب أن تتم معالجة كل نوع حجز بشكل مختلف ، لذلك لست متأكدًا من كيفية تحسين ذلك.

0

4 إجابة

أنت قلت

"لا يمكنني الحصول على جميع الحجوزات في نفس نوع البيانات"

وأقول "لماذا لا"؟

إذا كانت هذه الكائنات عند المستوى الأدنى ترث من نوع آخر ثم تستخدم التكوين وتكون هذه الكائنات كأعضاء من ثلاث فئات فرعية لفئة AbstractBooking (NormalBooking و GoogleBooking و OtherBooking).

في هذه المرحلة ، كما أعتقد أنك تعرف بناءً على مشاركتك ، يمكنك الحصول على رمز الحجز المخصص في كل فئة فرعية.

0
وأضاف

إذا كان بإمكانك تغيير رمز الاتصال ، فإنني أقترح إنشاء فئات منفصلة لكل معالج حجز مختلف ، مع فئة أساسية مشتركة:

public abstract class BookingProcessor {
  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> {
  protected override ProcessTimeSlots(DateTime utcTimeSlotStart, IList bookings) {
   //process normal bookings using IList normalBookings 
  }
}

وبهذه الطريقة ، تكون التعليمات البرمجية لمعالجة نوع واحد من الحجز منفصلة عن الأخرى ، وهو أفضل للاختبار وقابلية الصيانة.

0
وأضاف
// 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 normalBookings, 
    GCalBookings GCalBookings, 
    List 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;
    }
}
0
وأضاف

جعل هياكل البيانات الثلاثة في فصول الحجز ، وكلها ترث من أحد الوالدين المشتركين الذي يحتوي على الواجهة:

public TimeSlotList processTimeSlots (DateTime startDT, DateTime endDT)

أو

اطلع على إجابة مشفوعة ولكن أفضل موضحًا https://stackoverflow.com/a/11154505/537980

أو

اكتب 3 الروتين

public TimeSlotList processTimeSlots_Nأوmal (DateTime startDT, DateTime endDT, string bookingType, IList nأوmalBookings) {
{
    common_process_code(local_vars);

    //process nأوmal bookings using IList nأوmalBookings
}

إلخ

أو

make the أوiginal private, and write 3 public wrappers (this is less scalable).

0
وأضاف