سؤال

لقد قرأت عن الأساليب الجزئية في الآونة الأخيرة مواصفات لغة C#, ، لذا فأنا أفهم المبادئ، لكنني أتساءل كيف يستخدمها الناس فعليًا.هل هناك نمط تصميم معين يستفيد من الأساليب الجزئية؟

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

المحلول

تم تقديم الأساليب الجزئية لأسباب مشابهة لسبب وجود الفئات الجزئية في .Net 2.

الفئة الجزئية هي تلك التي يمكن تقسيمها عبر ملفات متعددة - يقوم المترجم ببنائها جميعًا في ملف واحد أثناء تشغيله.

وتتمثل ميزة ذلك في أن Visual Studio يمكنه توفير مصمم رسومي لجزء من الفصل بينما يعمل المبرمجون على الجزء الآخر.

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

  • في .Net 1، تم إنشاء التعليمات البرمجية تلقائيًا في ملف #region حاجز
  • في .Net 2، أصبحت هذه فئات مصممين منفصلة - لا يزال النموذج عبارة عن فئة واحدة، ويتم تقسيمه إلى ملف واحد يتم تحريره بواسطة المطورين وملف واحد بواسطة مصمم النموذج

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

في .Net 3.5 Linq تم تقديمه.يحتوي Linq على مصمم DBML لبناء هياكل البيانات الخاصة بك، والذي يقوم بإنشاء كود تلقائي.

الجزء الإضافي هنا هو ذلك الكود المطلوب لتوفير الأساليب التي قد يرغب المطورون في ملؤها.

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

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

أساليب فارغة لم يتم تحسينها.

لذلك يقوم Linq بإنشاء طرق جزئية فارغة.إذا لم تقم بإنشاء جزء خاص بك لإكمالها، فسيقوم مترجم C# بتحسينها.

حتى تتمكن من القيام بذلك، تعود الطرق الجزئية دائمًا فارغة.

إذا قمت بإنشاء ملف Linq DBML جديد، فسيتم إنشاء فئة جزئية تلقائيًا، مثل

[System.Data.Linq.Mapping.DatabaseAttribute(Name="MyDB")]
public partial class MyDataContext : System.Data.Linq.DataContext
{
    ...

    partial void OnCreated();
    partial void InsertMyTable(MyTable instance);
    partial void UpdateMyTable(MyTable instance);
    partial void DeleteMyTable(MyTable instance);

    ...

ثم في الملف الجزئي الخاص بك يمكنك تمديد هذا:

public partial class MyDataContext
{
    partial void OnCreated() {
        //do something on data context creation
    }
}

إذا لم تقم بتوسيع هذه الأساليب، فسيتم تحسينها على الفور.

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

المثال الذي ذكرته من قبل هو أحد الاحتمالات:

//this code will get optimised out if no body is implemented
partial void DoSomethingIfCompFlag();

#if COMPILER_FLAG
//this code won't exist if the flag is off
partial void DoSomethingIfCompFlag() {
    //your code
}
#endif

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

نصائح أخرى

الطرق الجزئية متشابهة جدًا من حيث المفهوم مع GoF طريقة القالب النمط السلوكي (أنماط التصميم, ، ص325).

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

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

رمز الجيل هو أحد الأسباب الرئيسية لوجودها وأحد الأسباب الرئيسية لاستخدامها.


يحرر:على الرغم من أن هذا الارتباط يتعلق بمعلومات خاصة بـ Visual Basic، إلا أن نفس المبادئ الأساسية ذات صلة بـ C#.

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

إليك أفضل مورد للفصول الجزئية في C#.NET 3.0: http://msdn.microsoft.com/en-us/library/wa80x488(VS.85).aspx

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

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