2010-09-17 11 views
9

Io uso rescue per tutto, non solo per "salvare" le eccezioni. Voglio dire, mi piace il modo in cui mi risparmia la verifica e il doppio controllo dei dati.Sto abusando di "salvataggio" per assegni nulli?

Ad esempio, diciamo che ho un modello Item quello che può o non può avere un User. Poi, quando voglio ottenere il nome del proprietario della voce scrivo:

item.user.name rescue "" 

invece di qualcosa come

item.user.nil? ? "" : item.user.name 

Fa lo stesso pensare, dal momento che nil.name grilletto un'eccezione che ho soccorso con "" , ma non sono abbastanza sicuro che questa è una buona pratica. Rende ciò che voglio e lo fa con meno codice, ma ... non lo so, tutte le parole che mi vengono in questo modo mi fanno sentire insicuro.

È una cattiva pratica o è un abuso valido della parola chiave rescue?

+1

Avdi Grimm sostiene che 'try' è un codice olfattivo http://devblog.avdi.org/2011/06/28/do-or-do-not-there-is-no-try/ e http://devblog.avdi.org/2011/07/05/demeter-its-not-just-a-good-idea-its-the-law/, quindi non è solo il modo in cui lo stai facendo è male, ma quello che stai cercando di fare è male. –

+1

@AndrewGrimm qualche relazione? – ybakos

+1

@ybakos Non lo so, ma non siamo [fratelli] (http://en.wikipedia.org/wiki/Brothers_Grimm). –

risposta

7

Penso che si stia abusando un po 'di soccorso, anche se in Rails esiste un metodo specifico per questi problemi: try. Documentation

Nel tuo caso, item.user.try(:name) potrebbe essere un approccio più gradevole.

+1

In realtà, poiché ha detto che 'item' può o non può avere un' utente', credo che avrebbe bisogno di 'item.try (: user) .try (: name)':] –

+1

Non ci credo . Se non ha un oggetto, allora sì, hai ragione. Ma, se l'oggetto può avere o meno un utente, questo è l'intero punto dell'uso di 'try', per cogliere quelle situazioni in cui' item.user' restituisce nil invece di un 'User'. – theIV

1

Come nella maggior parte delle altre lingue, eseguire il controllo sarà più rapido rispetto all'utilizzo di soccorso.

3

Direi che non è una buona abitudine entrare. Non ho mai usato questa funzione in Ruby perché sembra che stia nascondendo dei casi di errore. Vale anche la pena notare che stai salvando tutte le eccezioni senza specificare alcun tipo di errore previsto. Sembra sempre che sia qualcosa che sta facendo il debugging lungo la strada più difficile di quanto dovrebbe essere, anche se, come ho detto, non mi sono mai preso la briga di usarlo da solo.

1

In alternativa all'abuso di rescue, consulta la gemma andand. È simile allo try suggerito, ma più bello. andand consente di dire:

item.user.andand.name 

L'espressione sarà nil se item.user è nil.

Problemi correlati