design-patterns - examples - design patterns شرح




هو انتهاك مبدأ الجاف دائما سيئة؟ (6)

أعتقد نعم. على الرغم من أن DRY هي قاعدة عامة مثالية ، إلا أنه من الأفضل تكرار نفسك ببساطة. أجد نفسي تجاهل DRY في كثير من الأحيان عندما تكون في مرحلة اختبار ما قبل التطوير. أنت لا تعرف أبدا متى ستحتاج إلى إجراء تغييرات طفيفة على وظيفة ، والتي لا تريد أن تجعل في آخر. أنا بالطبع أحاول أن ألاحظ دائما DRY على "الانتهاء" (التطبيقات التي تكتمل ، ولن تحتاج إلى تعديل) التطبيقات ، ولكن هذه هي قليلة ومتباعدة. في النهاية يعتمد على احتياجات التطبيقات الآجلة. لقد قمت بالتطبيقات التي كنت أتمنى أن تكون جاف ، وشكرت الله أنني لم أشاهدها على الآخرين.

لقد قمت بمناقشة مبدأ DRY ( عدم تكرار نفسك ) والمعروف أيضًا باسم DIE ( Duplication Is Evil ) وهناك أصوات ، أي تكرار بسيط للكود هو دائمًا شرير. أود سماع رأيك حول النقاط التالية:

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

هل الحالات المذكورة أعلاه هي سبب وجيه للتخلي عن عملية التجريد وترك فقط رمز مكررة لصالح مخاطر التغييرات المستقبلية أو مجرد قراءة؟


الهندسة هي كل شيء عن المفاضلات ، لذلك ليس هناك نصيحة نهائية أو نمط تصميم صالح لكل مشكلة. بعض القرارات يصعب دعمها أكثر من غيرها (تكرار الكود هو واحد منها) ، ولكن إذا كان محترفو تكرار الشفرة يفوق سلبياتها في موقفك ، فابحث عنها.


لا ، إن انتهاك DRY ليس دائمًا سيئًا. خاصة إذا فشلت في التوصل إلى اسم جيد لتجريد الشفرة المكررة ، أي اسم يلائم كلا السياقين ، فقد يكون الأمر مختلفًا في النهاية ، ويجب تركه مكررًا.

من وجهة نظري فإن هذا النوع من الصدفة يميل إلى أن يكون نادراً مع ذلك ، وكلما كبرت الشفرة المضاعفة ، كان من الأرجح وصف مفهوم واحد.

وأجد أيضًا أن التجريد إلى التكوين هو دائمًا فكرة أفضل في هذا الصدد من التجريد إلى الميراث الذي يمكن أن يقودك بسهولة إلى معادلات خاطئة وانتهاكات LSP و ISP .


لا توجد مطلقات ، بل ستكون دائماً دعوة حكم بين أهون الشرور. عادة ، يفوز DRY ويجب أن تكون حذرا من المنحدرات الزلقة عندما تبدأ في انتهاك ذلك ، ولكن المنطق الخاص بك يبدو بخير بالنسبة لي.


هذه هي أسباب صحيحة تماما لانتهاك DRY. يجب أن أضيف ثلث: الأداء. نادرًا ما يكون هذا أمرًا كبيرًا ، لكنه يمكن أن يحدث فرقًا ، وقد تخاطر التجريد في إبطاء الأمور.

في الواقع ، سأضيف رابعًا: إضاعة الوقت وإدخال أخطاء جديدة عن طريق تغيير جزءين (أو أكثر) من مصدر أساسي قد يعمل بالفعل على ما يرام. هل تستحق تكلفة معرفة كيفية تجريد هذه الأشياء إذا لم تكن مضطرًا لذلك ، وربما لن توفر أي وقت أو الكثير في المستقبل؟

عادة ، لا تعد الشفرات المتكررة مثالية ، ولكن هناك أسباب مقنعة بالتأكيد للسماح لها ، على الأرجح تتضمن أسبابًا أخرى غير ما اقترحه البروتوكول الاختياري وأنا.


نعم ، من المعروف أن بعض الازدواجية في الشفرة يصعب استبعادها دون جعل القراءة أكثر سوءًا. في مثل هذه الحالات أترك TODO في التعليقات كتذكير بأن هناك بعض الازدواجية ولكن في وقت الكتابة كان من الأفضل تركها على هذا النحو.

عادة ما يحدث هو ما تكتبه في نقطتك الأولى ، فإن الاختلافات تختلف ولا تعد مضاعفات. ويحدث أيضًا أن الازدواجية هي علامة على وجود مشكلة في التصميم ولكنها تصبح واضحة في وقت لاحق فقط.

قصة قصيرة طويلة: حاول تجنب الازدواجية. إذا كان من الصعب اعتبار الازدواجية معاكسة ووقت الكتابة غير مؤذٍ ، فما عليك سوى ترك تعليق كتذكير.

انظر أيضا 97 أشياء يجب أن يعرفها كل مبرمج :

ص. 14. احذر المشاركة من قبل Udi Dahan

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

في هذه الحالة ، قام بتكوين التبعية بين جزأين من النظام تم الحفاظ عليهما بشكل مستقل. كان الحل أساسا الازدواجية.





refactoring