49 votes

Écrit Maintenable Event-Driven Code

J'ai récemment commencé à jouer avec événementiel d'architectures, venant d'une assez standard état d'esprit orienté objet.

La première chose que j'ai remarqué, c'est que la difficulté dans la compréhension et le suivi par le biais de programmes semble augmenter de façon exponentielle avec la taille du programme. Alors que les petits animaux de projets sont faciles à suivre, il se sent comme le code va rapidement tourner à spaghetti.

Je comprends que je suis nouveau sur ce développement de l'état d'esprit et pas toutes mes orientée objet soucis du report. Existe-il des ressources sur l'écriture maintenable, compréhensible event-driven code? Que font les gens qui l'utilisent node.js ou Tordu ou un Événement Machine à faire à ce sujet?

7voto

sh1mmer Points 1011

J'ai fait une conférence sur ce thème à Yahoo l'année dernière: http://www.yuiblog.com/blog/2010/12/06/video-yuiconf2010-croucher/ c'est peut-être utile.

6voto

6voto

sarnold Points 62720

Martyn Loughran écrit un excellent article court entièrement sur la façon d'éviter le rappel des spaghettis.

Ce que j'ai vraiment aimé à propos de son article est le processus de l'amélioration de spaghetti en quelque chose de beau et propre; cela peut sembler un peu formalisées au premier abord, mais quand vous voyez le résultat final, je pense que vous serez d'accord qu'il présente un réel talent artistique en propre, lisible, code.

4voto

Enki Points 116

Je vais utiliser Python comme exemple car c'est ce que j'utilise pour construire d'énormes applications distribuées dès maintenant.

Twisted python permet une très impératif de style en utilisant soit inlinecallbacks ou (un peu plus laide) deferredGenerator les styles. Ces méthodes vous permettent d'écrire des procédures d'utilisation déterminées par les événements de rappel code qui est beaucoup plus facile à lire et à comprendre. L'application transforme votre fonction dans un paresseux séquence qui génère une séquence de deferreds.

Plus précisément, vous n'avez pas à construire une profondément imbriqués ensemble de fonctions de rappel/λ/fermetures, et peut, au lieu de céder le contrôle d'une fonction de retour de la boucle d'événements à points arbitraires. Vous pouvez mentalement ré-étiqueter ce que les coroutines ou le multitâche coopératif si vous le souhaitez. Il fait le travail. Un exemple serait (à l'aide de la plus laide deferredGenerator style) comme ceci:

@defer.deferredGenerator
def foo(arg):
    bar = nonBlockingFunction(foo)
    baz = waitForDeferred(aFunctionThatReturnsADeferredToo(bar))
    yield baz #Returns control to the event loop
    output = baz.getResult() #This gets the output of aFunctionThat...Too above
    yield output #This is how we return a result instead of using return

@defer.deferredGenerator
def aFunctionThatReturnsADeferredToo(put_bar_here):
    """Stuff happens here...."""
    ...etc...

Il y a un autre post qui montre la inlineCallbacks méthode, qui est plus propre, mais nécessite python 2.5 ou plus récente (ce qui signifie pas sous Centos/RHEL 5 de la série, dont je suis malheureusement bloqué avec pour mon application). Si vous pouvez l'utiliser.

Comme vous pouvez le voir, cela ressemble à la vieille école python impératif de choses que vous connaissez et aimez, mais est beaucoup plus facile à maintenir sans une tonne de fonctions imbriquées et les lambdas. Je souhaite toujours python avait blocs.

Comme pour le débogage, vous pouvez activer tordu réacteur de débogage à l'aide de la reporter.setDebugging(Vrai) appeler quelque part dans votre code d'initialisation. Cela permettra de joindre l'original de sperme qui a soulevé une exception dans votre code, de sorte que vous pouvez trivialement voir où l'erreur s'est EFFECTIVEMENT produite. N'oubliez pas d'éditer le setDebugging déclaration avant d'aller en production, car il en résulte une ÉNORME quantité supplémentaire de l'introspection (regarder dans le strace si vous voulez être totalement horrifié).

4voto

jrydberg Points 301

Pour Torsadée, au lieu de l'aide de l'ancien deferredGenerator je recommande le inlineCallbacks; Il vous permet de rédiger le blocage de style de code et encore jouer gentiment avec la boucle d'événements.

@defer.inlineCallbacks
def foo(arg):
    bar = nonBlockingFunction(foo)
    output = yield FunctionThatReturnsADeferredToo(bar)
    defer.returnValue(output) #This is how we return a result instead of using return

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X