One class should have one and only one responsibility
Objects or entities should be open for extension, but closed for modification.
Derived types must be completely substitutable for their base types.
Objects or entities should be open for extension, but closed for modification.
Entities must depend on abstractions not on concretions.