منشئ افتراضي مقابل الحاويات اللجنة الاولمبية الدولية

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

  •  01-07-2019
  •  | 
  •  

سؤال

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

وبعبارة أخرى, ما هو الخطأ بهذا الكود ؟

public class MyClass
{
    private IMyInterface _myInterface;

    public MyClass()
    {
        _myInterface = new DefaultMyInterface();
    }

    public MyClass(IMyInterface myInterface)
    {
        _myInterface = myInterface;
    }
}

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

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

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

المحلول

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

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

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

نصائح أخرى

اختيار الجانب :)

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

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

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

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

فما هي الاستفادة من دي حتى إذا كنت بحاجة إلى تجميع الخطوة ؟ هذا يعيدنا إلى السؤال الأصلي.أستطيع أن أرى المزايا التالية:

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

القلق الوحيد لدي هو (1) إذا كان الافتراضي الخاص بك خدمة التبعية نفسها آخر / الثانوية خدمة التبعية (على الخاص DefaultMyInterface يعتمد على ILogger) و (2) تحتاج إلى عزل أول خدمة التبعية من الثانية (تحتاج إلى اختبار DefaultMyInterface مع كعب ILogger).في هذه الحالة من الواضح سوف تحتاج إلى تفقد الافتراضي "الجديدة DefaultMyInterface" و بدلا من ذلك أحد:(1) النقي حقن التبعية أو (2) خدمة تحديد المواقع أو (3) حاوية.تراكم(جديد DefaultMyInterface());

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

وبالمثل, زوجان المستجيبين عن قلقها إزاء repititiousness.أنا لا أحب repitition سواء ، ولكن إذا كان (1) الافتراضي الخاص بك تنفيذ حقا هو الافتراضي الخاص بك (YAGNI:لم يكن لديك خطط على تغيير الافتراضي) و (2) لا أصدق أول التحذير ذكرت ينطبق (3) يفضلون أبسط كود النهج التي شاركتها ، ثم أنا لا أعتقد أن هذا شكل معين من repitition قضية.

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

بالإضافة إلى تعليقات أخرى, يمكن للمرء أن يجادل الجافة (لا تكرر نفسك) مبدأ في هذه الحالات.إنه redudnant إلى وضع هذا الافتراضية بناء التعليمات البرمجية في كل فئة.كما أنها introducign خاصة التعامل مع الحالة حيث لا تحتاج إلى أي.

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

أو أنا في عداد المفقودين شيئا ؟

سبب واحد قد ترغب في استخدام الحاويات اللجنة الاولمبية الدولية في تسهيل أواخر تكوين البرنامج.

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

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