Rails: esempio utile di delegato e Law of Demeter

2

Attualmente sto imparando circa delegate e la legge di Demeter. Comprendo la legge di Demeter, ma non riesco a trovare un buon esempio di dove usare delegate per evitare di infrangere la legge sarebbe addirittura utile.

Voglio trovare un esempio correlato al mio progetto, dal momento che devo fare una presentazione. L'unica linea di codice che ho trovato potrebbe rompere la legge di Demeter è la seguente:

@game.promotions.find_by_promo_type("cross")

Il modello Game has_many Promotions e sta raggiungendo un altro modello per eseguire una chiamata find in base all'attributo promozioni promo_type . Da quanto ho capito, questa è una violazione della legge di Demeter e dovrei implementare la seguente soluzione.

class Game < ActiveRecord::Base
   has_many :promotions

   delegate :find_by_promo_type, :to => :promotion
end

Puoi darmi un esempio in cui ciò sarebbe effettivamente utile oltre a "La legge di Demetra dice così".

L'unica cosa che posso pensare, è che per qualche motivo volevo cambiare il nome di promotions in promos , quindi la soluzione sarebbe utile perché avrei solo bisogno di fare la seguente modifica e :find_by_promo_type funzionerà ancora per Game

class Game < ActiveRecord::Base
   has_many :promos

   delegate :find_by_promo_type, :to => :promos
end

L'unica cosa è, credo che questo argomento sia difettoso. Se dovessi cambiare il nome di un modello, dovrei anche reimpostare il codice in molti altri posti che non infrangono nemmeno la legge di Demeter. È difficile credere che tutto ciò che la Legge di Demetra può compiere riguardo a questo esempio.

Qualcuno può aiutarmi a capirlo.

    
posta user2158382 16.10.2013 - 06:56
fonte

1 risposta

1

Supponiamo, ad esempio, di voler memorizzare nella cache o registrare tale promozione solo quando l'accesso avviene tramite Gioco. Avendo infranto la Legge di Demetra, non puoi farlo facilmente. Devi trovare ogni riferimento a .promotions.find_by_promo_type e identificare quelli applicati a Giochi e modificarli in .find_promotion_by_promo_type prima di poter aggiungere quel codice.

Se lo hai delegato nel tuo codice, lo sostituisci semplicemente con un metodo completo (e poi rinominalo, se necessario).

Detto questo, la Legge di Demetra dovrebbe essere chiamata la Linea Guida di Demetra. È un ottimo principio da tenere a mente ma, come hai identificato, può aggiungere manutenzione agli aggiornamenti comuni, per evitare un grosso problema se apporti una modifica che sei sicuro al 99% che non farai mai.

    
risposta data 16.10.2013 - 11:57
fonte

Leggi altre domande sui tag