Proprietà o metodo per ottenere informazioni su una raccolta?

3

Supponiamo che abbia una classe MyList che estende ObservableCollection<MyObject> dove MyObject ha Boolean Proprietà Enabled .

Diciamo che voglio il numero di oggetti MyObject che hanno la proprietà Enabled uguale a true .

Dovresti definire questo come una proprietà o un metodo?

In MyList class, dovrei usare:

public int GetNumEnabledMyObjects(){
    return this.Count(o => o.Enabled == true);
}

o

public int NumEnabledMyObjects {
    get {
        return this.Count(o => o.Enabled == true);
    }
}

Ho esaminato Proprietà rispetto ai metodi in MSDN Design Guidelines e sono propenso a un metodo in quanto potrebbe essere considerato abbastanza costoso.

    
posta user1071777 14.07.2014 - 22:39
fonte

2 risposte

6

Il mio voto è di renderlo un metodo. Count() è O(n) , e penso ti verrebbe difficile trovare una proprietà ovunque in Linq per una serie di motivi, tra cui Big O.

In ogni caso, la maggior parte dei client si aspetta che le proprietà implichino la ricerca di uno stato e / o implichino un minimo di elaborazione (ad esempio la formattazione dell'output). Il recupero di uno Count memorizzato sarebbe idoneo; iterare su una raccolta non.

    
risposta data 14.07.2014 - 23:14
fonte
2

Le proprietà dovrebbero essere utilizzate come scorciatoia per definire getter / setter. Dal momento che ciò che vuoi non rientra nel concetto di essere un campo con solo getter, dovresti definirlo come un metodo in modo che un altro sviluppatore che usa la tua classe sappia che costerà chiamare il metodo.

Un'altra opzione è la definizione di un campo reale chiamato NumEnabled e quindi la gestione di questo campo quando aggiungi / rimuovi oggetti dalla raccolta. Quindi lo definiresti come proprietà perché ora è un campo.

Se si desidera riflettere eventuali modifiche su un'istanza del campo Abilitato della classe MyObject, è necessario definire un evento che viene generato quando viene modificato il valore Abilitato dell'oggetto. La raccolta deve essere iscritta a questo evento, in modo che la raccolta possa tenere traccia del momento in cui il valore Abilitato viene modificato per ogni oggetto nella raccolta. È quindi possibile manipolare la proprietà NumEnabled per riflettere eventuali modifiche apportate al campo Abilitato di qualsiasi oggetto nell'elenco.

class MyCollection<T>
{
    Int32 NumEnabled{get;private set;}

    ...

    void Add(T obj)
    {
        ... // Add the object here
        if(obj.Enabled)
        {
            this.NumEnabled++;
        }
    }

    void Remove(T obj)
    {
       ... // Remove the obj here
       if(obj.Enabled)
       {
           this.NumEnabled--;
       }
    }
}
    
risposta data 14.07.2014 - 23:29
fonte

Leggi altre domande sui tag