مقدمة: لماذا الكود النظيف هو مفتاح نجاح المشروع؟
في عالم تطوير البرمجيات على منصة .NET، كتابة كود يعمل هي نصف المهمة فقط. البراعة الحقيقية تظهر في القدرة على إنشاء كود يسهل قراءته وصيانته وتوسيعه. مفهوم Clean Code (الكود النظيف)، الذي شاعه روبرت مارتن، يمثل مجموعة من المبادئ التي تحول البرنامج الفوضوي إلى نظام منظم ومفهوم. بالنسبة لمطور C#، فإن اتباع هذه المبادئ لا يعني فقط احترام الزملاء، بل أيضاً تقليل وقت التصحيح وإضافة الميزات الجديدة بشكل كبير.
في هذه المقالة، سنقوم بتحليل المبادئ الأساسية لـ Clean Code فيما يتعلق بلغة C# وإطار العمل .NET. سترى أمثلة محددة لكود "سيء" و"جيد" ستساعدك على كتابة تطبيقات أفضل جودة.
المبدأ 1: أسماء معبرة وأسلوب موحد
التسمية الصحيحة للمتغيرات والدوال
يجب أن يجيب اسم المتغير أو الكلاس أو الدالة على الأسئلة: "ما هذا؟" أو "ماذا يفعل؟". تجنب الاختصارات المكونة من حرف واحد (باستثناء عدادات الحلقات) والأسماء المجردة مثل data و info و temp.
مثال سيء:
public int Calc(int a, int b) // ما هما a و b؟ ماذا تفعل الدالة؟{ int d = a * b; return d;}مثال جيد (Clean Code):
/// <summary>/// يحسب مساحة المستطيل./// </summary>public int CalculateRectangleArea(int width, int height){ int area = width * height; return area;}التوحيد في الفريق
استخدم camelCase للمتغيرات المحلية والباراميترات، و PascalCase للدوال والكلاسات، و _camelCase للحقول الخاصة (وفقاً لإرشادات .NET الشائعة). هذا يجعل الكود قابلاً للتوقع.
public class OrderService{ private readonly IOrderRepository _orderRepository; // حقل خاص
public async Task<Order> GetOrderByIdAsync(int orderId) // دالة { var order = await _orderRepository.FindAsync(orderId); // متغير محلي return order; }}المبدأ 2: الدوال الصغيرة ومبدأ المسؤولية الواحدة (SRP)
يجب أن تقوم الدالة بشيء واحد فقط
هذا هو أهم مبدأ في Clean Code. إذا كانت الدالة تقوم بعدة إجراءات (تحقق، تسجيل، منطق أعمال، حفظ في قاعدة البيانات)، فمن الصعب اختبارها وتعديلها. قم بتقسيم هذه الدوال إلى دوال أصغر.
مثال سيء (الدالة تفعل كل شيء مرة واحدة):
public void ProcessOrder(Order order){ // 1. التحقق if (order == null || order.TotalAmount <= 0) throw new ArgumentException("Invalid order");
// 2. التسجيل Console.WriteLine($"Processing order {order.Id}");
// 3. منطق الأعمال var discount = order.TotalAmount > 100 ? 0.1m : 0; order.FinalAmount = order.TotalAmount - (order.TotalAmount * discount);
// 4. الحفظ _context.Orders.Add(order); _context.SaveChanges();}مثال جيد (تقسيم إلى دوال):
public void ProcessOrder(Order order){ ValidateOrder(order); LogOrderProcessing(order); ApplyDiscount(order); SaveOrder(order);}
private void ValidateOrder(Order order){ if (order == null || order.TotalAmount <= 0) throw new ArgumentException("Invalid order", nameof(order));}
private void LogOrderProcessing(Order order){ Console.WriteLine($"Processing order {order.Id}");}
private void ApplyDiscount(Order order){ const decimal discountThreshold = 100m; const decimal discountRate = 0.1m;
if (order.TotalAmount > discountThreshold) { order.FinalAmount = order.TotalAmount - (or