أنماط التصميم في C# للمتقدمين: من النظرية إلى الكود

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

أنماط التصميم في C# للمتقدمين: من النظرية إلى الكود

\n\n

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

\n\n

1. نمط Visitor (الزائر) — العمل مع التسلسل الهرمي للكائنات

\n\n

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

\n\n

المشكلة

\n

تخيل أن لديك نظامًا لإدارة المستندات يحتوي على فئات TextDocument وSpreadsheet وPresentation. تحتاج إلى إضافة وظيفة التصدير إلى PDF وHTML وXML. بدون نمط Visitor، سيتعين عليك تعديل كل فئة، مما ينتهك مبدأ الفتح/الإغلاق (OCP).

\n\n

التنفيذ في C#

\n
// 1. واجهة العنصر\npublic interface IElement\n{\n    void Accept(IVisitor visitor);\n}\n\n// 2. العناصر الملموسة\npublic class TextDocument : IElement\n{\n    public string Content { get; set; }\n    public void Accept(IVisitor visitor) => visitor.Visit(this);\n}\n\npublic class Spreadsheet : IElement\n{\n    public List<List<string>> Rows { get; set; }\n    public void Accept(IVisitor visitor) => visitor.Visit(this);\n}\n\n// 3. واجهة الزائر\npublic interface IVisitor\n{\n    void Visit(TextDocument doc);\n    void Visit(Spreadsheet sheet);\n}\n\n// 4. زائر ملموس — التصدير إلى HTML\npublic class HtmlExportVisitor : IVisitor\n{\n    public void Visit(TextDocument doc)\n    {\n        Console.WriteLine($"<h1>{doc.Content}</h1>");\n    }\n\n    public void Visit(Spreadsheet sheet)\n    {\n        Console.WriteLine("<table>");\n        foreach (var row in sheet.Rows)\n        {\n            Console.WriteLine("<tr><td>" + string.Join("</td><td>", row) + "</td></tr>");\n        }\n        Console.WriteLine("</table>");\n    }\n}\n\n// الاستخدام\nvar docs = new List<IElement> { new TextDocument { Content = "مرحبًا" }, new Spreadsheet { Rows = new List<List<string>> { new List<string> { "A", "B" } } } };\nvar visitor = new HtmlExportVisitor();\nforeach (var doc in docs) doc.Accept(visitor);
\n\n

الإيجابيات: سهولة إضافة عمليات جديدة دون تعديل الفئات الموجودة. السلبيات: إذا تغير التسلسل الهرمي للعناصر بشكل متكرر، يصبح Visitor غير مريح.

\n\n

2. نمط Strategy (الإستراتيجية) — التبديل الديناميكي للخوارزميات

\n\n

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

\n\n

المشكلة

\n

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

\n\n

التنفيذ في C#

\n
// 1. واجهة الإستراتيجية\npublic interface IShippingStrategy\n{\n    decimal CalculateCost(Order order);\n}\n\n// 2. استراتيجيات ملموسة\npublic class CourierShipping : IShippingStrategy\n{\n    public decimal CalculateCost(Order order) => order.Weight * 5.0m + 100;\n}\n\npublic class PostShipping : IShippingStrategy\n{\n    public decimal CalculateCost(Order order) => order.Weight * 2.0m + 50;\n}\n\npublic class PickupShipping : IShippingStrategy\n{\n    public decimal CalculateCost(Order                

المدونات

توصيات الكتب