Sto regolarmente seguendo il seguente schema:
public abstract class BaseItem
{
BaseItem[] children;
// ...
public void DoSomethingWithStuff()
{
StuffCollection collection = new StuffCollection();
foreach(child c : children) c.AddRequiredStuff(collection);
// do something with the collection ...
}
public abstract void AddRequiredStuff(StuffCollection collection);
}
public class ConcreteItem : BaseItem
{
// ...
public override void AddRequiredStuff(StuffCollection collection)
{
Stuff stuff;
// ...
collection.Add(stuff);
}
}
Dove preferirei qualcosa del genere, per nascondere meglio le informazioni:
public abstract class BaseItem
{
BaseItem[] children;
// ...
public void DoSomethingWithStuff()
{
StuffCollection collection = new StuffCollection();
foreach(child c : children) collection.AddRange(c.RequiredStuff());
// do something with the collection ...
}
public abstract StuffCollection RequiredStuff();
}
public class ConcreteItem : BaseItem
{
// ...
public override StuffCollection RequiredStuff()
{
StuffCollection stuffCollection;
Stuff stuff;
// ...
stuffCollection.Add(stuff);
return stuffCollection;
}
}
Quali sono i pro e i contro di ciascuna soluzione?
Per me, dare l'accesso all'implementazione alle informazioni dei genitori è un po 'sconcertante. D'altra parte, l'inizializzazione di un nuovo elenco, solo per raccogliere gli elementi è un overhead inutile ...
Qual è il design migliore? Come cambierebbe, se DoSomethingWithStuff
non sarebbe parte di BaseItem
ma una terza classe?
PS: potrebbero mancare punti e virgola o errori di battitura; scusa per quella cosa! Il codice precedente non è pensato per essere eseguito, ma solo per illustrazione.