Vra

Ek het twee klasse: Rekening en Operateur. Rekening bevat 'n lys van operateurs. Nou, wanneer 'n operateur (in die lys) 'n boodskap ontvang ek wil rekening voorwerp in kennis te stel om 'n paar sake logika uit te voer sowel.

Ek dink aan drie alternatiewe oor hoe om dit reg te kry:

1) Hou 'n verwysing binne Operateur om die houer [rekening] voorwerp en noem metodes direk. Nie absoluut goed, want van omsendbrief verwysings.

2) Gebruik gebeure. Sover ek weet, is daar geen ingeboude gebeurtenis hantering meganisme in Python. So, hierdie een is 'n bietjie lastig om te implementeer.

3) Moenie boodskappe te Operateurs direk stuur. In plaas daarvan, werk net Rekeninge, en in hulle binneste, intern, hanteerder operateurs. Hierdie een is 'n bietjie te beperk want in hierdie geval kan ek nie verwysings slaag om te operateurs.

Ek wonder watter benadering is die mees voordelig is van die argitektoniese oogpunt. Hoe kan jy gewoonlik hierdie taak te hanteer?

Dit sal wonderlik wees as jy kan uitwys brokkies in Python.

Was dit nuttig?

Oplossing

Jy is oor-dink hierdie. Ernstig. Python is nie C ++; jou bekommernisse is nie-kwessies in Python. Net skryf wat sin maak in jou probleem domein.

"Nie heeltemal goed as gevolg van omsendbrief verwysings."

Hoekom nie? Sirkulariteit is van geen relevansie hier glad nie. Tweerigting verhoudings is groot dinge. Gebruik dit. Python vullis versamel hulle net mooi sonder enige denke van jou kant.

Watter moontlike probleem het jy met wedersydse (birectional) verhoudings?

"... werk net Rekeninge, en in hulle binneste, intern, hanteerder operateurs. Hierdie een is 'n bietjie te beperk want in hierdie geval kan ek nie slaag om verwysings na operateurs. "

Wat? Jou Operateurs is Python voorwerpe, slaag alles wat jy wil. Alle Python voorwerpe is (in effek) verwysings, sweet nie doen nie.

Watter moontlike probleem het jy met die manipulering van Operateur voorwerpe?

Ander wenke

Daar is geen "een-grootte-pas-almal" oplossing vir die Observer patroon. Maar gewoonlik is dit beter om 'n Event Manager voorwerp waar belangstellendes hulself kan registreer vir sekere gebeure en plaas hierdie gebeure wanneer dit gebeur definieer. Dit skep net minder afhanklikhede.

Let daarop dat jy nodig het om 'n globale Event Manager byvoorbeeld, wat problematies kan wees tydens die toets of van 'n algemene OO oogpunt (dit is 'n globale veranderlike) gebruik. Ek raai teen verby die Event Manager om al die tyd, want dit jou kode sal warboel.

In my eie kode, die "sleutel" vir die registrasie van gebeure is die klas van die gebeurtenis. Die Event Manager gebruik 'n woordeboek (event klas -> lys van waarnemers) te weet watter gebeurtenis gaan waar. In die kennisgewing kode, kan jy dan gebruik dict.get(event.__class__, ()) om jou luisteraars te vind.

Ek sou gebeurtenis hantering vir hierdie gebruik. Jy hoef nie om dit self te implementeer - Ek gebruik pydispatcher vir presies hierdie soort van hantering geval, en dit was nog altyd baie goed gewerk (dit gebruik swak verwysings intern, na die omsendbrief verwysing probleem te vermy).

Ook, as jy 'n gui raamwerk, wat jy dalk reeds 'n gebeurtenis raamwerk wat jy kan haak in, byvoorbeeld PyQt het seine en slots.

>>> 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
[]

Een ding wat jy dalk nie weet byvoorbeeld metodes is dat hulle gebind wanneer opgekyk by die gebruik van die dot sintaksis. Met ander woorde bind sê A.notify outomaties die self parameter van kennis stel om A. Jy kan dan 'n verwysing na hierdie funksie te hou sonder om oninvorderbare vullis.

Ten slotte, jy kan altyd gebruik Kamaelia vir hierdie tipe van ding.

Daar is Observer patroon Stukkies regoor die Web. 'N Goeie bron van betroubare kode is aktiewe toestand, Bv:

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

Gelisensieer onder: CC-BY-SA met toeskrywing
Nie verbonde aan StackOverflow
scroll top