Question

J'ai deux classes: compte et opérateur. Le compte contient une liste d'opérateurs. Désormais, chaque fois qu'un opérateur (dans la liste) reçoit un message, je souhaite notifier à l'objet Compte de réaliser également une logique métier.

Je pense à trois solutions pour y parvenir:

1) Dans l’opérateur, gardez une référence à l’objet [Compte] conteneur et appelez directement les méthodes. Pas tout à fait bon à cause des références circulaires.

2) Utilisez les événements. Autant que je sache, il n'y a pas de mécanisme intégré de gestion des événements en Python. Donc, celui-ci est un peu difficile à mettre en œuvre.

3) N'envoyez pas de messages directement aux opérateurs. Au lieu de cela, gérez uniquement les comptes et, en leur sein, en interne, les opérateurs de gestionnaires. Celui-ci est un peu limitant car dans ce cas, je ne peux pas transmettre de références à des opérateurs.

Je me demande quelle approche est la plus avantageuse du point de vue architectural. Comment gérez-vous habituellement cette tâche?

Ce serait bien si vous pouviez signaler des extraits de code en Python.

Était-ce utile?

La solution

Vous réfléchissez à cela. Sérieusement. Python n'est pas C ++; vos préoccupations ne sont pas des problèmes en Python. Il suffit d’écrire ce qui a du sens dans votre domaine de problèmes.

" Pas tout à fait bon à cause des références circulaires. "

Pourquoi pas? La circularité n'a aucune pertinence ici. Les relations bidirectionnelles sont de bonnes choses. Utilise les. Les ordures Python les récupère très bien, sans aucune réflexion de votre part.

Quel problème potentiel avez-vous avec les relations mutuelles (bidirectionnelles)?

"... n'utilisez que des comptes et, en leur sein, en interne, des opérateurs de traitement. Celui-ci est un peu limitant car dans ce cas, je ne peux pas transmettre de références à des opérateurs. "

Quoi? Vos opérateurs sont des objets Python, transmettez tout ce que vous voulez. Tous les objets Python sont (en effet) des références, ne vous en faites pas.

Quel problème avez-vous avec la manipulation d’objets Opérateur?

Autres conseils

Il n’existe pas de "one-size-fits-all". solution pour le motif Observer. Toutefois, il est généralement préférable de définir un objet EventManager dans lequel les parties intéressées peuvent s’inscrire elles-mêmes à certains événements et les publier chaque fois qu’elles se produisent. Cela crée simplement moins de dépendances.

Notez que vous devez utiliser une instance globale EventManager, ce qui peut poser problème lors des tests ou d'un point de vue général OO (c'est une variable globale). Je déconseille vivement de passer tout le temps à EventManager car cela encombrerait votre code.

Dans mon propre code, la " clé " pour l'enregistrement d'événements est la classe de l'événement. EventManager utilise un dictionnaire (classe d'événements - > liste d'observateurs) pour savoir quel événement se passe où. Dans le code de notification, vous pouvez ensuite utiliser dict.get (event .__ class__, ()) pour rechercher vos auditeurs.

Je voudrais utiliser la gestion des événements pour cela. Vous n'êtes pas obligé de l'implémenter vous-même. J'utilise pydispatcher pour exactement ce type de gestion d'événements, et cela a toujours très bien fonctionné (il utilise des références faibles en interne pour éviter le problème des références circulaires).

De même, si vous utilisez un framework d'interface graphique, vous pouvez déjà avoir un framework d'événement auquel vous pouvez vous connecter, par exemple PyQt a des signaux et des 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
[]

Une chose que vous ignorez peut-être sur les méthodes d’instance est qu’elles sont liées lorsque l’on cherche dans la syntaxe à points. En d’autres termes, dire A.notify lie automatiquement le paramètre auto de notifier à A. Vous pouvez alors conserver une référence à cette fonction sans créer de déchet irrécupérable.

Enfin, vous pouvez toujours utiliser Kamaelia pour ce type de choses.

Il existe des fragments de modèle Observer sur le Web. Une bonne source de code fiable est l’état actif, E.G:

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top