Come aggiungere funzionalità alle classi Ruby con i decoratori

I decoratori ci permettono di aggiungere comportamenti agli oggetti in runtime e non influenzano altri oggetti della classe. I decoratori possono essere applicati quando è necessario aggiungere e rimuovere dinamicamente la responsabilità a una classe. Il pattern decoratore è un'utile alternativa alla creazione di sottoclassi. Forniscono funzionalità aggiuntive a una classe pur mantenendo coerente l'API pubblica. Diamo un'occhiata ad un esempio per comprendere l'importanza dei Ruby Decorators. consideriamo di avere una classe Tattoo con un metodo di prezzo che restituisce 300.
Classe Tattoo prezzo def 300 fine fine
Ora aggiungeremo un colore extra come caratteristica e il prezzo aumenterà di 150 Il modo più semplice è creare una sottoclasse TattooWithColour che restituisca 450 nel metodo del prezzo.
class TattooWithColour < Tattoo def prezzo 450 end end
Successivamente, dobbiamo rappresentare un grande tatuaggio che aggiunga 200 al prezzo dei nostri tatuaggi. Possiamo rappresentare questo utilizzando una sottoclasse Big Tattoo di Tattoo.
classe Big Tattoo < Tattoo def prezzo 500 end end
Potremmo anche avere tatuaggi di dimensioni più grandi e potrebbero aggiungere ulteriore prezzo al nostro Big Tattoo. Se dovessimo considerare che questi tipi di tatuaggi potrebbero essere usati con i colori, dovremmo aggiungere le sottoclassi Big Tattoo With Colour e Bigger Tattoo With Colour. Con questo metodo, otteniamo un totale di 6 classi. Puoi anche raddoppiare il numero se vuoi rappresentare queste combinazioni con disegni extra sul tatuaggio.

Ereditarietà dinamica con i moduli

Per semplificare il nostro codice, potremmo utilizzare moduli per aggiungere dinamicamente comportamenti alla nostra classe Tattoo. Scriviamo i moduli Colour Tattoo e Big Tattoo per questo.
modulo Colour Tattoo def prezzo super + 150 fine fine
modulo Big Tattoo def prezzo super + 200 fine fine
Ora possiamo estendere dinamicamente i nostri oggetti tatuaggio utilizzando il metodo Object#extend. tatuaggio = Tattoo.nuovo tatuaggio.extend(ColourTattoo) tatuaggio.extend(GrandeTatuaggio) Questo è un buon miglioramento rispetto alla nostra implementazione basata sull'ereditarietà. Invece di avere sottoclassi, abbiamo solo una classe e 3 moduli. Se avessimo bisogno di aggiungere ulteriore progettazione all'equazione, avremmo bisogno solo di quattro moduli invece di 12 classi.

Applicazione del motivo decoratore

Questa soluzione basata su moduli ha semplificato notevolmente il nostro codice, ma possiamo ancora migliorarlo utilizzando il decoratore. Considereremo un BiggerTatto come formato aggiungendo due volte 150 al costo di un tatuaggio. Non possiamo farlo con il nostro approccio basato sui moduli. Sarebbe forte la tentazione di chiamare due volte tattoo.extend(Big Tattoo) per ottenere Bigger Tattoo. La seconda estensione del modulo non ha effetto quando abbiamo già utilizzato quelli di estensione. Se dovessimo continuare ad utilizzare la stessa implementazione, avremmo bisogno di un modulo Bigger Tattoo che restituisca super + 300 come costo. Possiamo invece utilizzare un decoratore che può essere composto per creare oggetti complessi. Iniziamo con un decoratore chiamato Big Tattoo che avvolge un oggetto Tattoo.
class BigTatto def inizializza(tattoo) @tattoo = fine tatuaggio
def prezzo @tattoo.price + 150 end end
Ora è possibile creare un tatuaggio più grande utilizzando questo wrapper due volte su un oggetto tatuaggio. tatuaggio = Tattoo.nuovo big_tattoo= Grandetatuaggio.new(tattoo) più grande_tattoo = Grandetatuaggio.new(big_tattoo) Allo stesso modo possiamo rappresentare il tatuaggio a colori utilizzando un decoratore TattooWithColour. Utilizzando solo tre classi, ora siamo in grado di rappresentare 6 tipi di tatuaggio. Con una ricca esperienza in tutti gli aspetti dello sviluppo di Ruby On Rails, noi di Railscarma, ti offriamo un'ampia gamma di servizi per aiutarti a implementare una strategia completa e personalizzata per comunicare con i tuoi potenziali clienti e i tuoi clienti al momento giusto, attraverso i canali giusti. Per ulteriori dettagli Contattaci.

Iscriviti per gli ultimi aggiornamenti

Articoli correlati

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *

it_ITItalian