إعادة صياغة الكود code refactoring الجزء الثاني

السلام عليكم ورحمة الله

تكلمت في بداية العام الماضي عن فائدة عملية إعادة صياغة الكود، وهذه المرة سوف أتكلم بواقع خبرة عملية أكبر من المرة الفائتة. والسبب وراء ذلك هو طلب من إحدى اﻷخوات في المدونة أن ابحث لها عن مواضيع تتكلم عن إعادة صياغة الكود مكتوبة باللغة العربية، حيث أن المحتوى العربي ربما يكون قليلاً في هذا الموضوع، فهذه فرصة لزيادة المحتوى العربي، والسبب اﻵخر أني أصبحت أهتم كثيراً بتحسين صياغة الكود خصوصاً بعدما أصبحت استخدم أداة التطوير NetBeans والتي بها آليات ممتازة تدعم هذه العملية.

وإعادة صياغة الكود هي عملية تنظيم وترتيب مصدر البرنامج داخلياً دون تغيير وظائفه.

الحاجة لإعادة صياغة الكود في الفترة اﻷخيرة بالنسبة لي كانت بسبب أن المشروعات الجديدة أصبحت مشروعات جماعية، فلابد أن يكون الكود مكتوب بطريقة واضحة ومنطقية والتسميات واضحة حتى يتسنى لباقي المبرمجين والمطورين فهم البرنامج أولاً ثم المشاركة فيه ثانياً. والنقطة الثانية هي أن التقسيم الجيد للأقسام الداخلية للبرامج تجعل من السهل لكل مبرمج أن يُركز على جزئية معينة يعمل بها دون أن يكون هناك تداخل في تعديل نفس الكود مع مبرمج آخر. والتقسيم الجيد الداخلي لأي برنامج هو أول نقطة لتوثيق أي نظام، حيث يُمكن أن نعتبره توثيق في حد ذاته. فتخيل برنامج أقسامه واضحة الدلالة والكائنات أيضاً أسمائها ذات معنى مطابق لوظائفها، وكل إجراء موضوع في الطبقة الصحيحة التي يُمثلها، فبهذه الطريقة يسهل دخول مبرمجين جدد في دورة تطوير هذا البرنامج.

الحاجة المستمرة لإعادة صياغة الكود طوال فترة تطوير البرامج هو نتاج طبيعي بسبب أن البداية في أي برنامج أو جزئية منه تكون بسيطة ثم تزداد تعقيداً، وهذا التعقيد ينتج عنه أحياناً كتابة كود في مكان غير صحيح. مثلاً في إجراء لتسجيل اسم عميل جديد في نظام ما، نجد أننا قمنا بعمل اختبار لصحة المدخلات ضمن إجراء اﻹدخال في قاعدة البيانات نفسه، ثم أضفنا كود للسرية مثلاً. فيصبح الكود النهائي يُمثل عدة طبقات في إجراء مزدحم. نقوم في هذه الحالة بفصل تلك اﻷجزاء من اﻹجراء الرئيسي وجعلها إجراءات ثانوية في نفس المكون الحالي أو في مكون آخر يُمثل طبقة أخرى من النظام.

أصبحت أدوات التطوير الحديثة بها إمكانات للمساعدة في عملية إعادة صياغة الكود. مثلاً أداة التطوير لازارس بها هذه الميزة في محرر الكود. وهذا مثال لإجراء ضمن  لبرنامج توربو بيرد. قمنا بتظليل جزء منه يصلح لأن يكون إجراء قائماً بذاته، ثم اخترنا بالزر اﻷيمن للماوس Refactoring ثم Extract Procedure ثم ظهرت شاشة خيارات لاختيار طريقة استخلاص الإجراء الجديد:

befor

فقامت هذه اﻷداة بإنشاء إجراء جديد سميناه getStatusBar ثم ندائه من داخل الإجراء الرئيسي ليصبح كالآتي:

after

وهذا هو كود اﻹجراء الجديد الذي تم استخلاصه:

extracted

بهذه الطريقة نطبق قاعدة divide and conquer لتصبح أجزاء الكود توجد في تقسيمات أصغر تسهل صيانتها واﻹضافة عليها.

كانت لدي مشكلة في برنامج توربو بيرد وهي أنه تحدث مشكلة عندما يكون السطر اﻷخير في كود الـ SQL المراد تنفيذه عبارة عن تعليق comment ولم استطع حلها، لكن أمس قُمت بإعادة صياغة الكود الذي يقوم بتجزئة كود الـ SQL إلى أجزاء أصغر فأصبح حل هذه المشكلة أسهل وأوضح، وتم الحل في دقيقة أو دقيقتين فقط بعد تغيير شكل الكود الداخلي والذي كان عبارة عن إجراء طويل وشديد التعقيد.

