Non è un segno di nulla e non è né buono né cattivo design o stile di codifica.
Restituire più valori può effettivamente essere appropriato e consentire di scrivere meno codice. Prendiamo un esempio di un metodo che accetta una stringa come "-123abc"
e la converte in un intero come -123
:
(bool, int) ParseInteger(string text)
{
// Code goes here.
}
restituisce entrambi:
- un valore che indica se l'operazione è stata un successo,
- il numero convertito da stringa.
Come possiamo refactoring questo?
1. Le eccezioni
Possiamo aggiungere eccezioni, se la lingua le supporta. Ricorda che nella maggior parte delle lingue, le eccezioni sono costose in termini di risorse. Significa che se devi gestire molti non numeri, è meglio evitare di generare un'eccezione ogni volta che la stringa non può essere convertita in un numero.
2. Nuova classe
Possiamo creare una classe e restituire un'istanza di un oggetto di questa classe.
Ad esempio:
class ParsedInteger
{
bool IsSuccess { get; set; }
int Number { get; set; }
}
È più facile da capire? Più breve per scrivere? Porta qualcosa? Io non la penso così
3. Out parameters
Se la lingua lo supporta, possiamo anche utilizzare i parametri out
. Questo è l'approccio di C # in cui non è possibile restituire più valori. Ad esempio, durante l'analisi di un numero, utilizziamo: bool isSuccess = int.TryParse("-123abc", out i)
. Non sono sicuro di come sia meglio utilizzare i parametri out
rispetto a più valori. La sintassi non è ovvia, e anche StyleCop stesso (lo strumento utilizzato per applicare le regole di stile Microsoft predefinite sul codice) si lamenta di quei parametri, suggerendo di rimuoverli quando possibile.
Infine, nelle lingue come C # in cui non esiste una cosa come restituire più valori, le cose vengono progressivamente aggiunte per imitare il comportamento. Ad esempio, è stato aggiunto Tuple
per consentire la restituzione di diversi valori senza dover scrivere la tua classe o utilizzare i parametri out
.