Qual è il vantaggio di più valori di ritorno

4

Mi sento come se una dichiarazione di ritorno dovesse restituire solo un valore. Quando ritorna multiplo, le cose si confondono. So che dal momento che il tipo di ritorno in Java deve essere dichiarato, questo è difficile da fare, ma in linguaggi come Python è un gioco da ragazzi.

I valori di ritorno multipli sono un segno di design scadente o stile di codifica?

Esempio di Python


def get_name():
   # you code
   return first_name, last_name

    
posta AngryBird 26.07.2011 - 20:55
fonte

7 risposte

13

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 .

    
risposta data 26.07.2011 - 21:14
fonte
6

Quando la funzione restituisce un riferimento a un oggetto che contiene più membri, restituisce un valore o molti? Nell'esempio che mostri, la funzione restituisce effettivamente un oggetto di tipo tupla. Python capita semplicemente di supportare lo 'zucchero' sintattico in modo da non doverli sottrarre esplicitamente ai membri quando si effettuano assegnamenti dal valore restituito della funzione.

    
risposta data 26.07.2011 - 21:19
fonte
4

Bene, l'ho visto recentemente:

current_pixel = pixel[x,y]
# Formula for Orange: 50% red and more green than blue
if float(current_pixel[0])/(current_pixel[0]+current_pixel[1]+current_pixel[2]+1)>0.5 and current_pixel[1]>current_pixel[2]:

Ed ecco il modo corretto per farlo:

red, green, blue = pixel[x,y]
if green > blue and float(red) / (red + green + blue + 1) > 0.5:
    
risposta data 26.07.2011 - 21:36
fonte
3

Forse sarebbe meglio incapsulare questi valori in un oggetto - poiché chissà quando deciderà di restituire ancora più dati, giusto? :)

    
risposta data 26.07.2011 - 21:13
fonte
3

Bene, spero che non sia un segno di design scadente o stile di codifica come è comune nelle librerie integrate. Il tuo esempio di first_name, last_name mi sembra perfettamente ragionevole. Una volta che vai oltre alcuni valori ragionevoli e correlati, probabilmente ha senso esaminare altre alternative in modo da evitare di restituire una lista enorme di valori posizionali.

    
risposta data 26.07.2011 - 21:14
fonte
2

Suppongo che tu stia parlando di restituire qualcosa come una tupla, un oggetto o altre strutture di dati compositi. Usarli può spesso rendere un programma più chiaro, ma bisogna fare attenzione alla coesione e all'accoppiamento. Ho visto casi in cui viene passata un'enorme struttura dati che potrebbe essere facilmente sostituita da elementi globali, quando diverse parti del codice avrebbero dovuto essere responsabili di parti piccole e coerenti di esso.

    
risposta data 26.07.2011 - 21:14
fonte
1

No, non penso che tu possa dichiarare questo cattivo stile solo perché pensi che sia "confuso". In realtà, perché dovrebbe essere più confuso di avere più parametri quando si chiama la funzione. È più quello a cui sei abituato e se lo usi abbastanza spesso, non lo troverai più difficile.

    
risposta data 26.07.2011 - 21:17
fonte

Leggi altre domande sui tag