lascia supporre che ho una classe POCO che contiene foos
e bars
:pocos e di utilità metodi
public class Poco {
public IEnumerable<Foo> Foos { get { return foos; } }
public IEnumerable<Bar> Bars { get { return bars; } }
private List<Foo> foos;
private List<Bar> bars;
}
Nel mio esempio ho bisogno di essere in grado di aggiungere e rimuovere foos
e bars
:
public class Poco {
public IList<Foo> Foos { get { return foos; } }
public IList<Bar> Bars { get { return bars; } }
private List<Foo> foos;
private List<Bar> bars;
}
Ma diciamo che ho anche bisogno del vincolo (arbitrario) che ci deve essere uno foo
per bar
e anche uno bar
per foo
.
public class NotAPocoAnyMore {
public IEnumerable<Foo> Foos { get { return foos; } }
public IEnumerable<Bar> Bars { get { return bars; } }
private List<Foo> foos;
private List<Bar> bars;
public void Add(Foo f, Bar b) {...}
public void Remove(Foo f, Bar b) {...}
}
mia domanda è questa: Sto ottenendo a lavorato su di cercare di mantenere una semplice POCO e non dare alcun metodo di utilità? Il primo esempio di POCO è bello perché è immutabile e i POCO hanno altri vantaggi. Tuttavia, non riesco a vedere un modo per mantenere la classe un POCO e avere ancora i modi per accedere e modificare i contenuti in modo controllato (almeno non in un modo che non sembra eccessivo).
Alcuni pensato che ho avuto:
nidificati classe modifica
public class Poco {
public IEnumerable<Foo> Foos { get { return foos; } }
public IEnumerable<Bar> Bars { get { return bars; } }
public PocoModifier Modifier { get { ... } }
private List<Foo> foos;
private List<Bar> bars;
public class PocoModifier {
private readonly Poco toModify;
public void Add(Foo f, Bar b) {...}
public void Remove(Foo f, Bar b) {...}
...
}
}
classe annidata pubblici? No grazie! Inoltre è proprio uguale alla classe non POCO solo con un po 'più di nidificazione.
Uso modificatori di accesso
public class Poco {
public IEnumerable<Foo> Foos { get { return foos; } }
public IEnumerable<Bar> Bars { get { return bars; } }
public PocoModifier Modifier { get { ... } }
internal List<Foo> foos;
internal List<Bar> bars;
}
public class PocoModifier {
private readonly Poco toModify;
public void Add(Foo f, Bar b) {...}
public void Remove(Foo f, Bar b) {...}
...
}
leggermente migliore, ma richiede una intera unità di distribuzione di ciascun Poco.
Personalmente non mi interessa avere metodi di utilità sui POCO (anche se non sono più POCO). Un'altra opzione è quella di creare una libreria di metodi di estensione separata o PocoModificatore statico che è esterno ai POCO (quindi non si annidano le classi), ma la fattibilità dipende da se si espone il POCO a un client. – NWard
Per me sembra che tu tiri la logica del business nelle tue entità. Scrivi la logica aziendale in un livello separato. –
Sembra che tu abbia stabilito restrizioni arbitrarie che hai deciso di forzare sul tuo codice ... Forse se pensi al motivo per cui lo fai puoi decidere da solo ... Nota a margine: il tuo primo oggetto non è davvero immutabile - stai esponendo gli elenchi per iniziare (richiede il cast, ma chi verrà fermato da quello) e non mostrando altri metodi ... –