يقدم
يقوم وضع وزن الذبابة (وزن الذبابة) بتشغيل تقنية المشاركة لدعم عدد كبير من الكائنات الدقيقة بشكل فعال ، وتجنب النفقات العامة لعدد كبير من الفئات الصغيرة مع نفس المحتوى (مثل استهلاك الذاكرة) ، والسماح للجميع بمشاركة فئة (metaclass).
يمكن أن يتجنب نمط الموسوعة كمية كبيرة من النفقات العامة من الطبقات المتشابهة للغاية. في البرمجة ، من الضروري في بعض الأحيان إنتاج عدد كبير من مثيلات الفصل الدقيقة لتمثيل البيانات. إذا تمكنت من العثور على أن هذه الحالات لها نفس النفقات العامة باستثناء بعض المعلمات ، فيمكنك تقليل عدد الفئات التي تحتاج إلى إنشاء مثيل لها بشكل كبير. إذا كان من الممكن نقل هذه المعلمات خارج مثيل الفئة وتم تمريرها عند استدعاء الطريقة ، يمكن تقليل عدد الحالات الفردية بشكل كبير عن طريق المشاركة.
فماذا لو قمت بتطبيق وضع الموسوعة في JavaScript؟ هناك طريقتان. الأول هو تطبيقها على طبقة البيانات ، وخاصة على عدد كبير من الكائنات المماثلة في الذاكرة ؛ والثاني هو تطبيقها على طبقة DOM ، والتي يمكن استخدامها في مدير الأحداث المركزي لتجنب إضافة مقابض الأحداث إلى كل عنصر طفل في الحاوية الأصل.
استمتع بطبقة البيانات
هناك مفهومين مهمين في وزن الذبابة - الدولة الداخلية الداخلية والخارجية الخارجية. تتم إدارة الحالة الداخلية من خلال الطرق الداخلية في الكائن ، ويمكن حذف المعلومات الخارجية أو حفظها خارجيًا.
بعبارة صريحة ، هو أولاً أن يقرص نموذجًا أصليًا ، ثم إنتاج نماذج محددة ذات خصائص مختلفة وفقًا للمناسبات والبيئات المختلفة. من الواضح ، يجب إنشاء كائنات جديدة مختلفة هنا ، لذلك يظهر وضع المصنع غالبًا في وضع وزن الذبابة. يتم استخدام الحالة الداخلية لوزن الذبابة للمشاركة. يعد مصنع ذبابة الوزن مسؤولاً عن الحفاظ على تجمع وزن الذبابة (تجمع الوضع) لتخزين الكائنات مع الحالة الداخلية.
استخدم وضع التمتع
دعنا نوضح أنه إذا كان النظام يستخدم مكتبة الفصل لإدارة جميع الكتب ، يتم تعيين بيانات تعريف كل كتاب مبدئيًا على المحتوى التالي:
نسخة الكود كما يلي:
بطاقة تعريف
عنوان
مؤلف
النوع
عدد الصفحات
معرف الناشر
ISBN
نحتاج أيضًا إلى تحديد الوقت والمقترض لكل كتاب ، وكذلك تاريخ العودة وما إذا كان متاحًا:
نسخة الكود كما يلي:
checkoutdate
CheckOutMember
Duereturndate
توافر
نظرًا لأن كائن الكتاب يتم تعيينه على الرمز التالي ، يرجى ملاحظة أن الرمز لم يتم تحسينه بعد:
نسخة الكود كما يلي:
var book = function (id ، title ، المؤلف ، النوع ، pagecount ، publisherid ، isbn ، headoutdate ، checkoutmember ، duereturndate ، التوفر) {
this.id = id ؛
this.title = title ؛
هذا. مؤلف = مؤلف ؛
this.genre = النوع ؛
this.pageCount = pageCount ؛
this.publisherid = publisherid ؛
this.isbn = ISBN ؛
this.checkoutDate = headoutDate ؛
this.checkoutmember = checkOutMember ؛
this.duereturndate = duereturndate ؛
this.avavation = توفر ؛
} ؛
book.prototype = {
getTitle: function () {
إرجاع هذا.
} ،
getAuthor: function () {
إرجاع هذا. مؤلف ؛
} ،
getIsbn: function () {
إرجاع هذا.
} ،
/*لن يتم عرض أساليب GET الأخرى هنا*/
// تحديث حالة الإقراض
updatecheckoutstatus: وظيفة (bookid ، newstatus ، headoutdate ، checkoutmember ، newReturnDate) {
this.id = bookid ؛
هذا.
this.checkoutDate = headoutDate ؛
this.checkoutmember = checkOutMember ؛
this.duereturndate = newReturnDate ؛
} ،
// التجديد
ExtendCheckoutPeriod: وظيفة (bookid ، newReturnDate) {
this.id = bookid ؛
this.duereturndate = newReturnDate ؛
} ،
// هل انتهت صلاحيتها
ISPASTDUE: وظيفة (bookid) {
var currentDate = new Date () ؛
return currentDate.getTime ()> date.parse (this.duereturndate) ؛
}
} ؛
قد يكون البرنامج على ما يرام في البداية ، ولكن مع مرور الوقت ، قد تزيد الكتب بكميات كبيرة ، وكل نوع من الكتب له إصدارات وكميات مختلفة ، ستجد أن النظام يزداد أبطأ وأبطأ. يمكن تخيل الآلاف من كائنات الكتب في الذاكرة ، ونحن بحاجة إلى استخدام وضع الموسوعة لتحسين.
يمكننا تقسيم البيانات إلى نوعين من البيانات الداخلية والخارجية. يمكن أن تعزى البيانات المتعلقة بكائنات الكتب (العنوان ، المؤلف ، وما إلى ذلك) إلى الخصائص الداخلية ، في حين أن (CheckOutMember ، Duereturndate ، وما إلى ذلك) يمكن أن تعزى إلى الخصائص الخارجية. وبهذه الطريقة ، يمكن للرمز التالي مشاركة نفس الكائن في نفس الكتاب ، لأنه بغض النظر عمن يقترض الكتاب ، طالما أن الكتاب هو نفس الكتاب ، فإن المعلومات الأساسية هي نفسها:
نسخة الكود كما يلي:
/*رمز تحسين وضع Xienyuan*/
var book = function (العنوان ، المؤلف ، النوع ، pagecount ، publisherid ، ISBN) {
this.title = title ؛
هذا. مؤلف = مؤلف ؛
this.genre = النوع ؛
this.pageCount = pageCount ؛
this.publisherid = publisherid ؛
this.isbn = ISBN ؛
} ؛
تحديد المصنع الأساسي
دعنا نحدد مصنعًا أساسيًا للتحقق مما إذا كان كائن الكتاب قد تم إنشاؤه من قبل ، والعودة إذا كان هناك ، وإعادة إنشاءه وتخزينه حتى يتمكن من الاستمرار في الوصول لاحقًا ، مما يضمن إنشاء كائن واحد فقط لكل كتاب:
نسخة الكود كما يلي:
/* كتاب مصنع Singleton*/
var bookfactory = (function () {
var fructionBooks = {} ؛
يعود{
CreateBook: وظيفة (العنوان ، المؤلف ، النوع ، PageCount ، Publisherid ، ISBN) {
/*ابحث عما إذا كنت ستنشئ قبل*/
var nurnsbook = nervectbooks [ISBN] ؛
if (nerveBook) {
إرجاع كتاب موجود ؛
}آخر{
/ * إذا لم يكن الأمر كذلك ، قم بإنشاء واحد وحفظ */
var book = New Book (title ، uplust ، النوع ، pagecount ، publisherid ، ISBN) ؛
provessions [ISBN] = كتاب ؛
كتاب العودة
}
}
}
}) ؛
إدارة الحالة الخارجية
الحالة الخارجية بسيطة نسبيا. باستثناء الكتاب الذي قمنا بتغليفه ، يجب إدارة كل شيء آخر هنا:
نسخة الكود كما يلي:
/*BookrecordManager Singleton لاستعارة إدارة*/
var bookrecordmanager = (function () {
var bookrecordDatabase = {} ؛
يعود{
/*إضافة سجل استعارة كتاب*/
poxpbookrecord: وظيفة (معرف ، عنوان ، مؤلف ، نوع ، pagecount ، publisherid ، ISBN ، headoutdate ، checkoutmember ، duereturndate ، التوفر) {
var book = bookFactory.CreateBook (العنوان ، المؤلف ، النوع ، pagecount ، publisherid ، ISBN) ؛
bookrecordDatabase [id] = {
CheckOutMember: CheckOutMember ،
CheckoutDate: checkoutdate ،
Duereturndate: Duereturndate ،
التوفر: التوافر ،
كتاب: كتاب ؛
} ؛
} ،
updatecheckoutstatus: وظيفة (bookid ، newstatus ، headoutdate ، checkoutmember ، newReturnDate) {
var record = bookrecordDatabase [bookid] ؛
record.avavation = newstatus ؛
record.checkoutDate = headoutDate ؛
record.checkoutMember = checkOutMember ؛
record.duereturndate = newReturnDate ؛
} ،
ExtendCheckoutPeriod: وظيفة (bookid ، newReturnDate) {
bookrecordDatabase [bookid] .duereturndate = newReturnDate ؛
} ،
ISPASTDUE: وظيفة (bookid) {
var currentDate = new Date () ؛
return currentDate.getTime ()> date.parse (bookrecordDatabase [bookid] .DuereturnDate) ؛
}
} ؛
}) ؛
وبهذه الطريقة ، قمنا بحفظ نفس المعلومات لنفس الكتاب في كائن BookManager وحفظنا نسخة واحدة فقط ؛ مقارنة بالرمز السابق ، يمكننا أن نجد أنه يحفظ الكثير من الذاكرة.
استمتع بوضع يوان ودوم
لن أقول الكثير عن حادثة DOM هنا. أعتقد أن الجميع يعرف ذلك بالفعل. دعنا نعطي مثالين.
مثال 1: إدارة الأحداث المركزية
على سبيل المثال ، إذا كنا بحاجة إلى مراقبة حدث النقر للعديد من العناصر أو الهياكل المماثلة (مثل القوائم ، أو LIS متعددة في UL) ، فإننا نحتاج إلى ربط الأحداث لكل عنصر. إذا كان هناك العديد من العناصر ، فيمكن تخيل الأداء. جنبا إلى جنب مع معرفة الفقاعات ، إذا تم تشغيل أي عنصر طفل ، فإن الحدث سوف يفقس على العنصر السابق بعد تشغيل الزناد. لذلك ، باستخدام هذه الميزة ، يمكننا استخدام وضع الموسوعة ، يمكننا مراقبة أحداث الأحداث على العناصر الأم لهذه العناصر المماثلة ، ومن ثم الحكم على عنصر الطفل الذي تم تشغيله ، ثم إجراء المزيد من العمليات.
نحن هنا نجمع بين طريقة الربط/غير المرتبط بـ jQuery لإعطاء مثال.
HTML:
نسخة الكود كما يلي:
<div id = "container">
<div href = "#"> مزيد من المعلومات (العنوان)
<span>
هنا مزيد من المعلومات
</span> </viv>
<div href = "#"> مزيد من المعلومات (الخريطة)
<span>
<iframe src = "http://www.map-generator.net/extmap.php؟name=london&address=london٪2C٪20england&width=500...gt ؛" </iframe>
</span>
</div>
</div>
جافا سكريبت:
نسخة الكود كما يلي:
Statemanager = {
Fly: Function () {
var self = this ؛
$ ('#Container'). Unbind (). bind ("Click" ، function (e) {
var target = $ (e.originalTarget || e.srcelement) ؛
// تحديد عنصر الطفل
if (target.is ("div.toggle")) {
self.handleclick (الهدف) ؛
}
}) ؛
} ،
Handleclick: Function (elem) {
elem.find ('span'). Toggle ('Slow') ؛
}
}) ؛
مثال 2: تطبيق وضع الموسوعة لتحسين الأداء
مثال آخر لا يزال مرتبطًا بـ jQuery. بشكل عام ، نستخدم كائنات العناصر في وظيفة رد الاتصال. غالبًا ما نستخدم شكل $ (هذا). في الواقع ، فإنه ينشئ مرارًا وتكرارًا كائنًا جديدًا لأن هذا في وظيفة رد الاتصال هو بالفعل عنصر DOM نفسه. يجب أن نستخدم الكود التالي:
نسخة الكود كما يلي:
$ ('div'). bind ('click' ، function () {
console.log ('لقد نقرت: " + $ (هذا) .attr (' id ')) ؛
}) ؛
// يجب تجنب الكود أعلاه وتجنب إنشاء كائنات jQuery على عنصر DOM مرة أخرى ، لأنه يمكنك استخدام عنصر DOM نفسه مباشرة.
$ ('div'). bind ('click' ، function () {
console.log ('لقد نقرت:' + this.id) ؛
}) ؛
في الواقع ، إذا كان علينا استخدام شكل $ (هذا) ، فيمكننا أيضًا تنفيذ نسختنا الخاصة من نمط المثيل الفردي ، على سبيل المثال ، يمكننا تنفيذ وظيفة مثل jQuery.signle (هذا) لإرجاع عنصر DOM نفسه:
نسخة الكود كما يلي:
jquery.single = (function (o) {
مجموعة var = jQuery ([1]) ؛
وظيفة الإرجاع (العنصر) {
// ضع العناصر في المجموعة
مجموعة [0] = عنصر ؛
// العودة إلى المجموعة
مجموعة العودة
} ؛
}) ؛
كيفية استخدام:
نسخة الكود كما يلي:
$ ('div'). bind ('click' ، function () {
var html = jquery.single (this) .next (). html () ؛
console.log (html) ؛
}) ؛
وبهذه الطريقة ، يتم إرجاع عنصر DOM نفسه كما هو ، ولا يتم إنشاء كائن jQuery.
لخص
وضع الوزن الذبابة هو وضع يحسن كفاءة البرنامج وأداءه ، والذي سيؤدي إلى تسريع سرعة تشغيل البرنامج بشكل كبير. هناك العديد من سيناريوهات التطبيق: على سبيل المثال ، إذا كنت ترغب في قراءة سلسلة من الأوتار من قاعدة بيانات ، يتم تكرار العديد من هذه الأوتار ، فيمكننا تخزين هذه الأوتار في تجمع الوزن الذباعي (حمام السباحة).
إذا كان التطبيق يستخدم عددًا كبيرًا من الكائنات ، وتسبب هذه الأرقام الكبيرة من الكائنات تخزينًا كبيرًا ، فيجب عليك التفكير في استخدام وضع الموسوعة ؛ ويمكن أن تكون معظم حالات الكائنات خارجية. إذا تم حذف الحالة الخارجية للكائن ، فيمكن استبدال العديد من مجموعات الكائنات بعدد قليل نسبيًا من الكائنات المشتركة. في هذا الوقت ، يمكنك التفكير في استخدام وضع الموسوعة.