Evitar complexidade desnecessária.
Evitar repetição de qualquer parte do sistema
Alinhar responsabilidades das classes, evitar forte acoplamento entre as classes e não fazer perguntas sobre o estado do objeto
Adicionar somente as funcionalidades que são necessárias para a aplicação e deixar de lado qualquer tentação de adicionar outras funcionalidades que você acha que precisa - aderido pelo TDD
É o processo de dissecação de uma parte de software em distintas características que encapsulam um único comportamento e dados que podem ser utilizados por outras classes