Come gestire le variabili durante l'estrazione di metodi in metodi più piccoli?

4

Questa è una domanda astratta per chiarire un concetto di refactoring nel linguaggio rubino. Supponiamo nel mondo reale che ci sarebbero molte più variabili e metodi nel metodo Furniture Class e Refinish.

Ho una classe chiamata Furniture.

Ha un metodo chiamato ' refurnish(VarnishToUse, TimeToTake) '. Questo metodo ha

varnish_cost = Varnish(VarnishToUse).price * TimeToTake

Voglio estrarre il calcolo dei costi in

def VarnishCost
  price * TimeToTake
end

quindi la classe Furniture può avere:

def Refurnish(VarnishToUse)
  varnish_cost = VarnishCost(VarnishToUse)
end

Come faccio a passare in VarnishToUse in VarnishCost? Il metodo dovrebbe essere

def VarnishCost(Varnish)
...
end

o dovrei impostare una variabile di istanza @varnish = VarnishToUse nella classe Refinish e quindi aspettarmi che la variabile di istanza sia disponibile nel metodo VarnishCost come ho mostrato sopra? Fa la differenza se l'altro metodo è privato? protetta?

Sto cercando di minimizzare l'uso di variabili e più responsabilità per una classe (SRP).

    
posta Michael Durrant 24.02.2012 - 04:50
fonte

2 risposte

1

Se questi sono tutti metodi nella classe Mobili, non è necessario "passare" nulla, basta accedere ai metodi:

class Furniture
  attr_accessor :time_to_take
  attr_accessor :varnish_to_use

  def varnish_cost
    varnish_to_use.price * time_to_take
  end

  def refurnish
    # varnish_cost * markup_percent + premium # if you want to affect the price more...
    varnish_cost
  end
end

class Varnish
  def self.price
    # default price
    10
  end
end

class BasicVarnish < Varnish
  def self.price
    5
  end
end

class PremiumVarnish < Varnish
  def self.price
    20
  end
end

so now:
f1 = Furniture.new(:time_to_take => 2, :varnish_to_use => BasicVarnish)
f1.refurnish => 10

f2 = Furniture.new(:time_to_take => 2, :varnish_to_use => PremiumVarnish)
f1.refurnish => 40

(PS Ho cambiato i nomi dei metodi in quanto è un po 'di confusione averli come costanti)

    
risposta data 24.02.2012 - 09:54
fonte
1

should I be setting an instance variable @varnish = VarnishToUse in the Refinish class

Dovresti farlo quando ci sono alcune altre funzioni nella tua classe Refinish che possono usare varnish , e quando hai una variabile un po '"globale" (nel contesto della tua classe) nel tuo codice non aumenta il rischio di malfunzionamenti (ad esempio, quando varnish non cambia più dopo la prima inizializzazione). Soprattutto la seconda condizione dovrebbe essere soddisfatta, altrimenti passare VarnishToUse come parametro.

    
risposta data 24.02.2012 - 08:10
fonte

Leggi altre domande sui tag