سؤال

يذكر الناس

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

وحين أوافق قليلا مع هذا البيان أعلاه، لم أجد حقا وسائل فعالة لبناء القوالب التي يمكن القول على سبيل المثال مثيل أنفسهم. في otherwords لا يمكنني أن أعمل:

return new T();

وبالإضافة إلى ذلك، إذا كنت تريد توليد رمز القائمة على قيم قاعدة البيانات ولقد وجدت أن استخدام Microsoft.SqlServer.Management.SMO بالتزامن مع قوالب T4 كان رائعا في توليد كميات الجماعية من التعليمات البرمجية دون الحاجة إلى نسخ / لصق أو استخدام resharper.

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

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

ما هي الطريقة أكثر ملائمة للتعامل مع سيناريوهات حيث كنت في حاجة الى كمية كبيرة من المرونة؟ يا وكمكافأة على هذا السؤال، ما هي موارد جيدة على C # و الوراثة؟

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

المحلول

ويمكنك القيام T جديد ()؛ إذا قمت بذلك

public class Meh<T>
  where T : new()
{
  public static T CreateOne()
  {
    return new T();
  }
}

وأما بالنسبة للرمز المولدات الكهربائية. يمكنني استخدام واحدة كل يوم دون أي مشاكل. أنا باستخدام واحد الآن في الواقع: -)

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

وأما بالنسبة لمصدر جيد على الأدوية. وقد حصلت على أفضل أن يكون كتاب جون السكيت في بالطبع! : -)

نصائح أخرى

وكما المنشئ من T4، لقد كان للدفاع عن هذا السؤال مرات قليلة جدا كما يمكنك أن تتخيل: -)

واعتقادي هو أنه في جيل وسعها code عبارة عن خطوة على الطريق لإنتاج القيمة المعادلة باستخدام مكتبات قابلة لإعادة الاستخدام.

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

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

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

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

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

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

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

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

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

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

وربما يكون قاسيا بعض الشيء، ولكن بالنسبة لي رمز جيل الروائح.

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

وأما فيما يتعلق الوراثة ... لا ليس لدي الكثير من القضايا معه. الشيء الوحيد الذي حاليا لا يعمل يقول أن

List<Animal> a = new List<Animal>();
List<object> o = a;

ولكن حتى هذا لن يكون ممكنا في الإصدار التالي من C #.

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

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

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

وهكذا، وأنا أبكي، لكنني استخدامها، لأن لدي ل.

ولقد استعملت T4 لتوليد رمز وأيضا الوراثة. كلاهما جيد، ولها مزاياها وعيوبها، ومناسبة لأغراض مختلفة.

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

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

وفيما يتعلق ب "العودة T جديد ()؛"، وأنا استخدم أساليب الديناميكية مثل هذا:

public class ObjectCreateMethod
    {
    delegate object MethodInvoker();
    MethodInvoker methodHandler = null;

    public ObjectCreateMethod(Type type)
    {
        CreateMethod(type.GetConstructor(Type.EmptyTypes));
    }

    public ObjectCreateMethod(ConstructorInfo target)
    {
        CreateMethod(target);
    }

    void CreateMethod(ConstructorInfo target)
    {
        DynamicMethod dynamic = new DynamicMethod(string.Empty,
                    typeof(object),
                    new Type[0],
                    target.DeclaringType);
        ILGenerator il = dynamic.GetILGenerator();
        il.DeclareLocal(target.DeclaringType);
        il.Emit(OpCodes.Newobj, target);
        il.Emit(OpCodes.Stloc_0);
        il.Emit(OpCodes.Ldloc_0);
        il.Emit(OpCodes.Ret);

        methodHandler = (MethodInvoker)dynamic.CreateDelegate(typeof(MethodInvoker));
    }

    public object CreateInstance()
    {
        return methodHandler();
    }
}

وبعد ذلك، وأنا أسميها مثل هذا:

ObjectCreateMethod _MetodoDinamico = new ObjectCreateMethod(info.PropertyType);
object _nuevaEntidad = _MetodoDinamico.CreateInstance();

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

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

يمكن اعتبار

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

وعلى سبيل المثال، في حين قيل هنا أن "الأجسام التي لا تزال قائمة لا يمكن تعميمها"، سيكون من الأفضل أن نفكر في الأمر على النحو "الكائنات في C # أن تستمر بياناتها تلقائيا لا يمكن تعميمها في C #"، ل أنا بالتأكيد يمكن في بيثون من خلال استخدام أساليب مختلفة.

ويمكن، مع ذلك، أن يحتذى النهج بيثون في اللغات ثابتة من خلال استخدام المشغل [] (METHOD_NAME كسلسلة)، التي إما بإرجاع functor أو سلسلة، اعتمادا على المتطلبات. ومما يؤسف له أن الحل ليس دائما المعمول به، ويمكن إرجاع functor يكون غير مريح.

والنقطة وأنا على صنع هي أن المولدات رمز تشير إلى وجود خلل في اختيار اللغة التي تتم معالجتها من خلال توفير تركيب أكثر ملاءمة <م> المتخصصة لمشكلة محددة في متناول اليد.

ونوع نسخ / لصق الشفرة التي تم إنشاؤها (مثل ORMs جعل) يمكن أيضا أن تكون مفيدة جدا ...

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

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

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

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

.

واقتبس: لم أجد حقا وسائل فعالة لبناء القوالب التي يمكن القول على سبيل المثال مثيل أنفسهم. في otherwords لا يمكنني أن أعمل:

والعودة T جديد ()؛

public abstract class MehBase<TSelf, TParam1, TParam2>
    where TSelf : MehBase<TSelf, TParam1, TParam2>, new()
{
    public static TSelf CreateOne()
    {
        return new TSelf();
    }
}

public class Meh<TParam1, TParam2> : MehBase<Meh<TParam1, TParam2>, TParam1, TParam2>
{
    public void Proof()
    {
        Meh<TParam1, TParam2> instanceOfSelf1 = Meh<TParam1, TParam2>.CreateOne();
        Meh<int, string> instanceOfSelf2 = Meh<int, string>.CreateOne();
    }
} 

والجيل المدونة، مثل الوراثة، والقوالب، وغيرها من الاختصارات، هو أداة قوية. وكما هو الحال مع معظم أدوات قوية، وتضخيم capaility المستخدم من أجل الخير والشر - لا يمكن فصل

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

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

لماذا لا تكون قادرة على نسخ / لصق حقا، حقا بسرعة، وجعلها أكثر قبولا أي؟

وهذا هو المبرر الوحيد لتوليد التعليمات البرمجية التي أستطيع أن أرى.

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

وحتى لو كان يعمل في الوقت الصفر، فإنه لا يزال ينفخ التعليمات البرمجية.

وأنا تدحرجت بلدي الطبقة الوصول إلى البيانات. فهو يعرف كل شيء عن الاتصالات، والمعاملات، وتخزينها parms الإجراء، الخ، الخ، وكان لي فقط لكتابة كل الاشياء ADO.NET مرة واحدة.

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

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