مراجعة الكود في لغة C#: ما يجب التحقق منه وكيفية تقديم الملاحظات
مراجعة الكود ليست مجرد إجراء شكلي، بل هي إحدى العمليات الرئيسية التي تضمن جودة الكود. وهذا مهم بشكل خاص للمشاريع في C# و.NET، حيث يلعب الأداء العالي وقابلية القراءة والامتثال للمعايير الحديثة دورًا حاسمًا. في هذه المقالة، سنقوم بتفصيل ما يجب البحث عنه عند مراجعة كود C# وكيفية تقديم ملاحظات مفيدة وبناءة.
1. البنية والامتثال لمبادئ SOLID
قبل النظر إلى أسطر الكود المحددة، قم بتقييم البنية العامة. في C#، هذا مهم بشكل خاص بسبب الاستخدام الواسع للبرمجة كائنية التوجه (OOP).
- المسؤولية الواحدة (Single Responsibility): يجب أن يحل كل class وكل method مهمة واحدة. إذا كان method يقوم بأكثر من اللازم - فهذا سبب للمراجعة.
- مفتوح/مغلق (Open/Closed): تحقق مما إذا كان يمكن توسيع الوظائف دون تعديل الكود الموجود (على سبيل المثال، من خلال الـ interfaces أو الـ abstract classes).
- حقن التبعيات (Dependency Injection): في .NET Core/5+، DI هو المعيار. تأكد من تمرير التبعيات عبر الـ constructor، وليس إنشاؤها داخل الـ class.
// سيء: انتهاك لمبدأ المسؤولية الواحدة (SRP) وحقن التبعيات (DI)public class OrderService{ private readonly SqlConnection _connection = new SqlConnection("..."); public void ProcessOrder(Order order) { // منطق التحقق (Validation logic) // منطق الحفظ في قاعدة البيانات (Database saving logic) // منطق إرسال البريد الإلكتروني (Email sending logic) }}
// جيد: فصل إلى خدمات (services) وحقن التبعيات (DI)public class OrderService{ private readonly IOrderRepository _orderRepository; private readonly IEmailService _emailService;
public OrderService(IOrderRepository orderRepository, IEmailService emailService) { _orderRepository = orderRepository; _emailService = emailService; }
public void ProcessOrder(Order order) { _orderRepository.Save(order); _emailService.SendConfirmation(order); }}2. الأمان ومعالجة الأخطاء
الأمان هو جزء حاسم في أي تطبيق بلغة C#. انتبه إلى الجوانب التالية:
- حقن SQL (SQL injections): استخدم الاستعلامات ذات المعلمات (parameterized queries) أو Entity Framework، وليس دمج السلاسل النصية (string concatenation).
- الاستثناءات (Exceptions): لا تقم بابتلاع الاستثناءات باستخدام
catchفارغة. قم بتسجيل الأخطاء واستخدمfinallyلتنظيف الموارد. - الأمان من القيم الفارغة (Null safety): في C# 8+ استخدم أنواع المراجع القابلة للقيمة الفارغة (nullable reference types). تحقق من وسائط الـ method لمعرفة ما إذا كانت
null.
// سيء: عرضة لحقن SQLvar query = "SELECT * FROM Users WHERE Name = '" + userName + "'";
// جيد: استعلام مع معلمات (parameterized query)var command = new SqlCommand("SELECT * FROM Users WHERE Name = @name", connection);command.Parameters.AddWithValue("@name", userName);تحقق أيضًا من أن التطبيق يعالج الاستثناءات بشكل صحيح عند حدود النظام (على سبيل المثال، في وحدات تحكم ASP.NET Core).
3. الأداء وإدارة الذاكرة
C# هي لغة بها إدارة تلقائية للذاكرة، لكن هذا لا يعني أنه يمكنك نسيان الأداء. أثناء المراجعة، انتبه إلى:
- استعلامات LINQ: تجنب التكرارات المتعددة على المجموعات. على سبيل المثال، استخدام
.ToList()بعد كل.Where()يمكن أن يبطئ الأداء بشكل كبير. - عدم التزامن (Asynchrony): استخدم
async/awaitلعمليات الإدخال/الإخراج (I/O)، لكن لا تفرط في استخدام.Resultأو.Wait()- فقد يتسبب ذلك في حالات توقف تام (deadlocks). - تجميع الكائنات (Object pool): للكائنات الثقيلة (على سبيل المثال، اتصالات قاعدة البيانات)، استخدم التجميع (pooling) بدلاً من إنشائها في كل مرة.
// سيء: تكرارات متعددةvar filtered = items.Where(x => x.IsActive).ToList();var sorted = filtered.OrderBy(x => x.Name).ToList