No edit summary |
No edit summary |
||
Line 1: | Line 1: | ||
There are other ways to introduce business rules in the model than using state machines and guards. You can use '''constraints'''. | There are other ways to introduce business rules in the model than using state machines and guards. You can use '''constraints'''. | ||
The model already has | The model already has several implicit constraints from the cardinalities of the association ends. If you have cardinality 1..4 and you have zero objects in that relation – then you have a broken constraint. | ||
===== Define | ===== Define Constraints ===== | ||
You may also define your own constraints: | You may also define your own constraints: | ||
Line 10: | Line 10: | ||
You can choose if a broken constraint (a constraint that evaluates to false) should be treated as Information, Warning, or an Error to the user. | You can choose if a broken constraint (a constraint that evaluates to false) should be treated as Information, Warning, or an Error to the user. | ||
===== Delete | ===== Delete Constraints ===== | ||
You can also define the constraint as being a delete constraint only: | You can also define the constraint as being a delete constraint only: | ||
[[File:Constraint wrappper.png|frameless|437x437px]] | [[File:Constraint wrappper.png|frameless|437x437px]] | ||
This way, you have explained at the model level that the domain does not consider it | This way, you have explained at the model level that the domain does not consider it acceptable to delete a Car-object as long as we have the deposit unless it is in state Scrapped. | ||
The delete constraints will be checked when Deleted by MDriven – as a result, the Delete operator is executed on the class. | The delete constraints will be checked when Deleted by MDriven – as a result, the Delete operator is executed on the class. | ||
Line 23: | Line 23: | ||
[[File:Business delete rule.png|frameless|438x438px]] | [[File:Business delete rule.png|frameless|438x438px]] | ||
As modelers, we should decide the best rule for each association end. In this case, is it acceptable to delete a Brand if Cars are left in the AllCarsOfThisBrand association? No, I think not. I am setting it to “MustBeEmpty.” | |||
The association is in the other | The association is in the other direction on the other hand. | ||
[[File:Business delete rule need not be empty.png|frameless|438x438px]] | [[File:Business delete rule need not be empty.png|frameless|438x438px]] | ||
Line 31: | Line 31: | ||
I set that to “NeedNotBeEmptyNoWarning” – because deleting a car object is okay even if it has a brand. | I set that to “NeedNotBeEmptyNoWarning” – because deleting a car object is okay even if it has a brand. | ||
===== Constraints | ===== Constraints Evaluation in OCL ===== | ||
If you want to evaluate constraints in OCL, use [[OCLOperators constraints]] for example. | If you want to evaluate constraints in OCL, use [[OCLOperators constraints]], for example. | ||
===== Usage of | ===== Usage of Constraints ===== | ||
Constraints automatically show up in ViewModels - but you may opt them out on a per-ViewModel level: | Constraints automatically show up in ViewModels - but you may opt them out on a per-ViewModel level: | ||
[[File:2021-04-08 10h46 32.png|none|thumb|484x484px]] | [[File:2021-04-08 10h46 32.png|none|thumb|484x484px]] |
Revision as of 06:10, 14 March 2023
There are other ways to introduce business rules in the model than using state machines and guards. You can use constraints.
The model already has several implicit constraints from the cardinalities of the association ends. If you have cardinality 1..4 and you have zero objects in that relation – then you have a broken constraint.
Define Constraints
You may also define your own constraints:
You can choose if a broken constraint (a constraint that evaluates to false) should be treated as Information, Warning, or an Error to the user.
Delete Constraints
You can also define the constraint as being a delete constraint only:
This way, you have explained at the model level that the domain does not consider it acceptable to delete a Car-object as long as we have the deposit unless it is in state Scrapped.
The delete constraints will be checked when Deleted by MDriven – as a result, the Delete operator is executed on the class.
Other things that are checked when the Delete operator is run are the Business Delete Rules that exist on all association endpoints:
As modelers, we should decide the best rule for each association end. In this case, is it acceptable to delete a Brand if Cars are left in the AllCarsOfThisBrand association? No, I think not. I am setting it to “MustBeEmpty.”
The association is in the other direction on the other hand.
I set that to “NeedNotBeEmptyNoWarning” – because deleting a car object is okay even if it has a brand.
Constraints Evaluation in OCL
If you want to evaluate constraints in OCL, use OCLOperators constraints, for example.
Usage of Constraints
Constraints automatically show up in ViewModels - but you may opt them out on a per-ViewModel level:
You can also access Constraints and their "brokenness" via OCL Operators brokenConstraints and Constraints:
See also: OCLOperators_constraints