Metodo virtuale che restituisce una collezione unica: come assicurarsi e suggerire?

1

Ho un metodo virtuale che restituisce una raccolta di elementi che devono essere unici. Voglio assicurarmi che sia ovvio quando si sostituisce il metodo. Qual è il modo migliore per farlo?

Ecco un esempio, dove "Two" viene restituito due volte erroneamente.

public abstract class Base
{
    public abstract IEnumerable<string> GetUniqueNames();
}

public class Derived : Base
{
    public override IEnumerable<string> GetUniqueNames()
    {
        return new List<string> { "One", "Two" };
    }
}

public class Subderived : Derived
{
    public override IEnumerable<string> GetUniqueNames()
    {
        return base.GetUniqueNames().Concat(new List<string> { "Two", "Three" });
    }
}

Sto pensando di restituire qualcosa come UniqueValueCollection che genererebbe un'eccezione quando si tenta di aggiungere un duplicato. In questo modo altri sviluppatori avranno un suggerimento dal nome e un errore descrittivo se tentano ancora di utilizzarlo in modo improprio. È una buona idea?

PS: Non ho bisogno di accedere agli elementi per chiave - è solo una collezione enumerabile, sebbene UniqueValueCollection < > potrebbe utilizzare Dizionario < > / HashSet < > dietro le quinte.

PPS: forse un HasSet < > dietro un'interfaccia? Sarebbe bello se fosse ordinato però.

    
posta Den 08.06.2015 - 14:47
fonte

1 risposta

1

Il progettista di un metodo virtuale avrà l'occasione di preoccuparsi di un implementatore che trascura (o dimentica, come noi di auto-implementatori sono inclini a fare) i dettagli di operazione previsti.

Qui l'intenzione è un metodo virtuale che restituisce un contenitore di oggetti unici, possibilmente di stringhe. Il timore è che, una volta implementati, potrebbero verificarsi duplicati nel reso.

L'adozione di una convenzione di denominazione espressiva fa parte della strategia. Una "collezione di valori unici" è un insieme in matematica. Ovviamente "set" da solo può essere usato (come un verbo) per indicare i membri di oggetti che ritornano, spesso accompagnati dai metodi "get" per i membri dell'oggetto. Molte volte "SetOf ..." o un fraseggio simile sarà scelto per evitare l'ambiguità o l'oscurità di leggere "GetSet ..." (che potrebbe suggerire un metodo polimorfico).

Oltre ai semplici nomi validi per i metodi, il progettista ha alcune opportunità di imporre un'interfaccia sul valore restituito. Qui è stata inizialmente mostrata l'interfaccia IEnumerable e successivamente è stata realizzata l'interfaccia ISet per essere una scelta migliore (più restrittiva).

    
risposta data 09.06.2015 - 16:00
fonte