سؤال

لست متأكدًا مما إذا كان هناك بالفعل تسمية لهذا ، ولكن من أجل هذا السؤال يتيح تحديد مصطلحين: نظير التنفيذ أو متداخل التنفيذ لتوضيح كيفية تنفيذ فئات التجميع في نموذج بيانات يحتوي على العديد من علاقات كيان الوالدين/الطفل.

أستخدم مصطلح الأقران لوصف السيناريو الذي تقوم فيه بتنفيذ فئات التجميع في طبقة النموذج الخاصة بك جنبًا إلى جنب مع فئات الكيان التي تجعلها أقرانهم في واجهة برمجة التطبيقات (API) مثل ذلك:

public class ParentEntity
{
  private ChildEntityCollection children;
}

public class ChildEntity
{
}

public class ChildEntityCollection : ICollection<ChildEntity>
{
}

الميزة الرئيسية هنا هي أنه يمكنك إعادة استخدام فئة التجميع في فصول الكيانات الأخرى التي تحدث لتخزين الأطفال من نفس النوع.

أستخدم المصطلح المتداخل لوصف السيناريو الذي تقوم فيه بتنفيذها كصف متداخل مثل ذلك:

public class ParentEntity
{
  private ChildEntityCollection children;

  public class ChildEntityCollection : ICollection<ChildEntity>
  {
  }
}

public class ChildEntity
{
}

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

لقد لاحظت أن Microsoft تستخدم كل من التعبيرات في مختلف الأطر. يبدو أن مساحة اسم System.Windows.forms تعتمد اعتمادًا كبيرًا على التطبيقات المتداخلة. أميل إلى العثور على نفسي أفضّل هذه الطريقة أيضًا على الرغم من أنها تتطلب المزيد من العمل.

التوصيات والتعليقات والأفكار البديلة؟

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

المحلول

بغض النظر عما قد تفعله Microsoft في الماضي ، فإن إرشادات تصميم API الحالية .NET تثبط إنشاء فئات متداخلة مرئية خارج فئات الوالدين. يرى http://msdn.microsoft.com/en-us/library/ms229027.aspx للتفاصيل.

نصائح أخرى

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

public class Child
{
  public class Collection : ICollection<Child>
  {
  }
}

public class Parent
{
  private Child.Collection children;
}

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

يمكن أن يؤدي الإعداد المتداخل أيضًا إلى قيادة بعض المطورين إلى إحكام إحكامهم إلى فئة الوالدين.

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

أود فقط استخدام الترتيب المتداخل عندما يكون هناك كيان واحد فقط في نموذج المجال يمكنه احتواء الكيانات الفرعية بشكل منطقي.

وض

  class PieceOfMail { } 
  class MailPieces: Collection<PieceOfMail> { }

بعد ذلك ، يمكن لفئة ShipingCompany ، وفئة صندوق البريد ، وفئة Postoffice ، وفئة Mailroute ، وفئة Mailmanbag ، أن تحتوي جميعًا على خاصية مكونة تم كتابتها كقاعات بريد ، لذلك سأستخدم تقنية "نظير".

لكن OTOH ، في نفس المجال ، إذا كان لديك فئة تمثل نوعًا من postagediscount ، وفئة تجميع تمثل مجموعة من الخصومات التي سيتم تطبيقها على الشحنة ، فقد يكون الأمر كذلك أن فئة الشحنة يمكن أن تحتوي على مجموعة منطقية تحتوي على مجموعة منطقية من تلك الخصومات ، ثم سأستخدم التقنية المتداخلة ...

هل تحتاج حقًا إلى childentitycollection؟ لماذا لا تستخدم نوع التجميع الذي يتم توفيره؟

  //why bother?
//public class ChildEntityCollection : ICollection<ChildEntity>{}

public class ParentEntity
{
   //choose one
  private ChildEntity[] children;
  private List<ChildEntity> childrenInList;
  private HashSet<ChildEntity> childrenInHashSet;
  private Dictionary<int, ChildEntity> childrenInDictionary;
   // or if you want to make your own, make it generic
  private Balloon<ChildEntity> childrenInBalloon;
}
public class ChildEntity
{
}

أحاول عمومًا تجنب إنشاء فصول تجميع محددة. في بعض الأحيان قد تحتاج إلى فصل خاص ، ولكن في كثير من الحالات يمكنك ببساطة استخدام فئات عامة مثل Collection<T> و ReadOnlyCollection<T> من System.Collection.ObjectModel مساحة الاسم. هذا يوفر الكثير من الكتابة. جميع مجموعاتك مستمدة من IEnumerable<T> وما إلى ذلك ويتم دمجها بسهولة مع LINQ. اعتمادًا على متطلباتك ، يمكنك أيضًا فضح مجموعاتك مثل ICollection<T> أو واجهة تجميع أخرى ، ثم اترك الفصول ذات المتطلبات المحددة تستخدم مجموعات عامة محسنة للغاية.

public class ParentEntity {

  Collection<ChildEntity> children = new Collection<ChildEntity>();

  public Collection<ChildEntity> Children {
    get {
      return this.children;
    }
  }

}

يمكنك أيضا لف IList<T> مثله:

public class ParentEntity {

  // This collection can be modified inside the class.
  List<ChildEntity> children = new List<ChildEntity>();

  ReadOnlyCollection<ChildEntity> readonlyChildren;

  public ReadOnlyCollection<ChildEntity> Children {
    get {
      return this.readOnlyChildren
        ?? (this.readOnlyChildren =
              new ReadOnlyCollection<ChildEntity>(this.children));
    }
  }

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