[javascript] نمط سينجلتون في العقيدات - هل هو مطلوب؟



3 Answers

كل ما سبق هو مبالغة. هناك مدرسة فكرية تقول أن أنماط التصميم تظهر أوجه قصور في اللغة الفعلية.

لا تحتاج اللغات مع OOP المستند إلى النموذج الأولي (بدون فئات) إلى نمط مفرد على الإطلاق. يمكنك ببساطة إنشاء كائن واحد (طن) على الطاير ثم استخدامه.

بالنسبة للوحدات النمطية في العقدة ، نعم ، يتم تخزينها مؤقتًا بشكل افتراضي ، ولكن يمكن تعديلها على سبيل المثال إذا كنت تريد تحميل التغييرات في الوحدة.

ولكن نعم ، إذا كنت ترغب في استخدام الكائن المشترك في جميع أنحاء ، وضعه في وحدة نمطية الصادرات على ما يرام. فقط لا تعقيدها مع "نمط المفرد" ، لا حاجة لذلك في جافا سكريبت.

Question

جئت مؤخرا عبر هذا المقال حول كيفية كتابة مفردة في Node.js. أنا أعلم أن وثائق require states ما states :

يتم تخزين الوحدات النمطية مؤقتًا بعد أول مرة يتم تحميلها. قد لا تتسبب مكالمات متعددة تتطلب ('foo') في تنفيذ تعليمات برمجية الوحدة النمطية عدة مرات.

لذا يبدو أن كل وحدة مطلوبة يمكن أن تستخدم بسهولة singleton بدون كود singlebreliler.

سؤال:

هل تقدم المقالة أعلاه جولة حول الحل لإنشاء مفردة؟




النظر إلى أبعد من ذلك في وحدة التحكّم بالتخزين المؤقت لوحدة التخزين في المستندات Modules:

يتم تخزين الوحدات النمطية مؤقتًا استنادًا إلى اسم الملف الذي تم حله. نظرًا لأن الوحدات النمطية قد تحل إلى اسم ملف مختلف استنادًا إلى موقع وحدة الاتصال (التحميل من مجلدات node_modules) ، فإنها ليست ضمانًا يتطلب ('foo') دائمًا إرجاع نفس الكائن نفسه ، إذا كان سيعتمد على ملفات مختلفة .

لذا ، اعتمادًا على مكان تواجدك عند طلب وحدة نمطية ، من الممكن الحصول على نسخة مختلفة من الوحدة.

يبدو أن الوحدات النمطية مثل وحدات ليست حلاً بسيطًا لإنشاء مفردات.

تحرير: أو ربما هم. مثلmkoryak ، لا يمكنني الخروج بحالة حيث قد يتم حل ملف واحد إلى أسماء ملفات مختلفة (بدون استخدام symlinks). ولكن (كالتعليقات علىJohnnyHK) ، سيتم تحميل وتخزين نسخ متعددة من ملف في node_modules مختلفة بشكل منفصل.




الجواب الوحيد هنا هو أن استخدام فئات ES6

// SummaryModule.js
class Summary {

  init(summary) {
    this.summary = summary
  }

  anotherMethod() {
    // do something
  }
}

module.exports = new Summary()

تتطلب هذا المفرد مع:

const summary = require('./SummaryModule')
summary.init(true)
summary.anotherMethod()

المشكلة الوحيدة هنا هي أنه لا يمكنك تمرير params إلى مُنشئ الفصل ولكن يمكن التحايل عليه عن طريق استدعاء طريقة init يدوياً.




لا تحتاج إلى أي شيء خاص للقيام بفرد واحد في js ، يمكن أن يكون الكود الموجود في المقالة كما يلي:

var socketList = {};

module.exports = {
      add: function() {

      },

      ...
};

خارج node.js (على سبيل المثال ، في js المستعرض) ، تحتاج إلى إضافة الدالة المجمع يدوياً (يتم تلقائياً في node.js):

var singleton = function() {
    var socketList = {};
    return {
        add: function() {},
        ...
    };
}();



Related