fb

تعديل ما لا يمكن تعديله باستخدام Extension Methods

  • 27
  • 0
  • 0
  • Last update : 21-05-2016

أحياناً كثيرة نستخدم كوداً لم نطوره شخصياً. هذه سنة الحياة بالنسبة للمبرمجين. وأحياناً كثيرة يكون هذا الكود داخل DLL. أي بمعنى آخر، لا نستطيع التعديل عليه. وهذا لا بأس به في معظم الأحيان حينما يكون هذا الكود يناسب احتياجاتنا. ولكن سنة أخرى من سنن حياة المبرمجين هو أنه هناك دائماً حالات فردية واستثنائية. قبل فترة كنت أعمل على تعديل تطبيق طوره فريق آخر (في دولة أخرى!) وأضيف بعض الخصائص الجديدة عليه. وكانت طبقة التواصل مع قاعدة البيانات Data Access Layer (أو DAL) مطورة باستخدام أداة غير مجانية. هذا كان معناه أنه رغم أن الكود المصدري لهذه الجزئية كان موجوداً، لم يكن بمقدوري التعديل عليه وعمل كومبايل دون أن نشتري هذه الأداة. وهذه لم تكن مشكلة، حيث أن جميع الإجراءات التي أحناجها موجودة. أحدها كان الإجراء GetAllReports التابع للكلاس ReportDAL والذي يعطيني جميع التقارير قي سنة معينة. المشكلة كانت تكمن في أن هناك عملية تتكرر كثيراً وهي تصفية الناتح كثر بنوع التقرير. العملية ليست صعبة. سطرين أو ثلاثة باستخدام Linq كان كفيلاً بهذا. ولكن هذا الكود بدأ يتكرر بكثرة في أنحاء البرنامج، لذا أصبح من اللازم أن يصبح هذا الكود الجديد هو الآخر جزئاً من الـDAL. ولكن الكود لا يمكن تعديله (دون دفع نقود). الحل الكلاسيكي كان أن نطور كلاي جديد يرث الـClass القديم ويضيف الدالة الجديدة. ولكن هذا مزعج حيث أنه علي تعديل البرنامج كله ليستخدم الكلاس الجديد. هنا تأتي فائدة الـExtension Methods. الـExtension Methods هي خاصية تم إضافتها إلى ‎ ‎.‎NET‎ 3‎.‎5 وستلاحظها بكثرة إذا كنت تستخدم Linq. مثلاً دالة OrderBy ليست جزئاً من IEnumerable، ولكن ما إن تضع مكتبة Linq في ملفك ستجد أنها ظهرت كالسحر (مع بقية دوال Linq) في جميع الأنواع التي تسنخدم IEnumerable (مثل List وDictionary وغيرها). هذه هي الـExtension Method. دوال يتم إضافتها لأي كلاس عن طريق كود خارجها. واستخدامها بسيط جداً. لنعد إلى مثالنا الذي استهلينا به التدوينة. أريد أن أضيف دالة جديدة (لنسميها GetAllReportsByType) إلى الكلاس ReportDAL. سنفتح ملف جديد ونكتب: [Hidden] [Hidden] namespace Helpers { public static class CustomExtensions { public static ReportData GetAllReportsByType(this ReportDAL reportDAL, int year, int reportType) { return reportDAL.GetAllReports(year) .Where(x => x.ReportType == reportType); } } } لاحظوا البارامتر الأول في الدالة. الكلمة this يليها اسم الكلاس ثم الاسم الذي سنستخدمه داخل الدالة لهذا الكلاس. إذا كنتم تستخدمون VB.NET يصبح الكود هكذا: 1 2 Public Function GetAllReportsByType(ByVal reportDAL As ReportDAL, ByVal year As Integer, ByVal reportType As Integer) As ReportData ثم نستخدمها كأنها جزء من الكلاس الأصلي: 1 2 var repDAL = new ReportDAL(); var data = repDAL.GetAllReportsByType(2012, 10); حل مجاني وسهل وعملي جداً. وهو أفضل ما يمكن أن يطلبه أي مبرمج :) . Post to Twitter

This project has no media ...

Join or Log In to comment.

Salah
  • Connect