Strategies for Software Design

To develop something, it first needs to be visualized and illustrated so as to view and understand its conceptual schema. Similarly, in the field of software engineering, a blueprint of the intended software product is outlined and prepared, which is commonly known by the term of software design.

What is Software Design?

It may be seen as a software engineering artifact derived from the available specifications and requirements of a software product, which needs to be developed. It transforms and implements the requirements, specified in the software requirement specification (SRS) in a viewable object or form so as to assist developers to carry out the development process in a particular direction in order to build a desired product.

Software designing is one of the early phases of the Software Development Life Cycle (SDLC), which provides the necessary outputs for the next phase, i.e. coding & development.

Further, these designs may be structured using different strategies, and are available in multiple variants so as to view the logical structure of a software product from multiple perspectives. Let's go through each of them.

Structured Design

Based on the strategy of "divide and conquer", this approach divides the whole problem into smaller multiple problems, which are concurrently solved, branched and structured to deliver multiple solutions.

This method benefits the developer in order to understand the effective solution for solving a problem. Its best use may be seen in the bigger programs, having large complexities.

In structured design, there are certain rules which are used for the purpose of communication and interaction between the small multiple modules arranged in a hierarchical form. These rules may be seen as under:

  • Cohesion:It describes the strength of the bonding between the modules, which are functionally related.
  • Coupling:It defines the degree of communication between the modules.
A good structured design possesses high cohesion and low coupling.

Function Oriented Design

This design is used to visualize a software product from a functional point of view. It is derived from the structured design, and follows its feature of divide and rule.

In this design, flow of data in a system is being examined through data flow diagram(DFD) to assess the change produce in the data, and consequently in the state of a system by a function. Further, in this strategy, a system is seen as small multiple numbers of functions based on their working where each function is capable of executing tasks and each of the functions is described in detail. Over and above, these functions are the system placed at a top position. These functional units are able to communicate with each other through passing of information or through the available information.

However, function-oriented design works well for a system where a function considers inputs for its working, and is independent from the system state.

Object Oriented Design (OOD)

This approach is used to build and view software design in terms of objects or entities along with their associated attributes. Instead of functions, this designing strategy focuses on state and behaviour of the objects to model the design and generally consist of following elements and features:

  • Objects: Any entity in the software design, which possess some attributes along with some methods to perform certain operations such as a person, organization, etc.
  • Classes: A class may be defined as the set of objects having similar attributes and functioning. For example, Android, iOS, Windows are the objects of a class, namely Operating system.
  • Encapsulation: The term, "encapsulation", simply refers to hiding the information i.e., reflecting only attributes and functions, the essential component of an object and keeping the internal structure of an object abstracted from its external features.
  • Inheritance: Based on the concept of re-usability, it is used to derive a new class, from the existing class. Inheritance defines the hierarchical structure, where a class acquires some or more properties of other classes. A sub class (child class) in the structure inherits or possess properties of the parent classes.
  • Polymorphism: It's a concept, which defines the multiple forms or views of an object or variable and functions. Generally, the term "polymorphism" is being used in the context of functions to define the different operations of a function based on the different conditions and purposes. It is used to invoke and call a function in a specific form to execute a particular task.
  • Approaches, to design

    Generally, there are two ways to carry out the task of software designing, which may be seen as under:

    • Bottom up design: It starts from the smallest and basic component, which are being integrated progressively to form a subsequent higher level of component and ultimately, the desired system. This approach is best considered, when a system needs to be derived from an existing system.
    • Top down design:Contrary to bottom up designing, this approach disintegrates the whole system into smaller sub components, which are then further decomposed until lowest level is achieved. The top down design approach is preferred in the situation of non-availability of specifications and details.

    However, it is preferred to carry out the designing process using the mixed combination of both the approaches, which is commonly known by the term of Hybrid Design.