Esporre un intero oggetto o più proprietà di quell'oggetto?

2

Attualmente sto rifattorizzando su un progetto precedente, che ha classi che espongono sia un singolo oggetto che anche più proprietà da quell'oggetto. Es:

public class Foo
{    
    private MyObj myObj;
    public IMyObj Bar
    {
        get
        {
            return myObj;
        }  
     }         

     public int SomeProperty
     {
        get
        {
            return Bar.SomeProperty;
        }
     }
}

In altre classi, a volte viene utilizzato SomeProperty , a volte si accede alla proprietà tramite Bar.SomeProperty . Penso che sia super confuso dal momento che non è sempre chiaro se SomeProperty appartiene alla classe stessa o ad un oggetto sottostante. L'uno o l'altro è preferibile rispetto all'altro?

    
posta Lennart 07.06.2016 - 12:23
fonte

1 risposta

3

Qualsiasi proprietà pubblica come questa diventa parte dell'API pubblica del tipo. Secondo il principio aperto / chiuso, non dovrebbe mai cambiare, anche se il codice sottostante lo fa. Esponendo Bar tramite una proprietà pubblica, stai quindi forzando IMyObj a diventare parte di tale API pubblica. In futuro, se decidi che obj deve implementare IMyNewObj , devi ereditare quest'ultimo dal precedente oppure MyObj deve implementare sia IMyObj che IMyNewObj per evitare di cambiare la proprietà Bar . Hai accoppiato il funzionamento interno della tua classe ad altri tipi e alla sua API.

Adottando la rotta public int SomeProperty , quella proprietà è libera di cambiare in futuro a return Baz.SomeCompletelyDifferentProperty; senza influire sull'API. Hai quindi disaccoppiato i meccanismi e i tipi interni dall'API.

Quindi direi che quest'ultimo è l'approccio migliore. Il caveat, ovviamente, è il pragmatismo: se IMyObj ha molte proprietà, si finisce per replicare quelle nell'API, rendendo il codice ingombrante. Spesso questo è un segno che Foo e IObj stanno facendo troppe cose; ma non sempre. Quindi è necessario un giudizio caso per caso per stabilire se questo sia davvero l'approccio migliore per quel caso.

    
risposta data 07.06.2016 - 14:05
fonte

Leggi altre domande sui tag