3.1 Ensure consistency at all times3.1.1 Make the class responsible for its consistency3.1.2 Encapsulate entire actions and complex consistency checks3.1.3 Example: The Employee entity3.2 Design effective data validation mechanisms3.2.1 Make preconditions explicit3.2.2 Create validation components3.2.3 Use nulls carefully or avoid them if you can3.2.4 Example: Adding an employee to a training offering3.3 Encapsulate state checks3.3.1 Tell, don’t ask3.3.2 Example: Available spots in an offering3.4 Provide only getters and setters that matter3.4.1 Getters that don’t change state and don’t reveal too much to clients3.4.2 Setters only to attributes that describe the object3.4.3 Example: Getters and setters in the Offering class3.5 Model aggregates to ensure invariants in clusters of objects3.5.1 Don’t break the rules of an aggregate root3.5.2 Example: The Offering aggregate3.6 ExercisesSummary