All'interno di un'interfaccia specificata da un componente principale, dovrebbe richiedere IReadOnlyCollection o IEnumerable?

3

Nel pensare al principio di "essere conservatore in ciò che mandi e liberale in ciò che accetti", in genere cerco di rendere i miei metodi ricevuti IEnumerable parametri, ma di emettere un IReadOnlyCollection (eccetto dove l'esecuzione posticipata è veramente prezioso, quindi emetto un IEnumerable ).

Tuttavia, ho appena realizzato che quando si specificano i metodi in un'interfaccia, questo potrebbe essere invertito. È vero?

Le mie specifiche di interfaccia dovrebbero essere indicative a tutti gli implementatori "Ti darò un IReadOnlyCollection , ma puoi semplicemente restituirmi il vecchio IEnumerable indietro"? (Anche in questo caso, se l'esecuzione differita ha senso, fornirei invece un IEnumerable come tipo di parametro). Questo rende tali metodi al contrario, accettando un insieme ristretto / conservativo ma emettendo uno generico / liberale. Tuttavia, questo mi sembra giusto perché con l'inversione della dipendenza, in realtà gli argomenti di input quando viene chiamato il metodo sono in realtà gli argomenti di output del sistema principale (specificando l'interfaccia).

Mi sto solo chiedendo se il mio modo di pensare sia corretto o meno. Sembra che rendere il lato implementatore il più semplice possibile sia davvero il vantaggio.

Mi sto rendendo conto che parte del problema deriva dalla mia preoccupazione di non richiedere agli implementatori di riflettere profondamente sul fatto che l'esecuzione differita abbia un senso o meno. Sapere quando un enumerabile sarà enumerato può essere molto importante in un sistema, e con la separazione delle preoccupazioni che un'interfaccia può aiutare a portare al codice, non vorrei essere così liberale in ciò che il metodo dell'interfaccia produce (che è in definitiva un input al sistema principale) che IEnumerable s impropriamente differito viene gettato in giro ...

Non si tratta di velocità . Non sono sicuro del motivo per cui è stato sollevato, ma per favore non pensarci nemmeno per un secondo sulle implicazioni di performance qui. Questa non è la domanda.

    
posta ErikE 17.03.2016 - 21:16
fonte

1 risposta

1

Ho preoccupazioni simili a te. Tecnicamente, non puoi garantire nulla su IEnumerable se non su quello che puoi enumerare su di esso una volta. Questo può essere un vantaggio, ad esempio la lettura di un flusso bufferizzato. Poiché il framework non supportava qualcosa di meno specifico di ICollection, penso che questo sia diventato l'impostazione predefinita per gli sviluppatori che non volevano esporre la possibilità di aggiungere elementi all'enumerazione. Con l'avvento di .NET 4.5, abbiamo finalmente ottenuto l'interfaccia che esprime più correttamente ciò che viene restituito.

Restituire IEnumerable per un elenco non è sbagliato, ma penso che restituire IReadOnlyCollection sia una scelta migliore quando si può anticipare che i dati verranno ripetuti più volte. ReSharper, ad esempio, avviserà su più iterazioni su IEnumerable. Come sviluppatore di una biblioteca, penso che sia più valido di uno sviluppatore preoccuparsi se un'implementazione sia differita o meno.

    
risposta data 19.03.2016 - 05:04
fonte

Leggi altre domande sui tag