Nel nostro codebase abbiamo molti controller con una struttura molto simile:
@my_model.update_owner(something)
if @my_model.update_attributes(params)
return render_object(@my_model)
else
return render_validation_error(@my_model)
end
Sebbene la struttura non sia esattamente la stessa ovunque, sembra fattibile per il refactoring. Potrebbe sembrare:
def update_model_and_render(model)
...
end
Certamente, salveremmo molte linee. Sarebbe anche utile per i futuri programmatori che implementano funzionalità simili. Chiamare la nuova funzione refactored impedirebbe loro di dimenticare di aggiungere la riga @ my_model.update_owner ().
Il problema con la nuova funzione è che produrrebbe un effetto collaterale e restituirebbe anche un valore. Chiaramente, interromperremmo la separazione della query di comando (la nuova funzione sarebbe opzionalmente referenziale).
Va bene piegare la regola in casi come questo per essere più SECCHI?
In un sacco di codice che ho visto, questo accade di solito ai confini del sistema (come un controller, dove avvengono le mutazioni ma restituiamo sempre un valore), ma non sono sicuro se c'è qualcos'altro potrebbe mancare.