4.2.1 Integrity and Validation
Model objects must often ensure three levels of conformity in their state:
- property integrity: the data must conform basic constraints for a specific property of the model.
- property validation: the overall model state must be appropriate.
- model validation: the overall model state must be appropriate.
Property integrity ensures that type and basic validity checking are respected. For example, a Model
with the property
customer_age will accept positive numbers, but refuse to accept strings or negative
numbers, and typically raise an Exception when asked to do so. The View can provide support to enforce this
integrity by restricting what the user can type (for example, only numbers), but the Model has ultimate
responsibility to enforce this integrity. Appropriate mechanisms must ensure that, if the Model rejects
the change, the View restores the current value for that property.
Property validation is less strict, and focuses on the internal conformance of a given property
with a predefined schema. A typical example is an
Finally, Model Validation performs cross validation between properties to ensure an overall consistency
of the content of the model for further use and processing, and is generally performed when the overall state is
committed (e.g. by pressing OK). Typical example is to ensure that properties
max are indeed
numerically consistent with
min < max. One should resist the temptation to enforce these checks as
Property validation level, for two reasons: the logic may become complex, and the temptation to introduce smart
behaviors such as trying to fix the values for the user is high. Unfortunately, this may result in UIs that
deceive and annoy the user by changing values by themselves, possibly making a valid
state unreachable because the user is prevented from using invalid states as “stepping stones”.
Validity might depend on the expected task. A Model for a text editor may contain an invalid python program, but that should not prevent the application from saving it as a file. It may however prevent the editor from executing it.