Domanda

Mi chiedo solo come altri sviluppatori affrontano questo problema di ottenere 2 o 3 risposte da un metodo.

1) restituisce un oggetto []
2) restituire una classe personalizzata
3) utilizzare una parola chiave out o ref su più variabili
4) scrivere o prendere in prestito (F #) una semplice Tupla & Lt; & Gt; classe generica
http://slideguitarist.blogspot.com/2008/02/whats- f-tuple.html

Ora sto lavorando su un codice che aggiorna i dati. Dal metodo che esegue l'aggiornamento vorrei tornare indietro (1) Aggiorna ora di inizio e (2) Aggiorna ora di fine.
In un secondo momento potrei voler restituire un terzo valore.

Pensieri? Qualche buona pratica da progetti .NET open source su questo argomento?

È stato utile?

Soluzione

La tua domanda indica la possibilità che restituirai più dati in futuro, quindi ti consiglio di implementare la tua classe per contenere i dati.

Ciò significa che la firma del tuo metodo rimarrà la stessa anche se la rappresentazione interna dell'oggetto che stai passando cambia per contenere più dati. È anche una buona pratica per motivi di leggibilità e incapsulamento.

Altri suggerimenti

Dipende interamente da quali sono i risultati. Se sono correlati tra loro, di solito creo una classe personalizzata.

Se non sono realmente correlati, utilizzerei un parametro out o dividerei il metodo. Se un metodo vuole restituire tre elementi non correlati, probabilmente sta facendo troppo. L'eccezione a questo è quando stai parlando attraverso un confine del servizio web o qualcos'altro in cui un & Quot; purer & Quot; L'API potrebbe essere troppo loquace.

Per due, di solito 4)

Più di questo, 2)

Code Architeture saggio andrei sempre con una classe personalizzata quando ho bisogno di cambiare un po 'di una specifica quantità di variabili. Perché? Semplicemente perché una Classe è in realtà un & Quot; blueprint & Quot; di un tipo di dati spesso usato, la creazione del proprio tipo di dati, che in questo caso è, ti aiuterà a ottenere una buona struttura e ad aiutare gli altri a programmare per la tua interfaccia.

Personalmente, odio i parametri di riferimento / ref, quindi preferirei non usare questo approccio. Inoltre, la maggior parte delle volte, se devi restituire più di un risultato, probabilmente stai facendo qualcosa di sbagliato.

Se è davvero inevitabile, probabilmente sarai più felice nel lungo periodo a scrivere una classe personalizzata. Restituire un array è allettante in quanto è facile ed efficace nel breve periodo, ma l'uso di una classe ti dà la possibilità di cambiare il tipo di ritorno in futuro senza doversi preoccupare troppo di causare problemi a valle. Immagina il potenziale per un incubo di debug se qualcuno scambia l'ordine di due elementi nell'array che viene restituito ....

Uso solo se sono solo 1 o 2 variabili aggiuntive (ad esempio, una funzione restituisce un valore booleano che è il risultato importante effettivo, ma anche un parametro out per restituire la durata della funzione, ai fini della registrazione) .

Per qualcosa di più complicato, di solito creo una struttura / classe personalizzata.

Penso che il modo più comune in cui un programmatore C # farebbe questo sarebbe avvolgere gli oggetti che vuoi restituire in una classe separata. Ciò fornirebbe la massima flessibilità per il futuro, IMHO.

Dipende. Per un'API solo interna, di solito sceglierò l'opzione più semplice. Generalmente è fuori.

Per un'API pubblica, una classe personalizzata di solito ha più senso, ma se è qualcosa di abbastanza primitivo, o il risultato naturale della funzione è un valore booleano (come *. TryParse) rimarrò con un parametro fuori. Puoi anche fare una classe personalizzata con un cast implicito da booleare, ma di solito è solo strano.

Per la tua situazione particolare, una semplice classe DateRange immutabile mi sembra più appropriata. Puoi facilmente aggiungere quel nuovo valore senza disturbare gli utenti esistenti.

Se vuoi rinviare l'ora di inizio e fine dell'aggiornamento, ciò suggerisce una possibile classe o struttura, forse chiamata DataRefreshResults. Se anche il tuo terzo valore è correlato all'aggiornamento, potrebbe essere aggiunto. Ricorda, una struttura viene sempre passata per valore, quindi non è necessaria la raccolta di dati inutili nell'heap.

Alcune persone usano KeyValuePair per due valori. Non è eccezionale, perché etichetta le due cose come Key e Value. Non molto descrittivo. Inoltre trarrebbe grande beneficio dall'aver aggiunto questo:

public static class KeyValuePair
{
    public static KeyValuePair<K, V> Make(K k, V v) 
    { 
        return new KeyValuePair<K, V>(k, v); 
    }
}

Ti evita di dover specificare i tipi quando ne crei uno. I metodi generici possono inferire i tipi, i costruttori di classi generici no.

Per il tuo scenario potresti voler definire la classe Range {T} generica (con i controlli per la validità dell'intervallo).

Se il metodo è privato, di solito uso le tuple da la mia libreria di helper . I metodi pubblici o protetti generalmente meritano sempre separati.

Restituisce un tipo personalizzato, ma non usare una classe, usa una struttura - nessuna allocazione di memoria / overhead di garbage collection significa nessun aspetto negativo.

Se 2, una coppia.

Se più di 2 a classe.

Un'altra soluzione è quella di restituire un dizionario di riferimenti a oggetti con nome. Per me, questo è abbastanza equivalente all'utilizzo di una classe di ritorno personalizzata, ma senza il disordine. (E usando RTTI e la riflessione è altrettanto semplice come qualsiasi altra soluzione, anche se in modo dinamico.)

Dipende dal tipo e dal significato dei risultati, nonché dal fatto che il metodo sia privato o meno.

Per i metodi privati, di solito uso solo una Tupla, dalla mia libreria di classi.

Per i metodi pubblici / protetti / interni (es. non privati), utilizzo il parametro out o una classe personalizzata.

Ad esempio, se sto implementando il modello TryXYZ, in cui hai un metodo XYZ che genera un'eccezione in caso di errore e un metodo TryXYZ che restituisce valori booleani, TryXYZ utilizzerà un parametro out.

Se i risultati sono orientati alla sequenza (cioè restituiscono 3 clienti che dovrebbero essere elaborati), di solito restituirò un tipo di raccolta.

A parte questo, di solito uso solo una classe personalizzata.

Se un metodo produce da due a tre valori correlati, li raggrupperei in un tipo. Se i valori non sono correlati, è molto probabile che il metodo stia facendo troppo e lo trasformerei in una serie di metodi più semplici.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top