Refactoring: Change the code's structure without changing its external behavior
- Low coupling: Separate all that's possible to separate without making a mess
- High cohesion: Minimize the mess ~ Minimize the inter-group dependencies and maximize the intra-group ones
Invariants:
- Behavior must be the same at all times - i.e Testing