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

[ 1 ]
يوضح الرسم التخطيطي التالي بنية نمط التوأم بعد استبدال بنية التوريث المتعدد السابقة:

[ 1 ]
التعاون
كل فئة فرعية مسؤولة عن البروتوكول الموروث من فئتها الأصلية. وهي تعالج الرسائل الواردة من هذا البروتوكول وتعيد توجيه الرسائل الأخرى إلى فئتها الشريكة. [ 1 ]
يشير عملاء نمط التوأم إلى أحد الكائنات التوأم مباشرةً والآخر عبر حقل التوأم الخاص به. [ 1 ]
تتواصل العملاء التي تعتمد على بروتوكولات الفئات الأصلية مع كائنات الفئة الفرعية المعنية. [ 1 ]
نموذج التعليمات البرمجية
الكود التالي هو عبارة عن تطبيق تخطيطي للوحة لعبة كمبيوتر تحتوي على كرات متحركة.
فئة لوحة اللعبة:
public class Gameboard extends Canvas { public int width , height ; public GameItem firstItem ; … }[ 1 ]
مخطط برمجي لفئة GameItem:
فئة مجردة عامة GameItem { لوحة اللعبة board ؛ int posX ، posY ؛ عنصر اللعبة next ؛ دالة مجردة عامة draw ()؛ دالة مجردة عامة click ( MouseEvent e )؛ دالة مجردة عامة intersects ( GameItem other )؛ دالة مجردة عامة collideWith ( GameItem other )؛public void check () { GameItem x ;for ( x = board . firstItem ; x != null ; x = x . next ) if ( intersects ( x )) collideWith ( x ); }public static BallItem newBall ( int posX , int posY , int radius ) { // دالة من GameBoard BallItem ballItem = new BallItem ( posX , posY , radius ); BallThread ballThread = new BallThread (); ballItem . twin = ballThread ; ballThread . twin = ballItem ;return ballItem ; } }[ 1 ]
مخطط برمجي لفئة BallItem:
public class BallItem extends GameItem { BallThread twin ; int radius ; int dx , dy ; boolean suspension ;public void draw () { board . getGraphics (). drawOval ( posX - radius , posY - radius , 2 * radius , 2 * radius ); }public void move () { posX += dx ; posY += dy ; }public void click () { if ( suspend ) twin . resume (); else twin . suspend ();معلق = ! معلق ; }public boolean intersects ( GameItem other ) { if ( other instanceof Wall ) return posX - radius <= other . posX && other . posX <= posX + radius || posY - radius <= other . posY && other . posY <= posY + radius ; else return false ; }public void collideWith ( GameItem other ) { Wall wall = ( Wall ) other ;إذا كان الجدار عموديًا ، فإن dx = -dx ؛ وإلا فإن dy = -dy .[ 1 ]
مخطط برمجي لفئة BallThread:
public class BallThread extends Thread { BallItem twin ;public void run () { while ( true ) { twin . draw (); /*erase*/ twin . move (); twin . draw (); } } }[ 1 ]
تطبيق نمط التوأم
ينبغي مراعاة المسائل التالية:
- تجريد البيانات - يجب أن تكون الفئات الشريكة للفئة التوأم مترابطة بشكل وثيق، إذ من المحتمل أن تحتاج إلى الوصول إلى الحقول والأساليب الخاصة بكل منها. في جافا، يمكن تحقيق ذلك بوضع الفئات الشريكة في حزمة مشتركة وتوفير إمكانية الوصول إلى الحقول والأساليب المطلوبة داخل هذه الحزمة. أما في Modula-3 و Oberon، فيمكن وضع الفئات الشريكة في وحدة نمطية مشتركة.
- الكفاءة - نظرًا لأن نمط التوأم يعتمد على التركيب الذي يتطلب إعادة توجيه الرسائل، فقد يكون أقل كفاءة من الوراثة. ومع ذلك، بما أن الوراثة المتعددة أقل كفاءة من الوراثة الفردية على أي حال، فلن يمثل العبء الإضافي مشكلة كبيرة. [ 1 ] [ 2 ]
- المرجع الدوري - يعتمد نمط التوأم على إشارة كل توأم إلى التوأم الآخر، مما يُسبب حالة مرجعية دورية. قد تتطلب بعض لغات البرمجة معالجة هذه المراجع الدورية بشكل خاص لتجنب تسرب الذاكرة . على سبيل المثال، قد يلزم جعل أحد المراجع "ضعيفًا" للسماح بكسر الحلقة.
انظر أيضاً
- نمط المحول ، وخاصة المحول ثنائي الاتجاه
مراجع
- 1 2 3 4 5 6 7 8 9 10 11 12 13 14 موسنبوك، هـ.، التوأم - نمط تصميم لنمذجة الوراثة المتعددة ، جامعة لينز، معهد برمجيات الأنظمة
- ↑ ستروستروب، ب. (مايو 1989)، الوراثة المتعددة للغة C++ ، هلسنكي: وقائع مؤتمر الربيع لـ EUUG
- أنماط تصميم البرمجيات
