هل صحيح أن استخدام الميراث بدلا من اسم التعرج في c# ؟

StackOverflow https://stackoverflow.com/questions/147049

  •  02-07-2019
  •  | 
  •  

سؤال

وبعبارة أخرى ، هل من الصحيح استخدام:

public class CustomerList : System.Collections.Generic.List<Customer>
{
    /// supposed to be empty
}

بدلا من:

using CustomerList = System.Collections.Generic.List<Customer>

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

يرجى ملاحظة أن النية في هذه الحالة لن يتم تمديد الفصل فقط إلى إنشاء اسم مستعار.

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

المحلول

لا تفعل ذلك.عندما يقرأ الناس:

List<Customer> 

أنها تفهم على الفور ذلك.عندما قرأت:

CustomerList

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

نصائح أخرى

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

List<Customer> customerList = new List<Customer>();

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

بالإضافة إلى مجرد إعلان واستخدام List<Customer>, في النهاية سوف تحتاج إلى تمرير هذه القائمة إلى شيء آخر.تجنب تمرير الخرسانة List<Customer> وبدلا من تمرير IList<Customer> أو ICollection<Customer> وهذا سيجعل هذه الأساليب أكثر مرونة وأسهل برنامج ضد.

يوم واحد في المستقبل ، إذا كنت حقا في حاجة الى CustomerList جمع الصف ، يمكنك تنفيذ ICollection<Customer> أو IList<Customer> على مواصلة تمر عليه تلك الأساليب دون عليها تغيير أو حتى معرفة أفضل.

في الواقع لا يجب استخدام إما.على النهج الصحيح وفقا إطار المبادئ التوجيهية تصميم هو إما استخدام أو وراثة من النظام.مجموعات.ObjectModel.جمع<T> في واجهات برمجة التطبيقات العامة (القائمة<T> يجب فقط أن تستخدم من أجل تنفيذ الداخلي).

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

هل عودة مجموعة<T> من وجوه نماذج تقديم مستوى عادي الفانيليا جمع API.

هل عودة فئة فرعية من مجموعة<T> من طرازات كائن إلى توفير رفيع المستوى جمع API.

باستخدام الميراث للقيام التعرج/typedefing لديه مشكلة تتطلب منك إعادة تعريف المنشئات ذات الصلة.

لأنه سوف تصبح بسرعة من غير المعقول أن تفعل ذلك في كل مكان ، أنه من الأفضل تجنب ذلك من أجل التناسق الله.

هذا هو واحد من تلك 'ذلك يعتمد على أسئلة.

إذا ما عليك هو فئة جديدة أن يتصرف قائمة من العملاء بالإضافة إلى متطلبات أخرى ثم الميراث هو الطريق.

إذا كنت ترغب فقط في استخدام قائمة من العملاء ثم استخدام متغير.

إذا كنت تحاول إنقاذ على الكتابة ، ثم استخدام هذا الأخير.أنت لن تصل الى أي غريب قضايا الميراث بهذه الطريقة.

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

شخصيا, وأود أن مجرد استخدام List<Customer> ويطلق عليه اليوم.

أنا أساسا أتفق مع إد.إذا كنت لا تحتاج في الواقع إلى توسيع وظائف عامة قائمة بناء, مجرد استخدام قائمة عامة:

List<Customer> customerList = new List<Customer>();

إذا كنت بحاجة إلى توسيع وظائف ثم عادة يمكنك أن تبحث في الميراث.

الاحتمال الثالث هو المكان الذي كنت بحاجة إلى تغيير كبير وظيفة من قائمة عامة بناء ، وفي هذه الحالة قد ترغب ببساطة ترث من IEnumerable.وبذلك جعل فئة صالحة للاستعمال في enumerable العمليات (مثل "foreach") ولكن يسمح لك تماما تعريف كل فئة السلوك.

واحد مبرمج الحفظ على الكتابة من الممكن جدا أن يكون القادم مبرمج صيانة كابوس.أود أن أقول فقط اكتب العامة بشكل صحيح ، كما قال الكثيرون هنا.إنها أنظف و أكثر دقة وصف الكود نية ، وأنها سوف تساعد على الحفاظ مبرمج.(الذين قد تكون أنت ستة أشهر و أربعة مشاريع جديدة على الطريق!)

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