نمط التكرار
في البرمجة كائنية التوجه ، يُعد نمط المُكرِّر نمط تصميم يُستخدم فيه مُكرِّر لاجتياز حاوية والوصول إلى عناصرها. يفصل نمط المُكرِّر الخوارزميات عن الحاويات؛ وفي بعض الحالات، تكون الخوارزميات بالضرورة خاصة بحاوية معينة، وبالتالي لا يمكن فصلها.
على سبيل المثال، يمكن تطبيق الخوارزمية الافتراضية searchForElement()بشكل عام باستخدام نوع محدد من المُكرِّرات بدلاً من تطبيقها كخوارزمية خاصة بحاوية معينة. وهذا يسمح searchForElement()باستخدامها على أي حاوية تدعم نوع المُكرِّر المطلوب.
ملخص
يُعد نمط التصميم Iterator [ 1 ] أحد أنماط التصميم الـ 23 المعروفة باسم "Gang of Four" والتي تصف كيفية حل مشكلات التصميم المتكررة لتصميم برامج كائنية التوجه مرنة وقابلة لإعادة الاستخدام، أي كائنات يسهل تنفيذها وتغييرها واختبارها وإعادة استخدامها.
ما المشاكل التي يمكن لنمط تصميم المكرر حلها؟
- ينبغي الوصول إلى عناصر الكائن المجمع واجتيازها دون الكشف عن تمثيله (هياكل البيانات).
- ينبغي تعريف عمليات اجتياز جديدة لكائن مجمع دون تغيير واجهته.
إن تحديد عمليات الوصول والتنقل في واجهة التجميع أمر غير مرن لأنه يلزم التجميع بعمليات وصول وتنقل معينة ويجعل من المستحيل إضافة عمليات جديدة لاحقًا دون الحاجة إلى تغيير واجهة التجميع.
ما الحل الذي يصفه نمط تصميم المُكرِّر؟
- قم بتعريف كائن منفصل (كائن تكراري) يقوم بتغليف الوصول إلى كائن مجمع واجتيازه.
- يستخدم العملاء أداة التكرار للوصول إلى مجموعة بيانات واجتيازها دون معرفة تمثيلها (هياكل البيانات).
يمكن استخدام مُكرِّرات مختلفة للوصول إلى مجموعة بيانات واجتيازها بطرق مختلفة. ويمكن تعريف عمليات الوصول والاجتياز الجديدة بشكل مستقل عن طريق تعريف مُكرِّرات جديدة.
انظر أيضًا إلى مخطط فئات وتسلسل UML أدناه.
تعريف
جوهر نمط التكرار هو "توفير طريقة للوصول إلى عناصر كائن مجمع بشكل تسلسلي دون الكشف عن تمثيله الأساسي". [ 3 ]
بناء
فئات UML ومخطط التسلسل

في مخطط فئات UML أعلاه ، تشير الفئة (1) إلى واجهة إنشاء كائن ( ) و(2) إلى واجهة اجتياز كائن ( , ). تُنفذ الفئة الواجهة من خلال الوصول إلى الفئة .ClientAggregateIteratorcreateIterator()IteratorAggregatenext()hasNext()Iterator1IteratorAggregate1
يوضح مخطط تسلسل UML التفاعلات أثناء التشغيل: يستدعي الكائن كائنًا آخر، والذي بدوره ينشئ كائنًا ويعيده إلى الكائن الأول . ثم يستخدم الكائن الأول عناصر الكائن الثاني للتنقل بينها .ClientcreateIterator()Aggregate1Iterator1ClientClientIterator1Aggregate1
مخطط فئات UML

