c# - شرح - هو منشئات التعشيش(أو أساليب المصنع) جيدة ، أو يجب على كل عمل init بأكمله



ui design c# (2)

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

MyClass( arg1 ) { 
    _arg1 = arg1; 
    _otherField = true; 
    _color="Blue" 
}
MyClass( arg1, arg2) : this(arg1) { 
    _arg2 = arg2  
}
MyClass( arg1, arg2, arg3) : this(arg1, ar2) { 
    _arg3 = arg3; 
}

أو مع طرق المصنع:

static NewInstance(arg1 ) { 
   _arg1 = arg1;       
}
static NewInstance(arg1, arg2) {
   f = NewInstance(arg1);
   f._arg2 = arg2;
}
//... and so on

أستطيع أن أرى بعض العيوب على كلا الجانبين

  • يخفي التعشيش ما يقوم به المنشئ
  • لا تداخل التكرار كل وظيفة

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

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

https://code.i-harness.com


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

public Foo(int x, int y)
{
    this.x = x;
    this.y = y;
    precomputedValue = x * y;
}

private static int DefaultY
{
    get { return DateTime.Now.Minute; }
}

public Foo(int x) : this(x, DefaultY)
{
}

public Foo() : this(1, DefaultY)
{
}

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

public static XmlDocument FromText(string xml)

public static XmlDocument FromFile(string filename)

2016 تحرير : لا يزال في وقت سابق ، C # هو تقليص جذري أو القضاء على دعم السجلات ودعم الدعم منشئ الافتراضية ل C # 7 ، وربما C # 8 أخيرا .

2015 تحرير : كنت قبل ذلك بكثير من الوقت. يقوم C # 6 و C # 7 بإزالة الحاجة إلى المنشئات.

إذا كنت تتطور في .Net 3.5 أوصي أبدا باستخدام الصانعين. الاستثناء الوحيد الذي أتركه لهذا هو إذا كنت تستخدم مُنشئ حقن لحقن التبعية. مع .Net 3.5 قاموا بإنشاء مُبدِلات الكائنات التي تسمح لك بالقيام بها

var myclass = New MyClass { arg1 = "lala", arg2 ="foo" }

سيؤدي ذلك إلى تنشيط الفئة مع القيم المعينة لـ arg1 و arg2 أثناء ترك arg3 كـ

default(typeof(arg3)).