في ناس كتير اتكلمت عن مشاكل الجمل الشرطية في الكود وفي ناس بتوصل لان وجود الجمل الشرطية في حد ذاته شر لابد من تفاديه ودليل على ان عندك code smell
هاتكلم عن شوية مشاكل مرتبطة بالجمل الشرطية اظن انها مشهورة وازاي نقدر نتخلص منها 🧵
هاتكلم عن شوية مشاكل مرتبطة بالجمل الشرطية اظن انها مشهورة وازاي نقدر نتخلص منها 🧵
قبل ما نتكلم حابب انوه ان الحلول دي مش مبتكرة نهائي، انما هي حاجات اتعلمتها وانا شغال وهتلاقوها في كتب ومواقع كتير جدا وعلى رأسهم refactoring.guru و Clean Code وطبعا مارتن فاولر فلو حسيت بأي تشابه في المحتوى مع المواقع دي خليك دايما متخيل انهم الاصل
المشكلة اللي فاتت بتأثر على عامل من العوامل اللي بنقيس بيها جودة الكود المكتوب اسمها ال Cyclomatic Complexity لو حابب تعرف اكتر en.wikipedia.org
المثال ده بنحاول نعمل حاجة مبسطة اوي من كاشير وفيه method بتمثل عملية الشرا، للتبسيط انا شيلت كل الحاجات اللي تخص البيزنس واحتفظت بس بال input validation. الكود ده مفهوش مشكلة ال nesting لانه واضح اننا استخدمنا الاسلوب اللي فات في اننا ن fail fast and return early
بس لازال الكود كبير جدا عشان يعمل حاجة بسيطة مقارنة بحجمه وهو انه يخصم فلوس من الكارت واغلب الكود ده متلخص في شوية الجمل الشرطية بتاعة ال input validation. طبعا المشكلة دي ليها حلول كتير جدا على حسب حجمها وعلى حسب مدى تكرار طبيعة المدخلات دي في البرنامج.
الكود بقى شكله احسن شوية، قادر تفصل السلوك المطلوب من البيزنس عن ال input validation. طبعا ده تطور عن الكود القديم بس اللي حصل انك زقيت الحتة الكبيرة دي في حتة تانية انما هي لسه حجمها كبير وفيها تكرار لانك ترمي ال exception.
هنا احب اوضح ان فيه حاجة اسمها Design by Contract تقدر تقرا عنه وتاخد اللي يفيدك منها. ال Preconditions اللي استخدمتها هنا هي تشبه في الاسم وشوية في الوظيفة للي موجودة في الباترن الا ان الباترن اكبر منها ومختلفة عنها في شروطها
en.wikipedia.org
en.wikipedia.org
هنا المشكلة بتقول ان فعلا عندك كائنات المفروض يكون ليها سلوك مختلف عشان هي ليها طبيعة مختلفة ومع ذلك انت حاططهم كلهم تحت نفس تحت المسمى RegularShape وبقت مسئولية الكلاينت انه يحدد نوع الشكل الهندسي ده ويبتدي يحسب المساحة بنفسه وبقى عارف ازاي يحسب المساحة لكل واحد
ده معناه ان لو بقى فيه اكتر من كلاينت وعاوزين يحسبوا المساحة يا اما كلهم هيتعلموا يحسبوا المساحة لكل شكل يا اما هنعمل Shared utility class واللي هي في حد ذاتها مشكلة في رأيي لان كده بقى فيه logic يخص الشكل محطوط برا تعريف الشكل ده
بكده اكون اتكلمت عن المشاكل اللي باشوفها منتشره وايه الحلول اللي بالجألها في الحالات دي طبعا في مشاكل تانية اقل شهرة وفيه patterns تانية برضة ممكن نستخدمها ودي اساميها لو حد عاوز يزود
1. Strategy Pattern
2. Template method Pattern
واللي هم نقدر نعتبرهم شكل خاص من الحل الاخير اللي هو الاعتماد على ال polymorphism
3. Specifications pattern
4. Responsibility chain
5. Design by contract
2. Template method Pattern
واللي هم نقدر نعتبرهم شكل خاص من الحل الاخير اللي هو الاعتماد على ال polymorphism
3. Specifications pattern
4. Responsibility chain
5. Design by contract
جاري تحميل الاقتراحات...