مقدمة: لماذا يحتاج الكود القديم إلى إعادة هيكلة؟
\n\nكل مطور يعمل على منصة .NET، عاجلاً أم آجلاً، يواجه كوداً قديماً. هذه برامج مكتوبة بإصدارات قديمة من C# (مثل .NET Framework 4.x)، تستخدم أنماطاً قديمة مثل DataTable في ASP.NET Web Forms أو فئات ضخمة بآلاف الأسطر. هذا الكود هو مصدر للديون التقنية: فهو صعب الصيانة، ويحتوي على أخطاء مخفية، ويبطئ تطبيق الميزات الجديدة.
إعادة الهيكلة هي عملية تغيير البنية الداخلية للكود دون تغيير سلوكه الخارجي. في هذه المقالة، سنشرح خطة خطوة بخطوة لإعادة هيكلة الكود القديم بلغة C#، من التشخيص إلى تطبيق الممارسات الحديثة. ستتعلم كيفية تحسين مشروع قديم بأمان باستخدام أدوات .NET والتقنيات المثبتة.
\n\n1. التشخيص والتحضير: من أين نبدأ؟
\n\nقبل تغيير الكود، يجب فهم حالته الحالية. بدون تحليل، أنت تخاطر بتعطيل الوظائف.
\n\n1.1. تقييم الديون التقنية
\nاستخدم محللي الكود المدمجين في Visual Studio أو المتاحة عبر NuGet:
\n- \n
- Roslyn analyzers — تكتشف الأخطاء المحتملة والتراكيب القديمة. \n
- SonarQube (أو SonarCloud) — تقيم جودة الكود، والتكرار، والتعقيد. \n
- NDepend — تصور التبعيات بين الفئات والوحدات. \n
1.2. كتابة الاختبارات كشبكة حماية
\nإعادة الهيكلة بدون اختبارات هي لعبة روليت روسية. غالباً لا توجد اختبارات وحدة للكود القديم. ابدأ بكتابة اختبارات توصيفية (characterization tests) تثبت السلوك الحالي:
\n\n// مثال لاختبار لطريقة قديمة\n[Test]\npublic void CalculateDiscount_ShouldReturn10Percent_WhenOrderTotalIsGreaterThan100()\n{\n // Arrange\n var legacyClass = new OrderProcessor();\n var order = new Order { Total = 150 };\n \n // Act\n var result = legacyClass.CalculateDiscount(order);\n \n // Assert\n Assert.AreEqual(15, result); // 10% من 150\n}\n\nأنشئ اختبارات للمسارات الحرجة. هذا سيسمح لك بإعادة الهيكلة بأمان، مع العلم أن السلوك لن يتغير.
\n\n1.3. اختيار الاستراتيجية: "استراتيجية الحديقة"
\nلا تحاول إعادة هيكلة المشروع بأكمله مرة واحدة. اختر وحدة أو فئة واحدة تسبب أكبر قدر من المشاكل (تعقيد عالٍ، أخطاء متكررة). اعمل بشكل تكراري: خطوات صغيرة، وتحديثات متكررة.
\n\n2. التقنيات الأساسية لإعادة هيكلة الكود القديم بلغة C#
\n\nدعنا نستعرض الأساليب الرئيسية التي ستساعد في تحويل "كود السباغيتي" إلى بنية نظيفة.
\n\n2.1. التخلص من الكائنات العملاقة (الفئات الكبيرة)
\nغالباً ما يحتوي الكود القديم على فئات تفعل كل شيء: تعمل مع قاعدة البيانات، وتتحقق من صحة البيانات، وترسل البريد الإلكتروني. استخدم مبدأ المسؤولية الواحدة (SRP).
\n\nقبل إعادة الهيكلة:
\npublic class UserService\n{\n public void RegisterUser(string name, string email)\n {\n // التحقق من الصحة\n if (string.IsNullOrEmpty(name)) throw new Exception();\n \n // العمل مع قاعدة البيانات\n using (var conn = new SqlConnection("..."))\n {\n conn.Execute("INSERT INTO Users ...");\n }\n \n // إرسال البريد الإلكتروني\n SmtpClient client = new SmtpClient();\n client.Send(new MailMessage(...));\n }\n}\n\nبعد إعادة الهيكلة:
\npublic class UserService\n{\n private readonly IUserRepository _userRepository;\n private readonly IEmailService _emailService;\n private readonly IValidator<UserRegistration> _validator;\n\n public UserService(IUserRepository repo, IEmailService email, IValidator<UserRegistration> validator)\n {\n _userRepository = repo;\n _emailService = email;\n _validator = validator;\n }\n\n public void RegisterUse