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 il più delle volte, in realtà, si desidera che una modifica influisca su ogni parte di codice che lo utilizza. Ma ho visto esempi rari che supportano l'argomento.
Diciamo che hai un pezzo di codice che dice
public ForTheBar(Foo foo)
{
Bar bar = foo.bar();
return bar.BeFooed();
}
Questo è usato in circa 2 posti nel tuo codice.
Un giorno qualcuno arriva e dice "ok, solo in questo percorso, vogliamo che tu Grommit il bar prima di lanciarlo."
E 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 gli chiedi diligentemente se dovresti Grommit quel bar prima di Foo e loro dicono "no, non questa volta".
Quindi basta chiamare il metodo sopra.
Ma poi il tuo utente dice "ok, aspetta, nel terzo caso, vogliamo che scarabocchi la barra prima di chiamare BeFooed."
Nessun problema, pensi, posso farcela.
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 targhetta. Forse avresti dovuto accettare le due righe di codice ripetute. A questo punto avresti avuto tre pezzi di codice, ciascuno lungo 2-3 righe e non molto più ripetuto.
Detto questo, vorrei contrastare che con "questo non è un caso comune, e quando succede, puoi refactoring".
Un altro argomento che ho sentito recentemente è che il codice boilerplate a volte può aiutarti a navigare nel codice. L'esempio di cui stavamo discutendo era il punto in cui avevamo rimosso tonnellate di codice di mappatura del boilerplate e sostituito con AutoMapper. Ora, si è sostenuto, poiché tutto è basato su una convenzione, non si può dire "Dov'è questa proprietà impostata" all'IDE e aspettarsi che lo sappia.
Ho visto persone discutere cose simili sui container IoC.
Per non dire che sono d'accordo con loro, ma è comunque un argomento equo.