For OOP, I aim for:
- Separation of concerns between classes/modules. The responsibilities of a class should be easy to explain to a non-developer. E.g. Ideally , every class/module abstraction should be an entity discovered in the specification (or easily inferred from it) and not invented from the developer's own mind.
- Be very careful about how you name things. Try to stick to the spec/domain terminology.