2013-03-20 8 views
5

Sto lavorando a un progetto. Attualmente ho un'istruzione condizionale abbastanza grande, che assegna un valore a una variabile in base ad alcuni parametri di input. Quindi, ho qualcosa di simile.Assegnazione variabile condizionale refactoring

if some condition 
    x = some value 
elsif another condition 
    x = a different value 
    ... 

Qual è il modo migliore per refactoring questo? Spero di finire con qualcosa come

x = some value if some condition || another value if another condition 

Esiste uno schema per questo genere di cose?

+0

Prima di poter dire come refactoring, è necessario dirci perché si desidera refactoring questo. Che problema stai cercando di risolvere? –

+2

'refactor = nil a meno che esistano? (: Unit_tests)' – dbenhur

risposta

9

Basta mettere il compito al di fuori del if.

x = if some condition 
    some value 
elsif another condition 
    a different value 

Oppure è possibile utilizzare un hash.

x = dict[some condition] 
0

Non è un modello, ma un operatore. Quello ti riferisci è l'operatore ternario:

If Condition is true ? Then value X : Otherwise value Y 

Ecco un esempio:

speed = 90 
speed > 55 ? puts("I can't drive 55!") : puts("I'm a careful driver") 

Utilizzando l'istruzione ternario è breve, dolce, e fa il lavoro.

+0

Il mio condizionale è più lungo di un if se non altro. –

+0

Quindi rimango con l'istruzione 'if/elsif'. Non c'è niente di sbagliato nell'usarli. – BlackHatSamurai

+0

'puts (velocità> 55)? "Non posso guidare 55!" : "Sono un attento guidatore" ' – ZiggidyCreative

0
x = some condition ? some value : 
    another condition ? a different value : ... 
+1

Nesting? 'S non è una buona pratica. –

1

Un'istruzione condizionale è anche espressione, quindi una delle prime cose che puoi fare, se la variabile è lo stesso in ogni condizione, è:

x = if cond1 
    expr1 
elsif cond2 
    expr2 
.... 
end 

Se le condizioni sono tutti stati di una singola espressione, puoi renderlo ancora più ordinato, usando una dichiarazione del caso.

Tuttavia, il successivo esercizio di ri-factoring più ovvio consiste nel mettere il grande condizionale isolato in un metodo, che dovrebbe essere alimentato con i dati minimi richiesti per valutare tutte le condizioni e le espressioni.

E.g.

# Where conditional is currently, and x assigned, assuming the conditionals 
# need a couple of variables . . . 
x = foo param1, param2 

# Elsewhere 
private 

def foo p1, p2 
    if cond1 
    expr1 
    elsif cond2 
    expr2 
    .... 
    end 
end 
0

Se si desidera refactoring del codice per chiarezza e flessibilità, considerano il replacing conditional with polymorphism refactoring.

Non ci sono abbastanza dettagli nella tua domanda per andare oltre con le raccomandazioni, ma questo refactoring renderà la tua base di codice molto più resistente ai cambiamenti. Se si riceve un nuovo requisito, è una cattiva forma per rompere il condizionale e modificarlo (più incline all'introduzione di bug, più difficile da fare); è preferibile creare un nuovo oggetto che puoi collegare alla base di codice esistente. Questa flessibilità descrive ciò che è Open/Closed Principle (la "O" nell'acronimo SOLID).