Comment ajouter des fonctionnalités aux classes Ruby avec des décorateurs

Les décorateurs nous permettent d'ajouter un comportement aux objets lors de l'exécution et n'affectent pas les autres objets de la classe. Les décorateurs peuvent être appliqués lorsque vous devez ajouter et supprimer dynamiquement des responsabilités à une classe. Le modèle décorateur est une alternative utile à la création de sous-classes. Ils donnent des fonctionnalités supplémentaires à une classe tout en gardant la cohérence de l'API publique. Regardons un exemple pour comprendre l'importance des Ruby Decorators. considérons que nous avons une classe Tattoo avec une méthode de prix qui renvoie 300.
Classe Tattoo prix déf 300 fin fin
Nous allons maintenant ajouter une couleur supplémentaire en tant que fonctionnalité, et le prix serait augmenté de 150 Le moyen le plus simple consiste à créer une sous-classe TattooWithColour qui renvoie 450 dans la méthode price.
classe TattooWithColour < Prix def tatouage 450 fin fin
Ensuite, nous devons représenter un gros tatouage qui ajoute 200 au prix de nos tatouages. Nous pouvons représenter cela en utilisant une sous-classe BigTattoo de Tattoo.
classe BigTattoo < Prix def tatouage 500 fin fin
Nous pourrions également avoir des tatouages de plus grande taille et ils pourraient ajouter un prix supplémentaire à notre BigTattoo. Si nous devions considérer que ces types de tatouages pourraient être utilisés avec des couleurs, nous devrions ajouter les sous-classes BigTattooWithColour et BiggerTattooWithColour. Avec cette méthode, nous obtenons un total de 6 classes. Doublez même ce nombre si vous souhaitez représenter ces combinaisons avec des motifs supplémentaires sur le tatouage.

Hériter dynamiquement avec des modules

Pour simplifier notre code, nous pouvons utiliser des modules pour ajouter dynamiquement un comportement à notre classe Tattoo. Écrivons les modules ColourTattoo et BigTattoo pour cela.
module ColourTattoo prix def super + 150 fin fin
module BigTattoo prix def super + 200 fin fin
Nous pouvons désormais étendre dynamiquement nos objets de tatouage en utilisant la méthode Object#extend. tatouage = Tattoo.new tatouage.extend(ColorTattoo) tatouage.extend(BigTattoo) Il s'agit d'une bonne amélioration par rapport à notre implémentation basée sur l'héritage. Au lieu d'avoir des sous-classes, nous n'avons qu'une seule classe et 3 modules. Si nous devions ajouter une conception supplémentaire à l’équation, nous n’aurions besoin que de quatre modules au lieu de 12 classes.

Application du motif décorateur

Cette solution basée sur des modules a grandement simplifié notre code, mais nous pouvons encore l'améliorer en utilisant le décorateur. Nous considérerons un BiggerTatto comme étant formé en ajoutant deux fois 150 au coût d'un Tattoo. Nous ne pouvons pas faire cela avec notre approche basée sur les modules. Il serait tentant d'appeler tattoo.extend(BigTattoo) deux fois pour obtenir BiggerTattoo. L'extension du module une deuxième fois n'a aucun effet lorsque nous en avons déjà utilisé des étendus. Si nous devions continuer à utiliser la même implémentation, nous aurions besoin d'un module BiggerTattoo qui renvoie super + 300 comme coût. Au lieu de cela, nous pouvons utiliser un décorateur qui peut être composé pour construire des objets complexes. Nous commençons par un décorateur appelé BigTattoo qui enveloppe un objet Tattoo.
class BigTatto def initialize(tattoo) @tattoo = fin du tatouage
prix def @tattoo.price + 150 fin fin
Un plus grand tatouage peut désormais être créé en utilisant ce wrapper deux fois sur un objet Tattoo. tatouage = Tattoo.new big_tattoo= BigTattoo.new(tatouage) big_tattoo = BigTattoo.new(big_tattoo) Nous pouvons de la même manière représenter un tatouage de couleur en utilisant un décorateur TattooWithColour. En utilisant seulement trois classes, nous sommes désormais capables de représenter 6 types de tatouage. Avec une riche expertise dans toutes les facettes du développement Ruby On Rails, nous, chez Railscarma, vous propose une large gamme de services pour vous aider à mettre en œuvre une stratégie globale et personnalisée pour communiquer avec vos prospects et vos clients au bon moment, via les bons canaux. Pour plus de détails Contactez-nous.

Abonnez-vous pour les dernières mises à jour

Articles Similaires

Laissez un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

fr_FRFrench