في السابق كُنت اعتمد على إعادة صياغة الكود اليدوية، اﻵن أصبحت طريقة آلية متوفرة في معظم أدوات التطوير الحديثة. لكن الطريقة اﻵلية لا تقوم بتصحيح العادات السيئة في البرمجة، مثلاً كثرة ألاعتماد على المتغيرات العامة Global variables، حيث يتطلب هذا تغيير يدوي لإعادة صياغة بطريقة خالية من اﻷخطاء في تصميم البرامج.

كإحدى نتائج عملية إعادة صياغة الكود أن تكون لدينا كائنات وإجراءات أكثر اعتماداً على نفسها لتصبح سهلة الاستخدام في برامج أخرى أو في نفس البرنامج مما يقلل تكرار الكود ويحقق مفهوم إعادة اﻹستخدام Code reusability

20 thoughts on “إعادة صياغة الكود code refactoring الجزء الثاني

  1. بارك الله فيك أستاذ
    فعلا اعادة صياغة الكود امر مهم جدا
    لدي تساؤل حول برمجة جماعية في مشروع لنفرض اني استخدم لازاروس و يوجد 5 مبرمجين الهدف يكون برنامج بقواعد بيانات و اقسام مختلفة. كيف يمكن العمل معا حول برنامج واحد في وقت واحد بطريقة نظامية لنقل مثلا MVC

  2. ادوات التطوير مثل netbeans و lazarus تسهل اعادة صياغة الكود كثيرا، مثلا كنت في السابق استخدم findandreplace لاعادة تسمية المتغيرات، لكن مع خاصية اعادة صياغة الكود صارت العملية اسهل واقل عرضة للخطأ.
    المشكلة هي كيفية اكتشاف هذه الخصائص التي توفرها ادوات التطوير ، انا لم اسمع عن code refractoring الا في هذه المدونة ! – شكراً يا ابو اياس- .

  3. الأخ ابن عبدالله يوسف:
    تحتاج في هذه الحال إلى مخدم Source Control وأنصح بإستخدام Subversion لأن تثبيته سهل، لكن للاسف لايوجد دعم مباشر له في أداة التطوير لازاراس، لذلك لابد من إستخدام سطر الأوامر لرفع وتحديث البرامج أو استخدام برنامج اسمه tortious أو شيء من هذا القبيل. يستطيع الفريق كله العمل في برنامج واحد بكل سهولة إذا أجادوا استخدام هذه الأداة المهمة، وهي تحتاج لتدوينة منفصلة للكلام عنها.

    إلى: mabudrais:
    أول مرة أجد فيها عملية الـ Refactoring كان في توربو دلفي 2006 وكان ذلك عام 2007، لكن لم استخدمها كثيراً، كُنت استخدم الطريقة اليدوية إلى أن استخدمت NetBeans وقد شجعتني هذه الأخيرة على إستخدامها في لازاراس أيضاً

  4. مشكور جدا على هذا التوضيح
    ولكن استاذ بما ان خبرتك العملية في هذا الموضوع واسعة هل تعتبر ادوات صياغة الكود مساعدة للمبرمج بشكل كبير وفي اغلب الحالات ام انها كلام نظري فقط . وهل bad smell التي اشار اليها مارتن فاولر في كتابه والطرق التي عالجها بها كلها قد تحولت الى tools .

  5. نعم صياغة الكود من الأهمية بمكان أن منعتني من أن أقوم بتحويل أحد البرامج التي أعمل عليها إلى برنامج مفتوح المصدر، وذلك لأن تصميمه الداخلي يُمكن أن يثير النقد ويبعد المبرمجين للإنضمام إليه، لذلك لابد أن أقوم بعمل إعادة لصياغة جزء كبير منه حتى يصبح مقبول لباقي المبرمجين ثم أقوم بفتح مصدره
    بالنسبة لكتاب مارتن فاولر فلم أسمع عنه، ويمكن لكي أن تكلمينها أكثر عن ما يُقال عن صياغة الكود حتى إذا كان كلاماً نظرياً فيمكننا أن نحكم عليه بحكم الخبرة العملية.

  6. مارتن فاولر يعتبر الأب الروحي لموضوع ال Refacortoring code واسم كتابه عن هذا الموضوع
    Refactoring : Improving the Design of Existing Code

  7. انا دائما اقوم بتعديل الكود بشكل مخيف لكي اعزل اقسامهن لدرجة انه اطلق على نفسي أحيانا (لاغاظة زملائي) Mr Replacer لكثرة ما اقوم بتغيير اسماء المتحولات أو التوابع أو الحقول في قاعدة البيانات، ايضا الطبقات و عزل التوابع و تقسيمها.

    لكن استعمل ذلك بحذر و على مراحل أي لا اقوم بعزل تابع فورا ان جائتني الفكرة، أولا علي ايجاد المتشابهات، ليس البحث عنها إنما أحدث تغيير في الكود بحيث يكون مشابها لقسم آخر، إلى ان استقر على التشابه في عدة اقسام، بعدها أقوم بعزل هذا التشابه كمرحلة ثانية.
    أيضا احاول ان ارفع أي تابع أو كود لا يستفيد من طبقته الحالية، مثلا تابع يحسب الضريبة لا يتم وضعه في طبقة الـ GUI إذا هو لا يستخدم اي من توابع المرئية أو الرسومية، لست اقوم بعزل التابع بل ارفعه إلى ملفات لا ترى أصلا ملفات الفيجوال، بل لا ترى ملفات قاعدة البيانات، و هكذا مع الوقت سيصبح البرنامج مؤلف من عدة طبقات اشهرها طبقة ال Core التي فيها تعريفات الكلاسات فقط و بعض التوابع الخاصة بها ثم طبقة قاعدة البيانات و تليها طبقة المرئية GUI و ربما يمكن استبدالها بطبقة Web أي واجهة HTML بسهولة.

  8. إضافة لو سمحتم… بالرغم من أهمية أن يعود المبرمج من حين لأخر لبرنامجه من أجل مزيد من التنقيح للتعليمات، إلا أنه من المهم أيضا للمبرمج أن يكتسب العادات الحسنة مبكرا وأن يطبق أفضل الممارسات البرمجية على الكود منذ نشأته الأولى.

  9. اممممممم تبدو مفيدة اتمنى ان نتعلم البرمجة على أصولها أما أنا فسأحاول فمن إجتهد و أصاب فله أجران و من إجتهد و لم يصب فله أجر واحد

  10. كلام اﻷخ خالد صحيح، اﻷفضل للمبرمج أن يتحلى بالصبر ويكتب كوداً مرتباً من البداية وتصميم جيد خصوصاً أن عدد من المبرمجين أو نوعية من البرامج لا يتم الرجوع إليها لإعادة الصياغة مطلقاً.
    لكن هناك قاعدة ربما لأنشتاين هي أنه لكل حل مسألة يوجد حل أفضل. فإذا كانت الحلول البرمجية واﻷلغوريثمات واﻹجراءات المختلفة مكتوبة بطريقة جيدة فمن المؤكد أنه توجد طريقة أفضل تنتظر أن يكتشفها المبرمج.

  11. أنا لا استعمل هذه الادوات في لازاروس على الاطلاق للاسف، و لاحتى Code Explorer حتى انني اقوم بالغاء Code Folding

    الذي استفيد منه هو الألوان و اكمال التوابع Ctrl+Shift+C و الاكمال التلقائي طبعاً، و ملاحقة التعريف الاساسي Find Declaration

  12. فكرت، لكن أعتقد أن جزئية المحرر أشد تعقيداً من المكونات والحزم. مثلاً إعادة الصياغة تحتاج لمفسر أو مترجم يقوم بتحليل الكود

  13. هذا ما انا عالقة به فالدكتور المشرف طلب مني أن أكتب شفرة برمجية تعمل كأداة لإعادة صياغة الكود .طبعا وهذه الأداة يجب أن تعالج
    إحدى خصائص البرمجة السيئة مثل تكرار الكود أو الطرق (methods ) الكبيرة في لغات البرمجة الشيئيىة او….
    حيث يوجد حوالي 22 خاصية سيئة للبرمجيات في كتاب فاولر . وأيضا توجد بعض الاستراتيجيات التي تطبق لحل هذه الخصائص السيئة مثل extract method وغيرها من الاستراتيجيات التي تعمل على اعادة صياغة للكود البرمجي اليا وليس يدويا.
    فالمشكلة أني كيف أعمل مسح ألي مثلا للبحث عن كود مكرر في كود لبرنامج متكامل مثلا ؟؟؟؟؟؟

أضف تعليقاً

إملأ الحقول أدناه بالمعلومات المناسبة أو إضغط على إحدى الأيقونات لتسجيل الدخول:

WordPress.com Logo

أنت تعلق بإستخدام حساب WordPress.com. تسجيل خروج   / تغيير )

صورة تويتر

أنت تعلق بإستخدام حساب Twitter. تسجيل خروج   / تغيير )

Facebook photo

أنت تعلق بإستخدام حساب Facebook. تسجيل خروج   / تغيير )

Google+ photo

أنت تعلق بإستخدام حساب Google+. تسجيل خروج   / تغيير )

Connecting to %s