L'exemple de code suivant a l'odeur de (Rx) Swift, mais la question est générique pour n'importe quel langage avec des caractéristiques réactives et une capacité de lancer. Considérons une fonction qui renvoie une séquence observable, mais effectue une vérification de cohérence avant de créer la séquence. Vérifier l'échec signifie que la séquence ne peut pas produire de valeurs.Réactivité: lancer ou publier l'erreur
func yieldFoos() -> Observable<Foo> {
guard isValid(internalFoo) else {
// throw or return one shot observable?
}
return createValidObservable(from: internalFoo)
}
En cas d'échec de la vérification de la validité de l'Etat, si la fonction lancer ou retourner un coup observable, qui produira jamais juste une erreur? Lancer des avantages et inconvénients:
Le lancement est logiquement plus propre (c'est une défaillance empêchant la création observable), mais entraîne un encombrement du code d'appel - bloc catch, plusieurs points de gestion des erreurs dans différentes portées d'exécution.
Un coup observable se traduit par un code d'appel plus court et plus propre, mais d'une manière ou d'une autre se sent mal. L'observable est forcé d'être un transporteur pour l'état d'erreur non séquentielle, par souci de brièveté.
Quelqu'un ayant une forte opinion mérite-t-il d'être suivi? Ou une autre solution négligée, élégante?
Il n'est pas faux qu'Observable génère une erreur. Je pense juste qu'une telle erreur devrait être "de l'observable" (incapacité à continuer la séquence), pas de créer l'observable en premier lieu. L'échec de la séquence est normal, l'échec de la création est une incohérence exceptionnelle, donc le lancement semble approprié. Mais l'existence d'un seul opérateur 'Observable.error' laisse entendre que je pense trop. –
Si votre fonction create a reçu un internalFoo invalide, il serait incapable de continuer la séquence ... :-) Il peut être utile de considérer l'erreur Observable comme leur version de throw, ou de la considérer comme un throw pour les évènements asynchrones .Cela fonctionne comme un lancer dans le fait qu'il se propage à travers le tuyau jusqu'à ce qu'il soit manipulé ... –
alors voulez-vous le dire de cette façon - dans un code réactif, il y a moins de cas d'utilisation pour lancer en général? Je pense que l'un des concepts réactifs clés est que tout pourrait être progressivement asynchrone et même paresseux, mais votre code de transformation ne devrait pas s'en soucier. Alors que le lancer est intrinsèquement synchrone ... –