الكائن النشط
يفصل نمط تصميم الكائن النشط تنفيذ الأساليب عن استدعائها للكائنات التي يوجد كل منها في سلسلة تحكم مستقلة . [ 1 ] والهدف هو إدخال التزامن ، باستخدام استدعاء الأساليب غير المتزامن ومجدول لمعالجة الطلبات. [ 2 ]
يتكون النمط من ستة عناصر: [ 3 ]
مثال
جافا
مثال على نمط الكائن النشط في جافا . [ 4 ]
أولاً، نرى فئة قياسية توفر طريقتين لتعيين قيمة معينة لقيمة عددية من نوع double. هذه الفئة لا تلتزم بنمط الكائن النشط.
فئة MyClass {private double val = 0.0 ; void doSomething () { val = 1.0 ; }void doSomethingElse () { val = 2.0 ; } }تُعدّ هذه الفئة خطيرة في سيناريوهات تعدد الخيوط، إذ يُمكن استدعاء كلا الطريقتين في آنٍ واحد، ما قد يجعل قيمة val (وهي ليست ذرية، إذ يتم تحديثها على مراحل متعددة) غير مُعرّفة، وهو ما يُعرف بحالة التزامن. يُمكنك بالطبع استخدام التزامن لحل هذه المشكلة، وهو أمر سهل في هذه الحالة البسيطة. ولكن بمجرد أن تُصبح الفئة مُعقدة بشكلٍ واقعي، يُصبح التزامن صعبًا للغاية. [ 5 ]
لإعادة كتابة هذا الصنف ككائن نشط، يمكنك القيام بما يلي:
class MyActiveObject {private double val = 0.0 ; private BlockingQueue < Runnable > dispatchQueue = new LinkedBlockingQueue < Runnable > ();public MyActiveObject () { new Thread ( new Runnable () { @Override public void run () { try { while ( true ) { dispatchQueue.take (). run ( ) ; } } catch ( InterruptedException e ) { // حسنًا، قم بإنهاء المُرسِل } } } ). start (); }void doSomething ( ) throws InterruptedException { dispatchQueue.put ( new Runnable ( ) { @Override public void run () { val = 1.0 ; } } ); }void doSomethingElse () throws InterruptedException { dispatchQueue.put ( new Runnable ( ) { @Override public void run () { val = 2.0 ; } } ) ; } }مثال آخر على نمط الكائن النشط باستخدام ميزات Java 8.
public class MyClass { private double val ; // حاوية للمهام // تحدد الطلب الذي سيتم تنفيذه تاليًا // asyncMode=true يعني أن خيط العامل لدينا يعالج قائمة مهامه المحلية بترتيب FIFO // يمكن لخيط واحد فقط تعديل الحالة الداخلية private final ForkJoinPool fj = new ForkJoinPool ( 1 , ForkJoinPool . defaultForkJoinWorkerThreadFactory , null , true ); // تنفيذ دالة الكائن النشط public void doSomething () throws InterruptedException { fj . execute (() -> { val = 1.0 ; }); } // تنفيذ دالة الكائن النشط public void doSomethingElse () throws InterruptedException { fj . execute (() -> { val = 2.0 ; }); } }انظر أيضاً
مراجع
- ↑ دوغلاس سي. شميدت ؛ مايكل ستال؛ هانز رونيرت؛ فرانك بوشمان (2000). هندسة البرمجيات الموجهة بالأنماط، المجلد 2: أنماط الكائنات المتزامنة والمتصلة بالشبكة . جون وايلي وأولاده. ISBN 0-471-60695-2.
- ↑ باس، ل.، كليمنتس، ب.، كازمان، ر. هندسة البرمجيات في الممارسة العملية . أديسون ويسلي، 2003
- ↑ لافندر، ر. جريج؛ شميدت، دوغلاس س. "الكائن النشط" (ملف PDF) . مؤرشف من الأصل (ملف PDF) بتاريخ 22-07-2012 . تم الاطلاع عليه بتاريخ 02-02-2007 .
- ↑ هولوب، ألين. "كائنات جافا النشطة - اقتراح" . مؤرشف من الأصل بتاريخ 22-06-2013 . تم الاطلاع عليه بتاريخ 16-06-2014 .
- ↑ هولوب، ألين. "كائنات جافا النشطة - اقتراح" . مؤرشف من الأصل بتاريخ 22-06-2013 . تم الاطلاع عليه بتاريخ 16-06-2014 .
روابط خارجية
- أنماط تصميم البرمجيات
- التزامن (علوم الحاسوب)
- نماذج أولية لبرمجة الحاسوب
