Clean Code في C#: المبادئ والأمثلة العملية
الكود النظيف (Clean Code) ليس مجرد مصطلح عصري، بل هو مهارة أساسية للمطور المحترف. في بيئة .NET و C#، حيث تعيش المشاريع لسنوات ويتم صيانتها بواسطة عشرات المبرمجين، تصبح القدرة على كتابة كود مفهوم وسهل التعديل أمرًا بالغ الأهمية. في هذه المقالة، سنشرح المبادئ الأساسية لـ Clean Code فيما يتعلق بـ C# ونستعرض أمثلة محددة لتطبيقها.
لماذا الكود النظيف مهم في C#؟
C# هي لغة كائنية التوجه ومكتوبة بشكل صارم مع نظام بيئي غني. ومع ذلك، يمكن أن تتحول قوتها إلى فوضى إذا لم يتم اتباع الانضباط. يقلل الكود النظيف من عدد الأخطاء، ويسرع من دمج المطورين الجدد، ويقلل من تكلفة الصيانة. كما قال روبرت مارتن: "الطريقة الوحيدة لكتابة الكود بسرعة هي كتابته بشكل جيد".
المبدأ 1: الأسماء المعبرة
يجب أن تكشف أسماء المتغيرات والطرق والفئات عن النية. لا تبخل في الأحرف - فالكود السيئ يتطلب وقتًا أطول للفهم.
مثال سيء
int d; // الوقت منذ التغييرList<int> lst = new List<int>();void Proc(int a, int b) { ... }مثال جيد (Clean Code)
int elapsedTimeInDays;List<int> customerIds = new List<int>();void CalculateDiscount(decimal basePrice, decimal taxRate) { ... }القاعدة: إذا كان الاسم يتطلب تعليقًا، فهذا يعني أنه سيء. استخدم camelCase للمتغيرات و PascalCase للطرق والفئات.
المبدأ 2: الدوال الصغيرة (SRP على مستوى الطرق)
يجب أن تقوم كل دالة بشيء واحد فقط وتقوم به بشكل جيد. إذا كانت الطريقة تحتوي على أكثر من 20-30 سطرًا أو تحتوي على تداخل أكثر من مستويين - فهذه إشارة لإعادة الهيكلة.
مثال سيء: دالة سكين سويسري
public void ProcessOrder(Order order){ // التحقق if (order == null || order.Items.Count == 0) throw new ArgumentException("طلب غير صالح");
// حساب الخصم decimal discount = 0; if (order.Total > 1000) discount = 0.1m; else if (order.Total > 500) discount = 0.05m;
// الحفظ في قاعدة البيانات using var db = new AppDbContext(); db.Orders.Add(order); db.SaveChanges();
// إرسال البريد الإلكتروني SendEmail(order.CustomerEmail, "تم استلام الطلب");}مثال جيد: فصل المسؤوليات
public void ProcessOrder(Order order){ Validate(order); var discount = CalculateDiscount(order.Total); ApplyDiscount(order, discount); SaveOrder(order); SendConfirmationEmail(order);}
private void Validate(Order order){ if (order == null || order.Items.Count == 0) throw new ArgumentException("طلب غير صالح");}
private decimal CalculateDiscount(decimal total){ if (total > 1000) return 0.1m; if (total > 500) return 0.05m; return 0;}
private void SaveOrder(Order order){ using var db = new AppDbContext(); db.Orders.Add(order); db.SaveChanges();}المبدأ 3: تجنب التكرار (DRY)
الكود المتكرر هو أصل الشر. إذا قمت بنسخ كتلة كود أكثر من مرة، فقم باستخراجها إلى طريقة أو فئة.
مثال: تكرار المنطق
// في وحدة تحكم المستخدمينif (user.Role == "Admin" || user.Role == "Manager") GrantAccess();
// في وحدة تحكم التقاريرif (user.Role == "Admin" || user.Role == "Manager") ShowReport();إعادة الهيكلة: تغليف التحقق
public static class UserExtensions{ public static bool HasElevatedPermissions(this User user) { return user.Role == "Admin" || user.Role == "Manager"; }}
// الاستخدامif (user.HasElevatedPermissions()) GrantAccess();