Refactoring if-else code bloque à la stratégie de stratégie avec un localisateur de service Symfony

DEV - 03/04
Photo par wals.io On Unclash Introduction Souvent dans votre code, vous implémenterez la logique ...

Photo par wals.io sur unclash

Introduction

Souvent, dans votre code, vous implémenterez une logique qui a quelques flux indépendants où un seul d'entre eux sera exécuté pendant l'exécution en fonction des conditions ou des paramètres spécifiques.

Par exemple, lors du traitement des paiements dans une boutique en ligne - il y aura un morceau de code pour gérer les paiements par carte de crédit, et un autre pour le traitement des transactions PayPal. Pour une seule commande, un seul d'entre eux sera utilisé - mais vous devez les rendre tous disponibles pour être appelés dans votre logique de traitement de commande.

Comment organiser un tel code d'une manière que vous ne vous retrouvez pas avec un énorme bloc contenantsidéclarations? La réponse est le modèle de stratégie!

Alors que je traversais un scénario similaire récemment, permettez-moi de vous guider sur la façon d'organiser bien une telle logique:

  • Nous utiliserons le modèle de stratégie pour garder différentes implémentations séparées les unes des autres.
  • Et puis, nous tirons parti du conteneur de service à partir du cadre Symfony afin que dans la classe client, nous puissions appeler les méthodes de classe de stratégie sélectionnées de manière élégante.

Commençons par tout mettre dans une classe

Première itération

Récemment, j'ai mis en œuvre une classe pour récupérer les prix de différents types d'actifs (actions, fonds, obligations, etc.). Cela m'a obligé à utiliser un tas d'API publiques - afin que je puisse utiliser le fournisseur API X pour les actions des marchés américains, le fournisseur pour les crypto-monnaies, etc.

Lors de l'écriture du code dans la première itération, j'ai commencé simplement - simplement en mettant des appels à une seule API dans une classe:

?php class AssetPriceService { //... public function getAssetPrice(Asset $asset): float { $response = $this-httpClient-> request ('get', $ this-> getpriceapiurl ($ actif)); $ content = $ réponse-> toArray (); return (float) $ contenu ['Results'] ['Price']; }}
Entrez le mode de sortie en mode plein écran

Ajout d'une autre implémentation du client API

La prochaine étape consiste à gérer le scénario lorsque nous voulons récupérer les prix de plusieurs types d'actifs - de différents fournisseurs d'API. La manière la plus triviale serait simplemen...
[Courte citation de 8% de l'article original]

Loading...