Software Design
Software design is an early stage in the development process that serves as a bridge between requirements and implementation. The requirements are derived from the expected functions and behaviors of the system, and provide the foundation for the design activities. The input to this stage is the software requirements, while the output is the software architecture.
The main challenge during the design phase is managing system size and complexity. A key principle is divide and conquer: decomposing the system into smaller elements and identifying the relationships and interactions between them.
Software components
Software components are high-level units of software composition. They provide well-defined interfaces and may also depend on interfaces provided by other components. Components do not expose implementation details, making them black-box abstractions that help express the system's high-level design, including its main elements and their relationships. In practice, a component may be implemented using classes, functions, files, or other software constructs.
Software components diagram
Cohesion and Coupling
Two key concepts of software design are cohesion and coupling.
Cohesion refers to the degree to which the responsibilities of a software component are related and focused on a single purpose. A highly cohesive component performs a well-defined set of closely related tasks.
Coupling, on the other hand, refers to the degree of dependency between software components. Low coupling is generally desirable, as it minimizes interdependencies and makes the system easier to understand, modify, test, and maintain.