Spiegazione relativa allo stile
Mentre il primo modulo è più corto, probabilmente verrebbe ammortizzato dai controllori di stile. È anche più semplice¹. Ad esempio:
IEnumerable<TResult> LoadEverything<T1, TResult>(
IEnumerable<T1> baseSet, bool includeChecked, bool useDefaults = false,
TResult defaultValue = null)
{
}
è difficile da capire, ma è ancora più semplice di:
IEnumerable<TResult> LoadEverything<T1, TResult>(
IEnumerable<T1> baseSet, includeChecked, useDefaults = false: bool,
TResult defaultValue = null)
{
// Does bool apply to includeChecked and useDefaults? Or maybe to baseSet too?...
}
Quindi guadagni qualche secondo digitando meno con il tuo approccio in casi facili, ma sei sicuro che tale zucchero sintattico costerà molto in termini di tempo speso a leggere e capire il codice quando viene abusato.
Problemi di analisi
Anche l'analisi di tale codice sorgente è più difficile.
Problemi di refactoring
Inoltre, il cambio e il refactoring del codice potrebbero essere anche difficili. Prendendo l'esempio sopra, chiediamo all'IDE di cambiare l'ordine dei parametri, ripristinando baseSet
e includeChecked
. Se l'IDE è abbastanza intelligente, lo farà correttamente. Se non lo è, produrrà un codice che non può essere compilato. Lo stesso errore può essere fatto se si esegue il refactoring manualmente.
IEnumerable<TResult> LoadEverything<T1, TResult>(
includeChecked, IEnumerable<T1> baseSet, useDefaults = false: bool,
TResult defaultValue = null)
{
// What's wrong? Why can't this piece of code compile?
}
Caso parametri senza carattere
Infine, se la tua lingua accetta parametri senza tipo, diventa impossibile da implementare. Il codice:
array<TResult> LoadEverything<T1, TResult>(
baseSet, bool includeChecked, bool useDefaults = false,
TResult defaultValue = null)
{
var set = cast(baseSet to array<T1>);
// [...]
}
funzionerà ancora, mentre:
array<TResult> LoadEverything<T1, TResult>(
baseSet, includeChecked, useDefaults = false: bool,
TResult defaultValue = null)
{
var set = cast(baseSet to array<T1>);
// [...]
}
non ha senso: se baseSet
è un valore booleano, come può essere convertito in un array?
¹ A proposito, hai un caso simile quando dichiari variabili dello stesso tipo. Una forma più breve è: int a = 3, b = 5, c = 1;
, ma nella maggior parte dei casi, vedresti tre righe, una dichiarazione per riga, ogni dichiarazione ha il suo tipo.