Software Design Principles | Abstraction, Extensibility, Cohesion