مقدمة: لماذا يثير كودك حنق الخبير؟
\n\nلقد أرسلت طلب السحب. مرت خمس دقائق. تصل رسالة في الدردشة: "هل نعيد كتابة هذه الكتلة؟" وعشرات التعليقات تحت كل سطر ثانٍ. هل هذا مألوف؟ إذا كنت تكتب بلغة C# وتعمل ضمن فريق، فإن مراجعة الكود ليست مجرد علامة في Jira. إنها لحظة الحقيقة.
\n\nلقد جمعت الملاحظات النموذجية التي يتركها الخبراء في مراجعة كود C#. الأمر لا يتعلق بالصياغة - بل بالتفكير. يتعلق بكيفية تحويل "الكود الذي يعمل فقط" إلى كود لا ترغب في إعادة كتابته في أول جمعة.
\n\nلنبدأ في تحليل الأنماط المضادة في C# التي تثير حنق حتى أكثر قادة الفرق هدوءًا.
\n\n1. الأرقام والنصوص السحرية: "ماذا يعني هذا؟"
\n\nالتعليق الأكثر شيوعًا في مراجعة كود C# هو سؤال عن الأرقام. تكتب if (status == 3)، ويسأل الخبير فورًا: "ما هذا الرقم 3؟ هل هي حالة "قيد المعالجة" أم "محذوف"؟".
سيء:
\nif (order.Status == 3 && days > 7)\n{\n CancelOrder(order);\n}\n\n\nجيد:
\nprivate const int OrderStatusCancelled = 3;\nprivate const int MaxDaysBeforeAutoCancel = 7;\n\nif (order.Status == OrderStatusCancelled && days > MaxDaysBeforeAutoCancel)\n{\n CancelOrder(order);\n}\n\n\nوالأفضل من ذلك هو استخدام enum. الخبراء يعشقون الكود القابل للقراءة حيث لا تحتاج للرجوع إلى قاعدة البيانات لفهم منطق الأعمال. هذه قاعدة أساسية في مراجعة كود C#: يجب أن يتحدث الكود عن نفسه.
\n\n2. Async void - القاتل الصامت للتطبيقات
\n\nإذا كنت تكتب async void في أي مكان غير معالجات الأحداث (مثل WPF أو WinForms)، فاستعد لخصم كبير. لا يمكن تتبع Async void - فالاستثناء سيسقط في الفراغ ويوقف العملية.
سيء:
\npublic async void LoadData()\n{\n var data = await _repository.GetDataAsync();\n // إذا حدث خطأ هنا - سيسقط التطبيق دون رسالة خطأ\n}\n\n\nجيد:
\npublic async Task LoadDataAsync()\n{\n var data = await _repository.GetDataAsync();\n}\n\n\nفي مراجعة كود C#، سيشير الخبير بالتأكيد إلى هذه النقطة. تذكر: async Task هو صديقك، async void هو عدوك (باستثناء الأحداث).
3. فئات جودزيلا: مبدأ المسؤولية الواحدة
\n\nتفتح ملفًا وتجد 2000 سطر. فئة واحدة تفعل كل شيء: تصل إلى قاعدة البيانات، ترسل البريد الإلكتروني، تنشئ التقارير، وحتى تحضر القهوة. هذا هو النمط المضاد الكلاسيكي في C# - الكائن العملاق.
\n\nسيقول الخبير في مراجعة كود C#: "لنقسمها إلى عدة فئات". وسيكون على حق.
\n\nمثال على المخالفة:
\npublic class OrderService\n{\n public void ProcessOrder(Order order)\n {\n // 1. التحقق\n // 2. الحفظ في قاعدة البيانات\n // 3. إرسال البريد الإلكتروني\n // 4. التسجيل\n }\n}\n\n\nكيف يجب أن يكون:
\npublic class OrderProcessor\n{\n private readonly IOrderValidator _validator;\n private readonly IOrderRepository _repository;\n private readonly INotificationService _notificationService;\n\n public OrderProcessor(\n IOrderValidator validator,\n IOrderRepository repository,\n INotificationService notificationService)\n {\n _validator = validator;\n _repository = repository;\n _notificationService = notificationService;\n }\n\n public async Task ProcessOrderAsync(Order order)\n {\n _validator.Validate(order);\n await _repository.SaveAsync(order);\n await _notificationService.SendConfirmationAsync(order);\n }\n}\n\n\nهذا ليس مجرد "جميل". إنه قابل للاختبار. يمكنك محاكاة المستودع والتحقق فقط من منطق المعالجة. إعادة هيكلة C# بهذا الأسلوب أمر لا بد منه لأي مشروع.
\n\n4. الاستثناءات كهياكل تحكم
\n\n