Quando utilizzare le raccolte personalizzate?

2

Vedo un sacco di API che utilizzano raccolte personalizzate invece di usare solo generici pacchettizzati strongmente tipizzati.

Ad esempio, l'API avrà un Object1Collection anziché solo un List<Object1> (o qualunque sia il generico appropriato).

Quando sai usare l'una o l'altra? Capisco che creerai una raccolta personalizzata se desideri estendere le funzionalità di una raccolta generica pre-spedita, ma cosa succede se non è questo il caso?

È prudente creare la raccolta personalizzata dall'inizio, pensando che in futuro quell'oggetto potrebbe aumentare e richiedere ulteriori capacità e potrebbe essere più semplice farlo inizialmente? Questa giustificazione è sufficiente?

E se vuoi solo estendere funzionalità, invece di definire funzionalità di raccolta, devi semplicemente ricavare la tua collezione personalizzata da una classe di raccolta generica di base, altrimenti eredita l'interfaccia di conseguenza? È tipico?

    
posta user3175663 02.04.2014 - 02:14
fonte

2 risposte

7

In generale, raramente se mai.

Occasionalmente crei oggetti che avvolgono collezioni e lavorano su raccolte di cose, ma raramente crei una classe che sia una raccolta generica e riutilizzabile. Più spesso avrai una classe che rappresenta un concetto che usa una collezione, piuttosto che è una collezione.

Perché? Perché francamente ci sono solo tante strutture dati nel mondo, e sono state praticamente implementate. Forse puoi inventare la prossima tabella hash, e se lo fai, allora crea un nuovo tipo di raccolta per questo.

Se desideri aggiungere funzionalità, racchiudi la raccolta esistente o aggiungi i relativi metodi di estensione.

Se vedi uno specifico ObjectCollection , suppongo che l'API sia stata creata durante .NET 1.0 (senza generici) o per alcune API che hanno requisiti di interoperabilità onerosi.

    
risposta data 02.04.2014 - 03:13
fonte
5

Le raccolte personalizzate non hanno molto senso per la programmazione generale. Ecco perché esiste List<T> . Ma sicuramente hanno molto senso nella modellazione dei domini. Ad esempio, si desidera avere un comportamento speciale che si verifica quando si aggiunge un nuovo elemento in una raccolta. Il modo migliore per farlo è creare una classe di raccolta personalizzata, derivare da Collection<T> e sovraccaricare il metodo Add .

Inoltre, c'è una domanda su cosa sia effettivamente una "collezione personalizzata". Sta avendo il metodo Add e implementando IEnumerable<T> abbastanza o la classe deve derivare da Collection<T> ?

Quindi come diceva Telastyn. In genere non implementerai nuove raccolte in un modo per creare nuovi modi di memorizzazione dei dati. Questo problema è stato a lungo risolto. Ma puoi sicuramente (e dovresti) creare collezioni personalizzate come modo per esprimere il comportamento del dominio su tali raccolte.

    
risposta data 02.04.2014 - 08:35
fonte

Leggi altre domande sui tag