مراجعة الكود في C#: ما يجب التحقق منه وكيفية تقديم الملاحظات
\nمراجعة الكود هي واحدة من أقوى أدوات تحسين جودة الكود. بالنسبة لمطوري C# المبتدئين، غالبًا ما تبدو مرهقة: الخوف من انتقاد كودك، أو عدم الوضوح بشأن ما يجب البحث عنه في كود الآخرين. في الواقع، مراجعة الكود الجيدة هي حوار وليست امتحانًا. في هذه المقالة، سنشرح ما يجب الانتباه إليه عند مراجعة كود C# (خاصة في نظام .NET البيئي) وكيفية صياغة الملاحظات بحيث تكون مفيدة وليست مسيئة.
\n\n1. ما يجب التحقق منه في كود C#: قائمة مراجعة للمراجع
\nعندما تفتح طلب سحب (PR) لزميل، تتشتت عيناك. لتجنب الغرق في التفاصيل، استخدم نهجًا منهجيًا. إليك المجالات الرئيسية التي يجب التحقق منها في أي مشروع C#.
\n\n1.1. البنية وقابلية القراءة
\nأولاً، قم بتقييم الصورة العامة. أجب على الأسئلة:
\n- \n
- هل يحل هذا الكود المهمة المطلوبة؟ \n
- هل يكرر منطقًا موجودًا (مبدأ DRY)؟ \n
- هل أسماء الفئات والطرق والمتغيرات واضحة؟ \n
سيء:
\npublic void DoStuff(int a, int b)\n{\n var x = a + b;\n // ... 50 سطرًا آخر\nجيد:
\npublic int CalculateTotalPrice(int basePrice, int taxAmount)\n{\n return basePrice + taxAmount;\n}\nاسم الطريقة والمعاملات يوضحان الغرض منها على الفور. هذا يقلل من العبء المعرفي على القارئ.
\n\n1.2. معالجة الأخطاء وأمان القيم الخالية
\nC# هي لغة ذات نظام أنواع متطور، لكن NullReferenceException مشكلة شائعة. تحقق من:
\n- \n
- هل يتم استخدام فحوصات
null(?.,??,??=)؟ \n - هل هناك معالجة للاستثناءات (try-catch) عند الضرورة؟ \n
- هل تم ابتلاع الاستثناءات في catch فارغ؟ \n
مثال على كود خطير:
\nvar user = GetUserById(id);\nConsole.WriteLine(user.Name); // خطأ إذا كان user == null\nالبديل الآمن:
\nvar user = GetUserById(id);\nConsole.WriteLine(user?.Name ?? "ضيف");\n\n1.3. الأداء و LINQ
\nLINQ مناسب لكنه قد يكون غير فعال. تحقق من:
\n- \n
- هل يتم عمل تمريرات متعددة على المجموعة (مثل
.Where().Select().ToList()على IQueryable)؟ \n - هل يتم استخدام
Any()بدلاً منCount() > 0للتحقق من وجود عناصر؟ \n - هل هناك تحويلات غير ضرورية (
.ToList(),.ToArray()) في منتصف السلسلة؟ \n
سيء:
\nvar list = items.Where(x => x.IsActive).ToList();\nvar first = list.FirstOrDefault();\nأفضل:
\nvar first = items.FirstOrDefault(x => x.IsActive);\n\n1.4. التزامن غير المتزامن و Task
\nفي .NET، التزامن غير المتزامن هو المعيار. انظر إلى:
\n- \n
- هل تم نسيان
awaitقبل الاستدعاء غير المتزامن؟ \n - هل هناك استدعاءات حظر (
.Result,.Wait()) في سياق متزامن؟ \n - هل يتم اتباع الاتفاقية: تنتهي الطرق غير المتزامنة بـ
Async؟ \n
نمط معاكس:
\nvar data = GetDataAsync().Result; // قد يسبب deadlock\nصحيح:
\nvar data = await GetDataAsync();\n\n2. كيفية تقديم الملاحظات: بلطف ولكن بشكل بناء
\nحتى قائمة المراجعة المثالية غير مجدية إذا كانت تعليقاتك تبدو كنقد. إليك بعض القواعد التي ستساعد في جعل مراجعة الكود مفيدة للجميع.
\n\n2.1. استخدم "رسائل الأنا" والأسئلة
\nبدلاً من "لقد كتبت كودًا سيئًا" قل "أعتقد أن هذه الطريقة يمكن تبسيطها. ما رأيك؟".
\nأمثلة على الصياغات:
\n- \n
- "أنا لست متأكدًا من