كود نظيف في C#: المبادئ والأمثلة للمبتدئين

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

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

ابدأ الدورة

كود نظيف في C#: الطريق إلى الكود الاحترافي

\n

يحلم كل مطور بكتابة كود لا يعمل فقط، بل يسهل قراءته وصيانته وتوسيعه. مفهوم "الكود النظيف" (Clean Code)، الذي شاعه روبرت مارتن، ليس مجرد مجموعة من القواعد، بل هو فلسفة احترافية. في هذه المقالة، سنشرح المبادئ الأساسية للكود النظيف بلغة C# ومنصة .NET، باستخدام أمثلة بسيطة وواضحة للمبتدئين. ستتعلم كيف تحول الكود "القذر" إلى حل أنيق وموثوق.

\n\n

1. الأسماء المعبرة: الخطوة الأولى نحو النظافة

\n

أهم جزء في الكود النظيف هو التسمية. يجب أن يجيب اسم المتغير أو الدالة أو الفئة أو الواجهة على أسئلة "ما هذا؟" أو "ماذا يفعل؟". الأسماء الجيدة تغنيك عن كتابة التعليقات.

\n\n

أمثلة سيئة وجيدة

\n

تجنب الاختصارات المكونة من حرف واحد (باستثناء عدادات الحلقات) والأسماء المجردة.

\n\n
// سيء: أسماء غير مفهومة\nint d; // elapsed time in days\nList<string> l = new List<string>();\n\npublic void Proc(int x) \n{\n    // ...\n}\n\n// جيد: أسماء معبرة\nint elapsedTimeInDays;\nList<string> customerNames = new List<string>();\n\npublic void ProcessOrder(int orderId)\n{\n    // ...\n}
\n\n

قواعد C#:

\n
    \n
  • الفئات والدوال — PascalCase (مثل OrderService، CalculateTotal).
  • \n
  • المتغيرات المحلية والمعاملات — camelCase (مثل orderId، customerName).
  • \n
  • الواجهات — تبدأ بالحرف I (مثل IRepository).
  • \n
  • تجنب "التدوين المجري" (مثل strName). يجب أن يكون نوع المتغير واضحًا من السياق.
  • \n
\n\n

2. الدوال: صغيرة وتقوم بمهمة واحدة

\n

يجب أن تكون الدالة (أو الطريقة) صغيرة وتؤدي مهمة واحدة فقط (مبدأ المسؤولية الواحدة على مستوى الدوال). إذا كانت الدالة تقوم بعدة مهام، فيجب تقسيمها إلى دوال أصغر.

\n\n

إعادة هيكلة دالة كبيرة

\n

تخيل أننا بحاجة لحفظ طلب وإرسال إشعار. الكود السيء يفعل كل شيء مرة واحدة.

\n\n
// سيء: الدالة تفعل الكثير جدًا\npublic void SaveOrderAndNotify(Order order)\n{\n    // 1. التحقق\n    if (order.Items.Count == 0) throw new Exception("طلب فارغ");\n\n    // 2. الحفظ في قاعدة البيانات (افتراضيًا)\n    Console.WriteLine($"تم حفظ الطلب {order.Id}.");\n\n    // 3. إرسال البريد الإلكتروني\n    Console.WriteLine($"تم إرسال الإشعار إلى {order.CustomerEmail}.");\n}\n\n// جيد: التقسيم إلى دوال صغيرة\npublic void ProcessOrder(Order order)\n{\n    ValidateOrder(order);\n    SaveOrder(order);\n    SendOrderConfirmation(order);\n}\n\nprivate void ValidateOrder(Order order)\n{\n    if (order.Items.Count == 0)\n        throw new InvalidOperationException("لا يمكن معالجة طلب فارغ.");\n}\n\nprivate void SaveOrder(Order order)\n{\n    // منطق الحفظ\n    Console.WriteLine($"تم حفظ الطلب {order.Id}.");\n}\n\nprivate void SendOrderConfirmation(Order order)\n{\n    // منطق الإرسال\n    Console.WriteLine($"تم إرسال الإشعار إلى {order.CustomerEmail}.");\n}
\n\n

نصيحة: حاول أن يكون مستوى التجريد داخل الدالة الواحدة متساويًا. لا تخلط بين العمل مع قاعدة البيانات وتنسيق النص في نفس الدالة.

\n\n

3. إدارة الأخطاء والاستثناءات

\n

الكود النظيف يعالج الأخطاء بشكل متوقع. في C#، يتم استخدام الاستثناءات لذلك. تجنب إرجاع "الأرقام السحرية" (مثل -1) أو null للإشارة إلى خطأ.

\n\n
// سيء: إرجاع null عند الخطأ\npublic User FindUser(int id)\n{\n    if (id <= 0) return null; // ماذا يفعل الكود المستدعي؟\n    // ... بحث\n    return n                

المدونات

توصيات الكتب