سؤال

وأنا أتساءل أي واحد من هذه ستعتبر أنظف أو الأفضل استخدام والسبب في ذلك.

واحد منهم يعرض قائمة باسماء الركاب، والتي تتيح للمستخدم إضافة وإزالة الخ يخفي الآخر القائمة والسماح فقط للمستخدم تعداد لهم وإضافة باستخدام أسلوب خاص.

مثال 1

class Bus
{
    public IEnumerable<Person> Passengers { get { return passengers; } }
    private List<Passengers> passengers;

    public Bus()
    {
        passengers = new List<Passenger>();
    }

    public void AddPassenger(Passenger passenger)
    {
        passengers.Add(passenger);
    }
}

var bus = new Bus1();
bus.AddPassenger(new Passenger());
foreach(var passenger in bus.Passengers)
    Console.WriteLine(passenger);

مثال 2

class Bus
{
    public List<Person> Passengers { get; private set; }

    public Bus()
    {
        Passengers = new List<Passenger>();
    }
}

var bus = new Bus();
bus.Passengers.Add(new Passenger());
foreach(var passenger in bus.Passengers)
    Console.WriteLine(passenger);

ويتم تغليف أفضل والدرجة الأولى وأود أن أقول. وفي هذه الحالة بالضبط، قد يكون النهج الأفضل (منذ ربما يجب عليك التأكد من انها مساحة غادر على متن الحافلة، وما إلى ذلك). ولكن اعتقد قد تكون هناك حالات حيث الدرجة الثانية قد يكون مفيدا أيضا؟ مثل إذا لم الطبقة الرعاية حقا ما يحدث لتلك القائمة طالما لديه واحد. ما رأيك؟

هل كانت مفيدة؟

المحلول

في مثال واحد، فمن الممكن أن تتحور مجموعتك.

والنظر في المسائل التالية:

var passengers = (List<Passenger>)bus.Passengers;

// Now I have control of the list!
passengers.Add(...);
passengers.Remove(...);

لإصلاح هذا، قد تفكر في شيء من هذا القبيل:

class Bus
{
  private List<Passenger> passengers;

  // Never expose the original collection
  public IEnumerable<Passenger> Passengers
  {
     get { return passengers.Select(p => p); }  
  }

  // Or expose the original collection as read only
  public ReadOnlyCollection<Passenger> ReadOnlyPassengers
  {
     get { return passengers.AsReadOnly(); }
  }

  public void AddPassenger(Passenger passenger)
  {
     passengers.Add(passenger);
  }
 }

نصائح أخرى

في معظم الحالات وأود أن تنظر سبيل المثال 2 لتكون مقبولة بشرط أن يكون نوع الأساسي كان للمد و / أو يتعرض شكل من أشكال onAdded / onRemoved الأحداث بحيث الطبقة الداخلية الخاصة بك يمكن أن تستجيب لأية تغييرات على المجموعة.

في قائمة الحالة ليست مناسبة كما لا توجد وسيلة لفئة لمعرفة ما إذا تمت إضافة شيء. وبدلا من ذلك يجب عليك استخدام مجموعة لمجموعة فئة لديها العديد من أعضاء الظاهري (إدراج، حذف، مجموعة، واضح) التي يمكن أن يتم تجاوز الحدث ومشغلات أضاف أن تخطر الطبقة التفاف.

و(أنت أيضا يجب أن تكون على علم أنه يمكن للمستخدمين من فئة تعديل العناصر في القائمة / جمع بدون الفئة الأصل على دراية بها، لذلك تأكد من أنك لا تعتمد على البنود التي يجري دون تغيير - إلا إذا كانت هي غير قابل للتغيير الواضح - أو يمكنك تقديم غرار أحداث onChanged إذا كنت بحاجة إلى)

وتشغيل الأمثلة بك كل منها من خلال FxCop والتي ينبغي أن تعطيك لمحة عن مخاطر تعريض List<T>

وأود أن أقول أنه يأتي كل ذلك إلى الوضع الخاص بك. وأود أن تذهب عادة للخيار 2 كما هو أبسط، <م> إلا لديك سبب تجاري لإضافة ضوابط أكثر صرامة لذلك.

والخيار 2 هو أبسط، ولكن هذا يتيح الفئات الأخرى لإضافة / إزالة عناصر المجموعة، والتي يمكن أن تكون خطيرة.

وأعتقد أن الكشف عن مجريات الأمور الجيدة للنظر في ما تفعل الطرق المجمع. إذا AddPassenger (أو إزالة، أو غيرها) الأسلوب هو ببساطة ترحيل الدعوة إلى جمع، ثم أود أن تذهب للصيغة أبسط. إذا كان لديك للتحقق من عناصر <م> قبل إدراجها، ثم الخيار 1 أمر لا مفر منه في الأساس. إذا كان لديك لتتبع العناصر إدراج / حذف، يمكنك الذهاب في اي من الاتجاهين. مع خيار 2 لديك لتسجيل الأحداث على جمع للحصول على الإخطارات، ومع الخيار 1 لديك لإنشاء مغلفة كل عملية على القائمة التي تريد استخدامها (على سبيل المثال إذا كنت تريد إدراج وكذلك إضافة)، لذا أعتقد ذلك يعتمد.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top