مثال
تُوحّد بعض لغات البرمجة قواعدها النحوية. وتُعدّ لغتا C++ و Python من الأمثلة البارزة على ذلك.
لغة سي++
تُنفّذ لغة C++ المُكرِّرات بدلالات المؤشرات في تلك اللغة. في C++، يُمكن للفئة إعادة تعريف جميع عمليات المؤشرات، ما يسمح بتنفيذ مُكرِّر يعمل بشكلٍ مُشابه للمؤشر، بما في ذلك الوصول إلى القيمة المرجعية، والزيادة، والنقصان. تكمن ميزة ذلك في std::sortإمكانية تطبيق خوارزميات C++، مثل `return`، مباشرةً على مخازن الذاكرة العادية، دون الحاجة إلى تعلّم أي قواعد نحوية جديدة. مع ذلك، يتطلب هذا مُكرِّرًا "نهائيًا" لاختبار التساوي، بدلًا من السماح للمُكرِّر بمعرفة وصوله إلى النهاية. في لغة C++، نقول إن المُكرِّر يُحاكي مفهوم المُكرِّر .
يعتمد هذا التطبيق بلغة C++23 على الفصل "تعميم المتجهات مرة أخرى". [ 5 ]
استيراد std ؛template < typename T > using InitializerList = std :: initializer_list < T > ; using OutOfRangeException = std :: out_of_range ; template < typename T > using UniquePtr = std :: unique_ptr < T > ;class DoubleVector { private : UniquePtr < double [] > elements ; size_t listSize ; public : using Iterator = double * ;[[ nodiscard ]] Iterator begin () const noexcept { return elements ; }[[ nodiscard ]] Iterator end () const noexcept { return elements + listSize ; } DoubleVector ( InitializerList <double> list ) : elements { std :: make_unique < double [] > ( list.size ()) }, listSize { list.size ( ) } { double * p = elements ; for ( auto i = list.begin ( ) ; i != list.end ( ) ; ++ i , ++ p ) { * p = * i ; } // يتم التنفيذ أيضًا باستخدام // std:: ranges :: copy(list, elements.get ( ) ) }~ DoubleVector () = default ;[[ nodiscard ]] size_t size () const noexcept { return listSize ; }[[ nodiscard ]] double & operator []( size_t n ) { if ( n >= listSize ) { throw OutOfRangeException ( "DoubleVector::operator[] خارج النطاق!" ); } return elements [ n ]; }DoubleVector ( const DoubleVector & ) = delete ; // تعطيل إنشاء النسخ DoubleVector & operator = ( const DoubleVector & ) = delete ; // تعطيل إسناد النسخ };int main ( int argc , char * argv []) { DoubleVector v = { 1.1 * 1.1 , 2.2 * 2.2 }; for ( const double & x : v ) { std :: println ( " {}" , x ); } for ( size_t i = v.begin ( ) ; i != v.end (); ++ i ) { std :: println ( "{}" , * i ); } for ( size_t i = 0 ; i <= v.size ( ) ; ++ i ) { std :: println ( " { }" , v [ i ]); } }مخرجات البرنامج هي
1.21 4.84 1.21 4.84 1.21 4.84 تم استدعاء الإنهاء بعد طرح استثناء من نوع ' OutOfRangeException ' ماذا ( ) : DoubleVector :: operator [ ] خارج النطاق !انظر أيضاً
مراجع
- ↑ إريك غاما؛ ريتشارد هيلم؛ رالف جونسون؛ جون فليسيدس (1994). أنماط التصميم: عناصر البرمجيات القابلة لإعادة الاستخدام والموجهة للكائنات . أديسون ويسلي. ص 257 وما بعدها . ISBN 0-201-63361-2.
- ↑ "نمط تصميم المُكرِّر - المشكلة والحل والتطبيق" . w3sDesign.com . تم الاطلاع عليه بتاريخ 12 أغسطس 2017 .
- ↑ عصابة الأربعة
- ↑ "نمط تصميم المُكرِّر - البنية والتعاون" . w3sDesign.com . تم الاطلاع عليه بتاريخ 12 أغسطس 2017 .
- ↑ بيارن ستروستروب (2014). البرمجة: المبادئ والتطبيق باستخدام لغة C++ ( الطبعة الثانية). أديسون ويسلي. الصفحات 729 وما بعدها. ISBN 978-0-321-99278-9.
روابط خارجية
- تكرار الكائنات في PHP
- نمط التكرار في لغة C#
- نمط التكرار في لغة النمذجة الموحدة (UML) وفي LePUS3 (لغة نمذجة رسمية)
- برنامج تعليمي لإنشاء المصدر
- أمثلة تطبيقية لأنماط التصميم - برنامج تعليمي
- نمط التكرار
- التكرار في البرمجة
- أنماط تصميم البرمجيات
