Oui, il vous manque définitivement quelque chose . Gotos serait généralement utilisé, comme vous l'avez dit, pour effectuer un transfert de contrôle à sens unique.
Cependant, les événements ne font pas cela. Lorsque le code déclenche l'événement, il sait très bien qu'une fois l'événement publié (ou traité, mis en file d'attente, déclenché ... etc), l'exécution du code reprendra sur la ligne suivante du code qui a généré l'événement.
L'utilisation de goto crée un couplage très étroit entre le code qui appelle cette instruction et le code qui se trouve à l'extrémité de réception. Le développeur doit avoir une connaissance intime des deux endroits pour utiliser goto.
D'un autre côté, le code qui déclenche des événements ne sait généralement pas ou ne se soucie pas de qui souhaite écouter cet événement. Il pourrait y avoir un auditeur. Ou il pourrait y avoir 100 auditeurs ou 0. Ces auditeurs pourraient être dans le même programme où l'événement a été déclenché, ou ils pourraient être dans une application complètement différente, ou ils pourraient être sur une machine différente. Pour l'éditeur, dès qu'il génère l'événement, son travail est terminé.
Si vous êtes avec moi jusqu'à présent, ce que j'ai décrit ci-dessus est le cas idéal du modèle pub / sub. Malheureusement, dans le monde réel, les choses ne sont pas toujours idéales et il y a des cas où les éditeurs génèrent un événement, un abonné est invoqué, change tout un tas d'état et au moment où l'exécution du code temporel revient à l'éditeur "le monde" semble avoir été bouleversé. Et je suis sûr que vous avez rencontré cela dans le passé, car cette condition survient souvent lorsque le modèle pub / sub est implémenté de manière très simple (par exemple via l'utilisation de délégués ou d'événements en C #, ou de pointeurs de fonction / interface en C / C ++).
Mais ce problème n'est pas nécessairement le modèle pub / sub mais plutôt sa mise en œuvre. C'est pourquoi de nombreux systèmes s'appuient sur les files d'attente pour que lorsqu'un événement est publié, il soit simplement mis en file d'attente pour être invoqué plus tard, ce qui donne à l'éditeur une chance de terminer l'exécution alors que le monde est toujours intact. Lorsque l'éditeur a terminé son travail, une boucle d'événement (aka boucle de répartition) sautera les événements et invoquera des abonnés.
return
,try/catch
,break
,continue
,switch
- ce sont tousgoto
à différents niveaux de restriction construit Goto considéré comme nocif est nuisible à la réflexion sur le fonctionnement du code..