Pourquoi le modèle observateur être obsolète?
J'ai remarqué que ma dépendance injecté, observateur-pattern-lourds de code (à l'aide de la Goyave est EventBus) est souvent beaucoup plus difficile de débogage de code que j'ai écrit dans le passé sans ces caractéristiques. En particulier lorsque vous essayez de déterminer quand et pourquoi observateur code est appelé.
Martin Oderski et amis a écrit un long papier avec un particulièrement séduisante titre, "Déconseiller le Modèle Observateur" et je n'ai pas encore pris le temps de le lire.
J'aimerais savoir ce qui est si mal avec le pattern observer et tellement mieux sur le (proposé ou autres) des solutions de rechange pour diriger de telles personnes les plus brillantes d'écrire ce papier.
Comme un début, je n'ai trouver un (divertissement) critique du livre ici.
- Discuté ici aussi ... lambda-the-ultimate.org/node/4028
Vous devez vous connecter pour publier un commentaire.
De citer directement le papier:
Pour illustrer les problèmes précis de l'observateur motif,
nous commençons avec un simple et omniprésent exemple: la souris en faisant glisser.
L'exemple suivant retrace les mouvements de la
de la souris au cours d'une opération de glisser dans un
Path
objet et afficheil sur l'écran. Pour garder les choses simples, nous utilisons Scala fermetures
à titre d'observateurs.
L'exemple ci-dessus, et comme nous l'expliquons l'observateur
motif tel que défini dans [25] en général, viole une impressionnante
line-up de logiciels importants principes de l'ingénierie:
Effets secondaires Observateurs de promouvoir les effets secondaires. Puisque les observateurs
sont apatrides, nous avons souvent besoin de plusieurs d'entre eux pour simuler
une machine d'état comme de la drague exemple. Nous avons à enregistrer
l'état où il est accessible à toutes les parties et les observateurs
comme dans la variable
path
ci-dessus.Encapsulation Comme la variable d'état
path
échappe à la portéedes observateurs, le pattern observer des pauses de l'encapsulation.
Composabilité Plusieurs observateurs font un meuble de la collection
des objets qui traitent un même souci (ou plusieurs,
voir le point suivant). Depuis plusieurs observateurs sont installés à
points différents à des moments différents, nous ne pouvons pas, par exemple,
facilement débarrasser d'eux complètement.
La séparation des préoccupations ci-dessus observateurs non seulement de trace
le chemin de la souris, mais aussi appeler un dessin de commande, ou
plus généralement, comprennent deux préoccupations différentes dans le
même le code d'emplacement. Il est souvent préférable de séparer le
les préoccupations de la construction de la voie et de l'afficher, par exemple,
comme dans le modèle-vue-contrôleur (MVC) [30] modèle.
Scalablity Nous pourrions parvenir à une séparation des préoccupations dans notre
exemple par la création d'une classe pour des chemins qui se publie
les événements lorsque le chemin de changements. Malheureusement, il n'y a pas de
garantie de la cohérence des données dans le modèle observateur.
Supposons que nous, serait de créer un autre événement de publication
objet qui dépend de changements dans notre chemin d'origine, par exemple,
un rectangle qui représente les limites de notre chemin. Aussi
envisager un observateur à l'écoute des changements dans les
chemin d'accès et ses limites afin d'en tirer un encadré chemin. Cette
observateur manuellement besoin pour déterminer si le
les limites sont déjà mis à jour et, si non, reporter le dessin
le fonctionnement. Sinon, l'utilisateur peut observer une image sur
l'écran qui a la bonne taille (un bug).
Uniformité Différentes méthodes pour installer les différents observateurs
baisse du code de l'homogénéité.
Abstraction Il y a un faible niveau d'abstraction dans l'exemple.
Il s'appuie sur un poids lourd de l'interface de contrôle
classe qui offre plus que de simples méthodes spécifiques à installer
événement de souris observateurs. Par conséquent, nous ne pouvons pas abstrait
plus de précision les sources d'événements. Par exemple, nous
pourrait permettre à l'utilisateur d'interrompre une opération de glisser en appuyant sur la échapper
clé ou d'utiliser un autre dispositif de pointage tel qu'une touche
écran ou une tablette graphique.
De la gestion des ressources Un observateur de la vie doit être
géré par les clients. Parce que des raisons de performances,
nous voulons observer le déplacement de la souris uniquement sur les événements au cours d'une
opération de glisser. Par conséquent, nous avons besoin de l'installer explicitement
et désinstaller le déplacement de la souris, observateur et nous avons besoin de
rappelez-vous le point de l'installation (contrôle ci-dessus).
Sémantique distance en fin de compte, l'exemple est difficile à comprendre
parce que le contrôle de flux est inversé dont les résultats
dans trop de code réutilisable qui augmente la sémantique
distance entre l'intention et les programmeurs
le code réel.
[25] E. Gamma, R. Helm, R. Johnson et J. Vlissides. Conception
motifs: éléments de logiciels orientés objets réutilisables.
Addison-Wesley Longman Publishing Co., Inc., Boston, MA,
États-unis, 1995. ISBN 0-201-63361-2.
Je crois que le pattern observer le niveau des inconvénients qui viennent avec le découplage des choses. L'Objet devient découplée de l'Observateur, mais vous ne pouvez pas il suffit de regarder son code source et de trouver qui l'observe. Codé en dur dépendances sont généralement plus faciles à lire et à penser, mais ils sont plus difficiles à modifier et de les réutiliser. C'est un compromis.
Comme pour le papier, il n'a pas d'adresse le pattern observer lui-même, mais à un usage particulier de il. En particulier: plusieurs apatrides Observateur objets pour unique objet de son observation. Cela a l'inconvénient évident de le séparer les observateurs avoir besoin de synchroniser les uns avec les autres (", Puisque les observateurs sont apatrides, nous avons souvent besoin de plusieurs d'entre eux pour simuler
une machine d'état comme de la drague exemple. Nous avons à enregistrer
l'état où il est accessible à toutes les parties et les observateurs
comme dans la variable de chemin d'accès ci-dessus.")
L'inconvénient ci-dessus est spécifique à ce type d'utilisation, de ne pas le modèle Observateur lui-même. Vous pouvez tout aussi bien créer un seul (stateful!) l'observateur de l'objet qui implémente toutes les
OnThis
,OnThat
,OnWhatever
méthodes et de se débarrasser du problème de la simulation d'une machine d'état dans de nombreux apatrides objets.path
def).Je serai brève, car je suis nouveau sur le sujet (et n'ai pas lu cet article encore).
Modèle observateur est intuitivement faux: L'Objet à observer sait qui est l'observation, l'Objet<>--Observateur).
C'est à l'encontre de la vie réelle (dans les événements basés sur des scénarios). Si je crie, je n'ai aucune idée de qui est à l'écoute; si un éclair, frappe le sol... la foudre ne sait pas qu'il y a un étage jusqu'à ce qu'il frappe!. Seuls les Observateurs savent ce qu'ils peuvent observer.
Quand ce genre de choses se produire ensuite de l'utilisation des logiciels à être un gâchis parce que construit à l'encontre de notre façon de penser-.
C'est comme si l'objet et de l'savaient ce que d'autres objets peuvent appeler ses méthodes.
De l'OMI, une couche comme "Environnement" est chargé de prendre les événements et d'aviser les personnes touchées. (OU mélanges de l'événement et le générateur de cet événement)
Événement-Source (sous réserve) génère des événements de l'Environnement. L'environnement fournit de l'événement à l'Observateur. Observateur a pu s'inscrire à la nature des événements qui l'affecte ou il est réellement définie dans l'Environnement. Les deux possibilités sens (mais je voulais être bref).
Dans ma compréhension du Modèle Observateur met ensemble, environnement & objet.
PS. la haine de mettre en paragraphes idées abstraites! 😛