Stel, je hebt een aantal domein-classes:
dit is slechts een voorbeeld, dus pseudo-code
Stel dus nu dat je een Customer object heb, die een aantal orders heeft.
Je hebt een GUI waar je de orders van een klant kunt bekijken.
Via die GUI kan je een order van een klant verwijderen, en je kan ook order-lijnen van dat order verwijderen.
Stel dus dat je het volgende scherm hebt:
een overzichtsscherm van klanten; van daar kan je een klant bewerken dmv een detail-scherm.
Op dat detail-scherm staan de gegevens van de klant, en ook de orders van die klant.
Vandaaruit kan je ook een detail gaan bekijken van ieder order: op dat OrderDetailScherm zie je de bestel-lijnen. Daar kan je een bestellijn bv verwijderen.
(Misschien niet allemaal bedrijfs-technisch correct, je zal misschien een order als 'geannuleerd' markeren, of een orderlijn als geannuleerd marken, ipv ze echt te verwijderen, maar het gaat hier om het idee).
Stel nu dat je een order-lijn verwijderd op dat schermt, maar, ipv die wijzigingen die je gedaan hebt te bevestigen (door op ok te klikken van het order-detail scherm), annuleer je die wijzing (door op cancel te klikken van het order-detail scherm).
De orderlijnen die je echter verwijderd hebt, blijven verwijderd. Als je dus daarna het order-detail scherm opnieuw opent, zie je de orderlijnen die je net verwijderd hebt niet meer, terwijl dit wel zou moeten zijn (je hebt nl de wijzigingen geannulleerd).
Nu kan je wel zeggen: je moet de orderlijnen pas echt verwijderen uit je domein-object als je op 'OK' geklikt hebt van dat scherm, maar, is dat wel een goed idee ?
Stel nl. dat je op dat scherm ook het bedrag toont van alle bestelde producten samen, dan klopt dit niet met de producten die je op het scherm ziet: de verwijderde staan niet meer op het scherm, maar, ze zitten wel nog in je collectie.
Daarom is het imho beter om de items niet 'echt' uit je collectie te verwijderen, maar ze als 'verwijderd' te markeren dmv een 'IsDeleted' flag op je domein object. Adh daarvan, kan je de verwijderde element niet tonen op je scherm, en ze dan later, als je 'echt' saved, ze in de repository gaan verwijderen. Dit zorgt dan wel weer dat ik iedere keer, zowel in m'n UI, als in m'n business logica, moet gaan checken op die IsDeleted flag. (Bv, als ik een method heb die gewoon het totaal bedrag output, dan moet ik iedere keer die vlag gaan bekijken, zodanig dat enkel de bedragen voor de niet-verwijderde elementen in beschouwing genomen worden).
Ook in m'n UI moet ik gaan checken op die IsDeleted vlag, zodanig dat ik de verwijderde elementen niet toon.
Hoe behandelen jullie zoiets ?
dit is slechts een voorbeeld, dus pseudo-code
code:
1
2
3
4
5
6
7
8
9
10
| class Customer
{
private OrderCollection _orders;
}
class Order
{
private Customer _cust;
private OrderedProductCollection _products;
} |
Stel dus nu dat je een Customer object heb, die een aantal orders heeft.
Je hebt een GUI waar je de orders van een klant kunt bekijken.
Via die GUI kan je een order van een klant verwijderen, en je kan ook order-lijnen van dat order verwijderen.
Stel dus dat je het volgende scherm hebt:
een overzichtsscherm van klanten; van daar kan je een klant bewerken dmv een detail-scherm.
Op dat detail-scherm staan de gegevens van de klant, en ook de orders van die klant.
Vandaaruit kan je ook een detail gaan bekijken van ieder order: op dat OrderDetailScherm zie je de bestel-lijnen. Daar kan je een bestellijn bv verwijderen.
(Misschien niet allemaal bedrijfs-technisch correct, je zal misschien een order als 'geannuleerd' markeren, of een orderlijn als geannuleerd marken, ipv ze echt te verwijderen, maar het gaat hier om het idee).
Stel nu dat je een order-lijn verwijderd op dat schermt, maar, ipv die wijzigingen die je gedaan hebt te bevestigen (door op ok te klikken van het order-detail scherm), annuleer je die wijzing (door op cancel te klikken van het order-detail scherm).
De orderlijnen die je echter verwijderd hebt, blijven verwijderd. Als je dus daarna het order-detail scherm opnieuw opent, zie je de orderlijnen die je net verwijderd hebt niet meer, terwijl dit wel zou moeten zijn (je hebt nl de wijzigingen geannulleerd).
Nu kan je wel zeggen: je moet de orderlijnen pas echt verwijderen uit je domein-object als je op 'OK' geklikt hebt van dat scherm, maar, is dat wel een goed idee ?
Stel nl. dat je op dat scherm ook het bedrag toont van alle bestelde producten samen, dan klopt dit niet met de producten die je op het scherm ziet: de verwijderde staan niet meer op het scherm, maar, ze zitten wel nog in je collectie.
Daarom is het imho beter om de items niet 'echt' uit je collectie te verwijderen, maar ze als 'verwijderd' te markeren dmv een 'IsDeleted' flag op je domein object. Adh daarvan, kan je de verwijderde element niet tonen op je scherm, en ze dan later, als je 'echt' saved, ze in de repository gaan verwijderen. Dit zorgt dan wel weer dat ik iedere keer, zowel in m'n UI, als in m'n business logica, moet gaan checken op die IsDeleted flag. (Bv, als ik een method heb die gewoon het totaal bedrag output, dan moet ik iedere keer die vlag gaan bekijken, zodanig dat enkel de bedragen voor de niet-verwijderde elementen in beschouwing genomen worden).
Ook in m'n UI moet ik gaan checken op die IsDeleted vlag, zodanig dat ik de verwijderde elementen niet toon.
Hoe behandelen jullie zoiets ?
https://fgheysels.github.io/