Domanda

Ho un metodo di classe che restituisce un elenco di dipendenti su cui posso scorrere.Qual è il modo migliore per restituire l'elenco?In genere restituisco semplicemente un ArrayList.Tuttavia, a quanto ho capito, le interfacce sono più adatte per questo tipo di azioni.Quale sarebbe l'interfaccia migliore da utilizzare?Inoltre, perché è meglio restituire un'interfaccia anziché l'implementazione (ad esempio un oggetto ArrayList)?Mi sembra semplicemente molto più lavoro.

È stato utile?

Soluzione

Personalmente, utilizzerei a Elenco<Dipendente> per creare l'elenco sul back-end, quindi utilizzarlo IList quando torni.Quando utilizzi le interfacce, ti dà la flessibilità di modificare l'implementazione senza dover modificare chi utilizza il tuo codice.Se volessi restare con un ArrayList, sarebbe un non generico IList.

Altri suggerimenti

@ Giasone

Puoi anche restituire IList<> perché un array effettivamente implementa questa interfaccia.

Il modo migliore per fare qualcosa del genere sarebbe restituire, come dici tu, un Elenco, preferibilmente utilizzando generici, quindi sarebbe Elenco<Employee>.

Restituire una List piuttosto che una ArrayList significa che se in seguito decidi di utilizzare, ad esempio, una LinkedList, non devi modificare nulla del codice oltre a dove crei l'oggetto per cominciare (cioè la chiamata a "new Lista di array())".

Se tutto ciò che stai facendo è scorrere l'elenco, puoi definire un metodo che restituisca l'elenco come IEnumerable (per .NET).

Restituendo l'interfaccia che fornisce solo le funzionalità di cui hai bisogno, se in futuro arriva un nuovo tipo di raccolta che è migliore/più veloce/una corrispondenza migliore per la tua applicazione, purché implementi ancora IEnumerable puoi riscrivere completamente il tuo metodo, utilizzando il nuovo tipo al suo interno, senza modificare nulla del codice che lo chiama.

C'è qualche motivo per cui è necessario ordinare la raccolta?Perché non restituire semplicemente un file IEnumerable<Employee>?Questo fornisce il minimo indispensabile: se in seguito volessi qualche altra forma di stoccaggio, come una borsa, un set, un albero o quant'altro, il tuo contratto rimarrebbe intatto.

Non sono d'accordo con la premessa secondo cui è meglio restituire un'interfaccia.La mia ragione è che vuoi massimizzare l'utilità esposta da un dato blocco di codice.

Tenendo questo in mente, un'interfaccia funziona per accettare un elemento come argomento.Se un parametro di funzione richiede un array o un ArrayList, questa è l'unica cosa che puoi passargli.Se un parametro di funzione richiede un IEnumerable, accetterà uno dei due, oltre a una serie di altri oggetti.È più utile

Il valore restituito, tuttavia, funziona in modo opposto.Quando restituisci un IEnumerable, l'unica cosa che puoi fare è enumerarlo.Se hai una lista a portata di mano e la restituisci, il codice che chiama la tua funzione può anche fare facilmente una serie di altre cose, come ottenere un conteggio.

Tuttavia, sono unito a coloro che ti consigliano di allontanarti da ArrayList.I generici lo sono molto meglio.

Un'interfaccia è un contratto tra l'implementazione e l'utente dell'implementazione.

Utilizzando un'interfaccia, consenti all'implementazione di cambiare quanto desidera purché mantenga il contratto per gli utenti.

Consente inoltre a più implementazioni di utilizzare la stessa interfaccia in modo che gli utenti possano riutilizzare il codice che interagisce con l'interfaccia.

Non dici di quale lingua stai parlando, ma in qualcosa di .NET, allora non è più un lavoro restituire un IList che un List o anche un ArrayList, anche se la semplice menzione di quella classe obsoleta mi fa pensare che tu sia non parliamo di .NET.

Un'interfaccia è essenzialmente un contratto secondo cui una classe ha determinati metodi o attributi;la programmazione su un'interfaccia anziché su un'implementazione diretta consente un codice più dinamico e gestibile, poiché è possibile scambiare completamente le implementazioni finché il "contratto" è ancora in vigore.

Nel caso che descrivi passare un'interfaccia non ti dà un vantaggio particolare, fossi in me passerei l'ArrayList con il tipo generico, oppure passerei l'Array stesso:list.toArray()

In realtà non dovresti restituire un List se questo è un framework, almeno non senza pensarci, la classe consigliata da utilizzare è una Collection.La classe List presenta alcuni miglioramenti delle prestazioni a scapito dei problemi di estensibilità del server.In effetti è una regola FXCop.

Hai il ragionamento per questo Questo articolo

Il tipo restituito per il tuo metodo dovrebbe essere IList<Employee>.

Ciò significa che il chiamante del tuo metodo può utilizzare qualsiasi cosa IList offerte ma non è possibile utilizzare cose specifiche per ArrayList.Quindi se ad un certo punto lo senti LinkedList O YourCustomSuperDuperList offre prestazioni migliori o altri vantaggi, puoi usarlo tranquillamente nel tuo metodo e non fregarne i chiamanti.

Sono più o meno le interfacce 101.;-)

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