Ruby: abuso di mixin

1

Attualmente sto lavorando con un codice che IMO ha abusato delle funzioni di mixy di Ruby. Dato che sono nuovo al rubino, mi chiedo se MO in IMO sia corretto o meno.

La mia domanda principale è ciò che ha più senso (e se ci sono delle differenze tecniche tra di loro):

per es.

1

per creare classi di helper singleton (o moduli con metodi di classe) per mantenere tutte le mie funzioni di "aiuto".

module Helper
  def foo(); p 'foo'; end  # instance method
end

class User
  include Helper     # foo() is now a method of User

  def initialize()
    foo()            # included, invoked on User class object
  end

end

------- O -------

2

crea moduli di mixin che contengono queste funzioni e include li ovunque io abbia bisogno di loro.

module Helper
  def self.foo(); p 'foo'; end  # class method
end

class User

  def initialize()
    Helper.foo()            # Invoked on Helper module object
  end

end

Un esempio del modo in cui è stato abusato nel mio caso:

module ComplexMathPerformer
  def perform_complex_math(); p 'perform_complex_math()'; end
end

module Renderer
  def render_3d_object()
    perform_complex_math() # from ComplexMathPerformer, which is NOT included here.
  end
end

module Game
  include ComplexMathPerformer
  include Renderer

  def play()
    render_3d_object()
  end

end

Questo codice funziona perché Game include sia Renderer che ComplexMathPerformer . Ma è un incubo per chi guarda ComplexMathPerformer e cerca di capire dove diavolo è definito foo() e come è accessibile in ComplexMathPerformer .

Logicamente ha più senso include ComplexMathPerformer , ma viene saltato perché Game include già ComplexMathPerformer (per i propri scopi). Ne fanno un casino.

    
posta Kashyap 11.02.2016 - 17:33
fonte

1 risposta

2

Controllando gli esempi, IMHO, non c'è abuso della funzione mixin di Ruby, ma accoppiamento tra i moduli ComplexMathPerformer e Renderer .

L'abuso di mixin è generalmente avvertito dagli sviluppatori quando esiste un'astrazione troppo ampia. I mixaggi devono essere utilizzati quando è necessario condividere il comportamento tra un paio di classi.

I moduli vengono solitamente utilizzati quando devi creare funzioni più come funzioni (metodi senza stato).

Forse ComplexMathPerformer logic dovrebbe essere all'interno del gioco, o in un'altra classe che il gioco consuma e non come un modulo nel tuo caso.

    
risposta data 11.02.2016 - 20:07
fonte

Leggi altre domande sui tag