سؤال

ولدي فئتين: الحساب والمشغل. يحتوي على حساب قائمة المشغلين. الآن، كلما عامل (في القائمة) يتلقى رسالة أريد أن يخطر الكائن حساب لتنفيذ بعض منطق الأعمال أيضا.

وأفكر في ثلاثة بدائل حول كيفية تحقيق ذلك:

1) أن يكون حاصلا على إشارة داخل المشغل إلى الحاوية [حساب] الكائن، وندعو وسائل مباشرة. ليست جيدة على الاطلاق بسبب المراجع الدائرية.

2) استخدام الأحداث. وبقدر ما أعرف أن هناك أي حال من المدمج في التعامل مع آلية في بيثون. لذلك، هذا هو واحد صعبة بعض الشيء لتنفيذها.

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

وأتساءل النهج الذي هو الأكثر فائدة من وجهة نظر معمارية. كيف يمكنك عادة التعامل مع هذه المهمة؟

وسيكون رائعا لو أمكن الإشارة إلى قصاصات في بيثون.

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

المحلول

وأنت الإفراط في التفكير هذه. عنجد. الثعبان ليس C ++؛ مخاوفك غير قابلة القضايا في بيثون. اكتبوا ما المنطقي في مجال مشكلتك.

و"ليست جيدة على الاطلاق بسبب إشارات دائرية."

لماذا لا؟ دائرية هي من لا علاقة هنا على الإطلاق. علاقات ثنائية الاتجاه هي أشياء عظيمة. استخدمهم. بيثون القمامة تجمع لهم على ما يرام دون أي تفكير على الجزء الخاص بك.

ما مشكلة ممكن لديكم مع (birectional) العلاقات المتبادلة؟

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

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

ما مشكلة ممكن لديكم مع التعامل مع كائنات المشغل؟

نصائح أخرى

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

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

في قانون بلدي، "مفتاح" لتسجيل الأحداث هي الطبقة لهذا الحدث. يستخدم EventManager قاموس (فئة الحدث -> قائمة المراقبين) لمعرفة أي حدث يجري فيها. في قانون الإعلام، ومن ثم يمكنك استخدام dict.get(event.__class__, ()) للعثور على مستمعيك.

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

وأيضا، إذا كنت تستخدم واجهة المستخدم الرسومية الإطار، قد يكون لديك بالفعل إطار الحدث الذي يمكن ربط إلى، على سبيل المثال <لأ href = "http://www.riverbankcomputing.co.uk/software/pyqt/intro "يختلط =" نوفولو noreferrer "> باي كيوت ديه إشارات وفتحات.

>>> class Account(object):
...     def notify(self):
...         print "Account notified"
...
>>> class Operator(object):
...     def __init__(self, notifier):
...         self.notifier = notifier
...
>>> A = Account()
>>> O = Operator(A.notify)
>>> O.notifier()
Account notified
>>> import gc
>>> gc.garbage
[]
>>> del A
>>> del O
>>> gc.garbage
[]

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

وأخيرا، يمكنك دائما استخدام Kamaelia للحصول على هذا النوع من الشيء.

وهناك نمط المراقب قصاصات في جميع أنحاء الشبكة. مصدر جيد من التعليمات البرمجية موثوق هو حالة نشطة، منها مثلا:

http://code.activestate.com/recipes/131499/

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