En essayant de modéliser mon domaine, j'ai rencontré le problème suivant. image Let nous avons une chose:Comment concevoir autour de l'absence de const en C#/Java?
class Thing
{
public int X { get; set; }
}
Les choses ont un X. propriété Ensuite, il y a des packs, que les choses globales. Mais le domaine exige qu'il y ait une certaine restriction sur les choses que les Packs peuvent contenir. Que ce soit par exemple que la valeur cumulée des Xes ne peut pas être plus élevé alors une limite spécifique:
class Pack
{
private readonly List<Thing> myThings = new List<Thing>();
private const int MaxValue = 5;
public void Add(Thing thing)
{
if (myThings.Sum(t => t.X) + thing.X > MaxValue)
throw new Exception("this thing doesn't fit here");
myThings.Add(thing);
}
public int Count
{
get { return myThings.Count; }
}
public Thing this[int index]
{
get { return myThings[index]; }
}
}
donc je vérifie avant d'ajouter une chose à un pack pour la condition, mais il est encore si facile d'entrer dans problèmes:
var pack = new Pack();
pack.Add(new Thing { X = 2 });
pack.Add(new Thing { X = 1 });
var thingOne = new Thing { X = 1 };
var thingTwo = new Thing { X = 3 };
//pack.Add(thingTwo); // exception
pack.Add(thingOne); // OK
thingOne.X = 5; // trouble
pack[0].X = 10; // more trouble
En C++ la solution serait de faire une copie lors de l'insertion et de renvoyer la référence const dans l'indexeur. Comment concevoir autour de ce problème en C# (et probablement Java)? Je ne peux pas sembler penser à une bonne solution:
- rendre Thing immuable - mais que faire si il doit être mutable? Regarder les Things in Pack avec un événement/un observateur - mais cela signifie que Pack impose la conception de Thing; Et si les choses ont plus de propriétés? Ensuite, je finirai avec un seul événement en raison de la nécessité pour Pack de surveiller les changements - cela me semble étrange.
Des idées ou des solutions préférées?
EDIT:
Pour en revenir à cette question ... Je l'ai accepté la réponse de Itay. Il a raison. Le problème initial était que, d'un contexte, vous vouliez qu'un objet Thing soit immuable, et que vous vouliez le rendre mutable dans un contexte différent. Et cela appelle une interface séparée ... peut-être. J'ai dit "peut-être", parce que la plupart du temps, Pack serait un agrégat de choses (au sens DDD) et donc le propriétaire des objets - ce qui signifie qu'il ne devrait pas vous donner la possibilité de changer l'objet possédé (soit renvoie une copie ou renvoie une interface immuable).
C'est sympa qu'en C++ cette chose particulière puisse être manipulée si facilement par le modificateur const. On dirait beaucoup moins de codage si vous voulez garder les choses dans un état cohérent.
Pouvez-vous poster du code C++ pour montrer ce que vous essayez d'accomplir? – CadentOrange
J'essaie d'interdire la rupture de la cohérence de l'objet Pack. – Stefan
J'ai édité ma réponse - vous pouvez utiliser des interfaces pour obtenir la même fonctionnalité. –