Legacy Code: How do I add a feature

Legacy Code: How do I add a feature

المقدمة

في المقال السابق اتكلمنا عن كيفيه عمل التغييرات لما بيكون الوقت ضيق ومحتاجين يكون التغيير في وقت سريع ومفيش وقت للتعامل مع تعقيدات الكود القديم

هنا احنا هنتكلم عن لما نحب نضيف ميزة جديدة في الكود ايه الطرق الممكنة والآمنة وهنبدأ بطريقة مشهورة جدا وهي ال TDD.

Test-Driven-Development - TDD

Is software development approach in which test cases are developed to specify and validate what the code will do. In simple terms, test cases for each functionality are created and tested first and if the test fails then the new code is written in order to pass the test and making code simple and bug-free

بعض الناس بتظن ان unit testing وال TDD هو نفس الشئ ولكن في اختلاف ما بينهم، كون ان احنا نكتب كود وبعدين نعمل ال unit tests دا مش بيعتبر TDD، لإن ال TDD بيمشي بالخطوات دي

  • Write a failing test case

وهنا احنا في الأول بنكتب ال unit test structure لل feature اللي احنا محتاجين نضيفها وبطبيعه الحال الكود مش هيكون قادر ي compile لإن الال feature اصلا لسه مش موجودة فبنروح للخطوة التانية

  • Make it compile

هنا احنا بنروح فعليا نكتب ال feature بتاعتنا وشغلها تمام وبعد كدا نرجع لل unit test

  • Make it success

هنا بنراجع على ال unit test ولو فيه مشكلة في الكود اللي كتبناه بنصلحها وبنتأكد انها شغالة تمام

  • Remove duplications

بعد كدا ممكن نعمل اي refactor في الكود نخليه بشكل احسن لو الامور تمام يبقى خلاص

ميزة ال TDD من وجهه نظر الكتاب انها بتخلينا مركزين علي مهمة واحدة بس أثناء التعديل ودا اللي بيخلي التعديل أأمن لانه مفيش مشتتات ولا تعديلات في أكتر من مكان في نفس الوقت، ولكن على مستوى العيوب في الطريقة دي انها بتاخد وقت أكبر في تنفيذ العمل.

Programming by difference

الطريقة دي من إضافة ال features بتعتمد بشكل أساسي على ال Inheritance عشن نضيف ال features بدون ما نتعامل مع الكود القديم زي المثال عندنا service مسؤولة عن انها تبعت notification عن طريق ال email

No alt text provided for this image

بعد فترة حبينا نضيف نوع تاني من ال notifiction عن طريق ال sms فزي ما بتقول الطريقة دي ان احنا نعمل subclassing من الأساسي ونعمل override لل method دي زي الصورة

No alt text provided for this image

ولو حبينا إن احنا نضيف feature جديدة لل notifications زي مثلا push notifications للموبايل فهتكون برضو بالشكل دا

No alt text provided for this image

زي ما لاحظنا في الحل دا ان احنا ممكن نضيف feature جديدة بدون ما نغير في الكود القديم ولا نقرب من مشاكله وفي الكود الجديد احنا نقدرنعمل unit test بالشكل المريح لينا، ولكن


لكن الحل دا في عيب كبير جدا لو تم استخدامه بشكل مفرط في الكود وهو مخالفة مبدأ Liskov Substitution from SOLID principles ودا بينص على ايه

Liskov Substitution Principle (LSP) states that objects of a superclass should be replaceable with objects of its subclasses without breaking the application

المبدأ دا بيقول ان المفروض ان احنا نستخدم ال Inheritance في شكل اعادة استخدام الكود اللي موجود في ال parent وأضيف عليه في ال children ولكن فكرة اني اعمل override كتير جوا الكود لل parent methods دا اللي بيؤدي لمخالفة المبدأ ومشاكل في الكود.

طيب ليه دا بسبب مشكلة؟

الفكرة بما ان احنا قلنا ان SmSNotificationSerivce is a NotificationService اللي هو علاقة ال Inheritance فالصحيح ان SmSNotificationSerivce بيعمل نفس اللي بيعمله بالضبط ال NotificationService وممكن الاقي فيه اضافات بالتالي احنا لو عندنا المثال دا

No alt text provided for this image


وجه developer بعد مدة طويلة وحب انه يستخدم ال parent class بحيث انه يقدر يخلي الجزء دا generic فهيلاقي على مستوى ال compilation مفيش اي مشكلة وممكن كمان على مستوى ال testing مفيش مشاكل ولكن علي مستوي ال run time هيلاحظ اختلاف وهو ان ال notification بقت بتوصل عن طريق ال email مش sms وهو حتى الآن مش عايز التغيير دا، فهنا يكون المقصود بال LSP violation.

طيب هل فيه حل بديل؟

عشان نتجنب مشكلة LSP violation احنا ممكن نستخدم الحل في الصورة وهو عبارة عن configuration Map بنقدر نبعتها مع ال constructor بحيث ان احنا نقدر نستعمل logic معين بناءا على المتطلبات أثناء كتابة الكود

No alt text provided for this image

طبعا في حالة ان الأنواع زادت بالتالي ممكن يكون NotificationSenderService يحصلها violation لل single responsibility بالتالي في الحالة دي احنا ممكن نطلع جزء ال configuration كاملا في class تاني وليكن مثلا NotificationConfiguration ويكون مسؤول عن تحديد النوع المطلوب من ال notification بناءا على criteria معينة.

لعرض أو إضافة تعليق، يُرجى تسجيل الدخول

المزيد من المقالات من Sameh Muhammed

  • The Idea Behind Quarkus

    Introduction If you are a Java developer and using a Spring Boot framework, you can see that a lot of videos and…

    ٢ تعليق
  • Legacy Code: I can't get this class into test suite

    المقدمة في المقال اللي فات اتكلمنا عن الأساليب الآمنة اللي ممكن استخدمها واحنا بنضيف feature جديدة في النظام القديم وفي…

  • Legacy Code: I don't have much time and I need the change quickly

    المقدمة اتكلمنا في المقال اللي فات عن ال Seam وعن ليه أفضل حل في التعامل مع ال legacy code هو ال unit tests. هنتكلم هنا…

    ٤ تعليق
  • Legacy Code: The Seam & Feedback Loop

    المقدمة في المقالة السابقة اتكلمنا عن الهدف الأساسي من السوفت وير وأنواع التغييرات اللي ممكن تحصل على السوفت وير وتعريف…

  • Legacy Code: Mechanics of change

    المقدمة أي سوفت وير موجود حاليا بتكون قيمته في حجم المميزات اللي بيضيفها في حياة الناس وثقة الناس في السوفت وير دا يعني…

    ١ تعليق واحد
  • Service Design Best Practices - Part II

    Introduction By now most softwares separating the server side logic from user interface logic by developing a back end…

  • Service Design Best Practices - Part I

    Introduction By now most softwares separating the server side logic from user interface logic by developing a back end…

  • حقيقة الشغف : الطرق العمليه للوصول إليه

    المقدمة هل صادفت يوما أحد هذه النصائح على مواقع التواصل الإجتماعي أو أخبرك بها أحد من أصدقائك عليك أن تتبع شغفك إذا…

  • Object-Oriented Programming : comprehensive guide

    Motivation It's very common to be asked about OOP concepts while you are still fresh graduate or junior developer, but…

  • Why Agile worked very well with software engineering

    Motivation Most of software developers found themself working in software development industry with Agile methodology…