È meglio esporre una raccolta o un'API alla raccolta?

2

Prendi ad esempio il seguente:

public interface IManager
{   
    void AddItem(CollectionItem item);
    void RemoveItem(CollectionItem item);
}

public interface IManagerCustomCollection
{
    ManagerCollection Systems;
}

Di solito è preferibile creare una raccolta e consentire al consumatore di operare direttamente sulla collezione?

    
posta Vaughan Hilts 25.01.2014 - 23:49
fonte

3 risposte

2

Is it usually more preferable to create a collection, and allow the consumer to operate directly on the collection?

Dipende. Ti aspetti che il tuo utente crei, manipoli e usi la collezione in altro modo? O vuoi lasciare che facciano alcune operazioni simili a raccolte su qualcosa ... non è davvero una collezione?

Ma prima di rispondere: considera che questo è un odore di codice. Bene, sono due possibili odori di codice:

  1. Stai creando il tuo tipo di raccolta. - Le raccolte di librerie standard (e le interfacce) sono buone, complete e tutte le conoscono. Sii veramente sicuro di averne bisogno prima di crearne uno nuovo.
  2. Forse stai violando una singola responsabilità. - Se hai qualche cosa, e poi quella cosa anche ha Add , Remove , ecc ... la tua cosa potrebbe fare due cose Cerca di separare queste responsabilità.

Tutto ciò che ho detto, tendo a preferire l'opzione 1. Fornisce un controllo più strong su qualsiasi invariante bizzarro che devi proteggere se non stai usando solo List (o qualunque altra raccolta di base). Di solito questo genere di cose deve associare la raccolta con qualche altra istanza, che diventa pelosa se si disaccoppia la collezione dalla sua istanza appaiata.

    
risposta data 26.01.2014 - 00:51
fonte
0

Preferirei esporre l'API alla raccolta, in questo modo quando si eseguono i test non è necessario preoccuparsi di costruire la raccolta corretta e si possono anche eseguire test in cui la raccolta è nullo ecc.

Sarai anche in grado di implementare le tue condizioni su quale tipo di elementi verranno aggiunti alla raccolta, cioè senza duplicati ecc.

    
risposta data 25.01.2014 - 23:54
fonte
0

Esporre l'accesso alla raccolta utilizzando un'interfaccia, ad esempio IList<T> , ICollection<T> o ISet<T> . Gli sviluppatori hanno familiarità con queste interfacce senza legarsi a un'implementazione specifica. Lancia un NotImplementedException per i metodi o le proprietà che non desideri implementare.

Perdi alcune funzionalità. Ad esempio, come segnala Jon Skeet , le interfacce sono sottoinsiemi delle funzioni offerte dalle classi concrete - IList<T> ha meno metodi e proprietà di List<T> , ad esempio. Tuttavia, LINQ e meccanismi simili funzionano ancora, diversamente dall'implementazione delle proprie interfacce o classi.

    
risposta data 26.01.2014 - 00:45
fonte

Leggi altre domande sui tag