ببساطة ، لها ثلاث خصائص:
نسخة الكود كما يلي:
* إجمالي عدد الحالات (الدولة) محدود.
* في أي لحظة ، أنت فقط في ولاية واحدة.
* في ظل ظروف معينة ، سوف ينتقل من ولاية إلى أخرى.
ما يعنيه لجافا سكريبت هو أنه يمكن كتابة العديد من الكائنات كآلات حالة محدودة.
على سبيل المثال ، يوجد عنصر قائمة على صفحة الويب. عندما يكون الماوس يحوم ، يتم عرض القائمة ؛ عندما يتم نقل الماوس بعيدًا ، يتم إخفاء القائمة. إذا كنت تستخدم وصف آلة الحالة المحدودة ، فإن هذه القائمة تحتوي على حالتين فقط (عرض وإخفاء) ، وسيؤدي الماوس إلى انتقال الحالة.
يمكن كتابة الرمز على النحو التالي:
نسخة الكود كما يلي:
قائمة var = {
// الوضع الحالي
CurrentState: "إخفاء" ،
// أحداث الربط
تهيئة: function () {
var self = this ؛
Self.on ("Hover" ، self.transition) ؛
} ،
// انتقال الحالة
الانتقال: وظيفة (حدث) {
التبديل (this.currentState) {
حالة "إخفاء":
this.currentState = 'show' ؛
dosomething () ؛
استراحة؛
حالة "عرض":
this.currentState = 'Hide' ؛
dosomething () ؛
استراحة؛
تقصير:
console.log ('حالة غير صالحة!') ؛
استراحة؛
}
}
} ؛
يمكن ملاحظة أن طريقة الكتابة في آلات الحالة المحدودة واضحة في المنطق وقوي في التعبير ، والتي تفضي إلى تغليف الأحداث. كلما زاد عدد الدول التي يوجد بها كائن والمزيد من الأحداث التي يحدث ، كلما كان ذلك أكثر ملاءمة هو استخدام طريقة كتابة آلة الحالة المحدودة.
بالإضافة إلى ذلك ، JavaScript هي لغة مع الكثير من العمليات غير المتزامنة. يتمثل الحل الشائع في تحديد وظائف رد الاتصال ، ولكن هذا سيؤدي إلى مشاكل مثل بنية الرمز المربكة ، يصعب اختبارها وتصحيح الأخطاء. توفر آلة الحالة المحدودة طريقة أفضل: ربط العمليات غير المتزامنة مع تغيير حالة الكائن. عند الانتهاء من العملية غير المتزامنة ، يحدث تغيير في الحالة المقابلة ، مما يؤدي إلى عمليات أخرى. هذا معقول منطقيًا أكثر من حل وظائف رد الاتصال ، والاستماع إلى الأحداث ، والنشر/الاشتراك ، وما إلى ذلك ، ويسهل تقليل تعقيد الكود.
فيما يلي مكتبة آلة محدودة ، آلة حالة جافا سكريبت. من السهل جدًا فهم هذه المكتبة ويمكن أن تساعدنا في تعميق فهمنا ، ووظائفها ليست ضعيفة على الإطلاق.
توفر هذه المكتبة statemachine كائن عالمي ، والتي تستخدم طريقة إنشاء الكائن لإنشاء مثيلات من آلة الحالة المحدودة.
نسخة الكود كما يلي:
var fsm = statemachine.create () ؛
عند الإنشاء ، يجب توفير كائن معلمة لوصف خصائص المثيل. على سبيل المثال ، يمكن وصف إشارات المرور (إشارات المرور) على النحو التالي:
نسخة الكود كما يلي:
var fsm = statemachine.create ({
الأولي: "الأخضر" ،
الأحداث: [
{name: 'Warn' ، from: 'Green' ، to: 'Yellow'} ،
{name: 'stop' ، from: 'Yellow' ، to: 'Red'} ،
{name: 'Ready' ، from: 'Red' ، to: 'Yellow'} ،
{name: 'Go' ، from: 'Yellow' ، to: 'Green'}
]
}) ؛
الحالة الأولية لدغة حركة المرور خضراء. سمة الأحداث هي الأحداث المختلفة التي تؤدي إلى تغييرات الدولة ، مثل حدث التحذير الذي يتسبب في أن تصبح الدولة الخضراء حالة صفراء ، ويؤدي حدث التوقف إلى أن تصبح الحالة الصفراء حالة حمراء ، إلخ.
بعد إنشاء المثيل ، يمكنك الاستعلام عن الحالة الحالية في أي وقت.
نسخة الكود كما يلي:
* fsm.current: إرجاع الوضع الحالي.
* fsm.is (s): إرجاع قيمة منطقية تشير إلى ما إذا كانت الحالة هي الحالة الحالية.
* fsm.can (e): إرجاع قيمة منطقية تشير إلى ما إذا كان يمكن تشغيل الحدث E في الحالة الحالية.
* fsm.cannot (E): إرجاع قيمة منطقية تشير إلى ما إذا كان لا يمكن تشغيل الحدث E في الحالة الحالية.
تتيح جهاز JavaScript Finite State تحديد وظيفتين رد اتصال لكل حدث ، مع أخذ حدث التحذير كمثال:
نسخة الكود كما يلي:
* onbeforewarn: نشأ قبل حدوث حدث التحذير.
* onafterwarn (يمكن اختصاره كما onwarn): يتم تشغيله بعد حدوث حدث تحذير.
في الوقت نفسه ، يسمح أيضًا بتحديد وظيفتين رد اتصال لكل ولاية ، مع أخذ الحالة الخضراء كمثال:
نسخة الكود كما يلي:
* onleavegreen: التشغيل عند مغادرة الحالة الخضراء.
* Onentergreen (يمكن اختصاره على أنه ongreen): يتم تشغيله عند دخول الحالة الخضراء.
على افتراض أن حدث تحذير يغير الحالة من الأخضر إلى الأصفر ، تحدث الأنواع الأربعة المذكورة أعلاه من وظائف رد الاتصال بالترتيب التالي: OnBeforeWarn → OnLeaveGreen → Onenteryellow → Onafterwarn.
بالإضافة إلى تحديد وظيفة رد الاتصال لكل حدث وحالة بشكل منفصل ، يمكنك أيضًا تحديد وظيفة رد اتصال مشتركة لجميع الأحداث والولايات.
نسخة الكود كما يلي:
* onbeforeevent: نشأ قبل حدوث أي حدث.
* onleavestate: نشأ عند ترك أي دولة.
* onenterstate: نشأ عند دخول أي دولة.
* onafterevent: نشأ بعد انتهاء أي من الحدثين.
إذا كانت هناك عمليات غير متزامنة في وظيفة رد الاتصال لهذا الحدث (مثل اتصال Ajax مع الخادم) ، فقد نرغب في الانتظار حتى تنتهي العملية غير المتزامنة قبل حدوث تغييرات الحالة. هذا يتطلب طريقة الانتقال.
نسخة الكود كما يلي:
fsm.onwarn = function () {
Light.Fadeout ('Slow' ، function () {
fsm.transition () ؛
}) ؛
إرجاع statemachine.async ؛
} ؛
في وظيفة رد الاتصال في الكود أعلاه ، هناك عملية غير متزامنة (Light.Fadeout). إذا كنت لا تريد أن تتغير الدولة على الفور ، فيجب عليك السماح بوظيفة رد الاتصال بإرجاع كائن statemachine.async ، مما يشير إلى أن الحالة لا تتغير في الوقت الحالي ؛ انتظر حتى يتم الانتهاء من العملية غير المتزامنة ، ثم اتصل بالطريقة الانتقالية للتسبب في تغيير الدولة.
تتيح جهاز JavaScript Finite State أيضًا تحديد وظائف معالجة الأخطاء التي يتم تشغيلها تلقائيًا عندما تكون الأحداث التي من المستحيل حدوثها في الحالة الحالية.
نسخة الكود كما يلي:
var fsm = statemachine.create ({
// ...
خطأ: الدالة (eventName ، من ، إلى ، args ، errorcode ، errormessage) {
إرجاع 'event' + eventName + ':' + errormessage ؛
} ،
// ...
}) ؛
على سبيل المثال ، الحالة الحالية خضراء ، ومن الناحية النظرية ، قد يحدث حدث تحذير فقط في هذا الوقت. في حالة حدوث حدث توقف في هذا الوقت ، سيتم تشغيل وظيفة معالجة الأخطاء أعلاه.