Un argomento a favore del codice boilerplate è che se lo si modifica in un punto, influisce solo su un flusso del codice. Questo deve essere bilanciato dal fatto che più spesso che volere, in realtà una modifica influisce su ogni pezzo di codice che la usa. Ma ho visto esempi rari che supportano l'argomento.
Supponiamo che tu abbia un pezzo di codice che dice
public ForTheBar(Foo foo)
{
Bar bar = foo.bar();
return bar.BeFooed();
}
Questo è usato in circa 2 posizioni nel tuo codice.
Un giorno arriva qualcuno e dice "ok, solo in questo percorso, vogliamo che tu Grommit la barra prima di spillarlo."
E tu pensi "bene questo è semplice."
public ForTheBar(Foo foo, bool shouldIGrommit)
{
Bar bar = foo.bar();
if (shouldIGrommit)
{
bar.BeGrommitted();
}
return bar.BeFooed();
}
Quindi il tuo utente aggiunge alcune nuove funzionalità e pensi che si adatti bene a FooTheBar. E tu, doverosamente, chiedi loro se dovresti Grommit quel bar prima di Foo e loro dicono "no, non questa volta".
Quindi chiami semplicemente il metodo sopra.
Ma poi il tuo utente dice "ok, aspetta, nel terzo caso, vogliamo che tu scarti la barra prima di chiamare BeFooed."
Nessun problema, pensi, posso farlo.
public ForTheBar(Foo foo, bool shouldIGrommit, bool shouldIDoodle)
{
Bar bar = foo.bar();
if (shouldIGrommit)
{
bar.BeGrommitted();
}
if (shouldIDoodle)
{
bar.BeDoodled();
}
return bar.BeFooed();
}
Improvvisamente il tuo codice sta diventando meno essenziale. Forse avresti dovuto accettare le due righe di codice ripetute. Ormai avresti tre pezzi di codice, ciascuno lungo 2-3 linee e non sembra più molto ripetuto.
Tutto ciò detto, vorrei ribattere che con "questo non è un caso comune, e quando succede, puoi refactoring".
Un altro argomento che ho sentito di recente è che il codice boilerplate può talvolta aiutarti a navigare nel codice. L'esempio di cui stavamo discutendo era il punto in cui avevamo rimosso tonnellate di codice di mappatura boilerplate e l'abbiamo sostituito con AutoMapper. Ora, è stato discusso, perché tutto è basato sulla convenzione, non è possibile dire "Dove è questa proprietà impostata", all'IDE e aspettarsi che lo sappia.
Ho visto persone discutere argomenti simili sui contenitori IoC.
Per non dire che sono d'accordo con loro, ma è comunque un argomento equo.