كيف أقوم بإنشاء منشئ في C# لكائن يحتوي على خصائص من أنواع المراجع؟

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

سؤال

لقد بدأت في إنشاء أداة إنشاء حتى أتمكن بسهولة من إنشاء بيانات اختبار لاختبارات الوحدة التي أكتبها.

الهيكل الأساسي للباني هو:

public class MyClassBuilder
{
    public int id = 0; //setting the default value here

    //allows MyClass to be built with a specific id
    public MyClassBuilder WithId(int id)
    {
        this.id = id;
        return this;
    }

    public MyClass Build()
    {
        return new MyClass(id);
    }
}

يصبح استخدام هذا النمط بعد ذلك:

MyClass mc = new MyClassBuilder().WithId(5).Build();

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

public class MyClassBuilder
{
    public int id = 0; //setting the default value here

    //do I construct the default value using a MySecondClassBuilder?
    public MySecondClass mySecondClass;

    //allows MyClass to be built with a specific id
    public MyClassBuilder WithId(int id)
    {
        this.id = id;
        return this;
    }

    public MyClassBuilder WithMySecondClass(MySecondClass mySecondClass)
    {
        this.mySecondClass = mySecondClass;
    }

    public MyClass Build()
    {
        return new MyClass(id);
    }
}

افتراضي هو أنني سأقوم بإنشاء منشئ لـ MySecondClass واستخدم ذلك لإنشاء التنفيذ الافتراضي.

هل يمكن لأي شخص أن يؤكد أن افتراضاتي صحيحة وأنها أفضل الممارسات؟

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

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

المحلول

وكما هو الحال مع معظم الأشياء - ذلك يعتمد

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

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

وأيضا، إذا كنت تريد استنساخ بدلا من نسخ المرجعية، كنت بحاجة لبناء كائن جديد وإسناد ذلك إلى الإشارة.

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

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

نصائح أخرى

بمجرد أن يكون لدي كائن معقد حيث أرغب في استخدام دمية في اختبارات الوحدة، سأتحول عمومًا إلى إطار عمل ساخر/تزييف/عزل.في C#، أفضّل Moq، ولكن هناك العديد منها، مثل Rhino Mocks وTypemock وما إلى ذلك.

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

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

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

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