هل الفئة الثابتة مناسبة عندما تكون الحالة غير قابلة للتغيير؟

StackOverflow https://stackoverflow.com/questions/659148

  •  20-08-2019
  •  | 
  •  

سؤال

لنفترض أن لدي فصلًا بسيطًا يسمى WebsterDictionary لديها وظيفة يمكنها أخذ كلمة وإرجاع تعريفها.ربما تكون هناك وظيفة أخرى يمكنها أخذ تعريف وإرجاع كلمة.يتم استخدام الفصل طوال الوقت من قبل العديد من العملاء.

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

هل هذا مرشح جيد للفئة الثابتة؟لقد قرأت أن الفئات الثابتة يجب أن تكون عديمة الحالة... ولكن هذه الفئة لها حالة (قاموس الذاكرة) أليس كذلك؟

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

شكرًا.

هل كانت مفيدة؟

المحلول

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

نصائح أخرى

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

نصيحتي أن تسأل نفسك سؤالاً واحداً:هل سينهار العالم إذا قمت بإنشاء أكثر من واحد من هذه الكائنات؟إذا كان الأمر كذلك، استخدم فئة مفردة أو ثابتة.خلاف ذلك، استخدم فئة عادية.

قد يكون الفصل الثابت هو ما تريده هنا (انظر الإجابات الأخرى).لكن لا ترتكب خطأً بتسمية قاموسك بأنه "غير قابل للتغيير".

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

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

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

يمكنك إما الذهاب إلى فئة Singleton أو فئة ثابتة.من المحتمل أن أختار Singleton ولكني أعتقد أنها في الغالب مسألة تفضيل في هذه الحالة بالذات.

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

ما الذي تبحث عنه قد يكون Singleton؟

ليس من الضروري ألا يكون للفئة الثابتة حالة (يمكن أن تحتوي على أعضاء ثابتين كجزء منها، والذي يمكن أن يكون جزءًا من حالتها).

يبدو الأمر كما لو كنت تصف نمط أحادي الحالة:تريد نفس الشيء WebsterDictionary ليتم مشاركتها من قبل الجميع.لقد حدث أن WebsterDictionary هو أيضًا غير قابل للتغيير، ولكن هذا مصدر قلق متعامد:فقط اجعل من المستحيل التحديث (على سبيل المثال، باستخدام برنامج تضمين للقراءة فقط).

كما قلت فإن الفصل يحمل شكلاً من أشكال الدولة العالمية، حتى لو كان للقراءة فقط.يوضح اتباع نهج Singleton أنه يحتفظ بالبيانات.

إذا كنت تستخدم حقن التبعية، فيمكنك جعله يحقن مثيلات مفردة، بدلاً من جعل جميع الفئات تحتوي على كود يحصل لك على المثيل.هذا يعني أن الفئات الأخرى لن تكون مرتبطة بنهج Singleton، وإذا كان بإمكانك استبدالها بسهولة أكبر عند الاختبار (مدمجًا مع واجهة لتمكين الاستبدال مع نماذج الاختبار).

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top