مقدمة: لماذا SOLID هو أساس كتابة كود C# عالي الجودة
التطوير بلغة C# في بيئة .NET لا يتطلب فقط معرفة بناء الجملة، بل يتطلب أيضًا القدرة على تصميم تطبيقات مرنة وقابلة للصيانة والاختبار. SOLID هو اختصار لخمسة مبادئ أساسية في التصميم كائني التوجه، صاغها روبرت مارتن. تساعد هذه المبادئ المطورين على تجنب التبعيات "الصلبة" وتكرار الكود والمشاكل عند التوسع.
في هذه المقالة، سنشرح كل مبدأ من مبادئ SOLID الخمسة في سياق لغة C#: من النظرية إلى أمثلة الكود الواقعية. ستتعلم كيف أن إعادة الهيكلة وفقًا لـ SOLID تجعل كودك أنظف، وصيانة المشاريع أسهل.
1. Single Responsibility Principle (SRP) — مبدأ المسؤولية الفردية
النظرية
يجب أن يكون للفصل سبب واحد فقط للتغيير. بمعنى آخر، كل فصل مسؤول عن وظيفة واحدة أو منطق عمل واحد. إذا كان الفصل يقوم بأكثر من اللازم، يصبح من الصعب اختباره وتعديله وإعادة استخدامه.
التطبيق: انتهاك SRP
public class OrderProcessor{ public void ProcessOrder(Order order) { // 1. التحقق من صحة الطلب if (order.Total <= 0) throw new Exception("Invalid order"); // 2. الحفظ في قاعدة البيانات using var db = new AppDbContext(); db.Orders.Add(order); db.SaveChanges(); // 3. إرسال إشعار البريد الإلكتروني SmtpClient client = new SmtpClient(); client.Send("admin@shop.com", order.CustomerEmail, "Order confirmed", "Thank you!"); }}هنا، OrderProcessor ينتهك SRP: فهو مسؤول عن التحقق من الصحة، والعمل مع قاعدة البيانات، وإرسال البريد الإلكتروني. تغيير منطق إرسال الإشعارات سيتطلب تعديل هذا الفصل نفسه.
إعادة الهيكلة مع SRP
public class OrderValidator{ public bool Validate(Order order) => order.Total > 0;}
public class OrderRepository{ public void Save(Order order) { using var db = new AppDbContext(); db.Orders.Add(order); db.SaveChanges(); }}
public class EmailService{ public void SendConfirmation(string email) { SmtpClient client = new SmtpClient(); client.Send("admin@shop.com", email, "Order confirmed", "Thank you!"); }}
public class OrderProcessor{ private readonly OrderValidator _validator; private readonly OrderRepository _repository; private readonly EmailService _emailService;
public OrderProcessor(OrderValidator validator, OrderRepository repository, EmailService emailService) { _validator = validator; _repository = repository; _emailService = emailService; }
public void ProcessOrder(Order order) { if (!_validator.Validate(order)) throw new Exception("Invalid order"); _repository.Save(order); _emailService.SendConfirmation(order.CustomerEmail); }}الآن كل فصل لديه منطقة مسؤولية واحدة. هذا يبسط الاختبار والتعديل.
2. Open/Closed Principle (OCP) — مبدأ الانفتاح/الإغلاق
النظرية
يجب أن تكون الكيانات البرمجية (الفصول، الوحدات، الدوال) مفتوحة للتمديد ولكن مغلقة للتعديل. أي يجب أن تكون قادرًا على إضافة وظائف جديدة دون تغيير الكود الموجود.
التطبيق: انتهاك OCP
public class ShapeDrawer{ public void DrawShape(object shape) { if (shape is Circle circle) Console.WriteLine($"Drawing circle with radius {circle.Radius}"); else if (shape is Rectangle rect) Console.WriteLine($"Drawing rectangle {rect.Width}x{rect.Height}"); // عند إضافة نوع جديد من الأشكال — يجب تعديل هذه الدالة! }}إعادة الهيكلة مع OCP عبر التجريد
public abstract c