GRASP Principles: Object-Oriented Design Patterns

General Responsibility Assignment Software Patterns

Patrick Karsh
3 min readJul 19, 2023
Raise the bar on your code with GRASP Principles

Object-oriented design is a crucial aspect of software development, and creating robust and maintainable systems requires a systematic approach. GRASP (General Responsibility Assignment Software Patterns) is a set of guidelines that helps designers make informed decisions during the object-oriented design process. In this article, we will explore the key principles of GRASP and understand how they contribute to the creation of flexible and extensible software solutions.


The Creator principle guides the allocation of responsibility for creating objects. According to this principle, a class should be responsible for creating objects of other classes if the first class aggregates, contains, or has a composition relationship with the second class. This principle promotes low coupling between classes, enabling better maintainability and reusability.

Information Expert

The Information Expert principle focuses on assigning responsibilities to classes that possess the most information required to fulfill them. A class should be responsible for a particular task if it has the necessary information to perform that task effectively. By adhering to this principle, we can design systems where responsibilities are distributed efficiently among classes, improving cohesion and reducing dependencies.

Low Coupling

The Low Coupling principle emphasizes designing classes with minimal dependencies on other classes. By reducing the interconnections between classes, we create a more flexible and modular system. Achieving low coupling improves maintainability, as changes to one class are less likely to affect other classes. The use of interfaces and abstractions can help minimize coupling and promote code reusability.

High Cohesion

High Cohesion is a principle that advocates designing classes with a clear and focused purpose. A class should have a single responsibility and encapsulate related behaviors and data. Cohesive classes are easier to understand, test, and maintain. They promote code reuse and minimize the impact of changes within the system.


The Controller principle suggests that an entity responsible for handling a system operation should be a separate class. Controllers act as intermediaries between the user interface and the business logic, orchestrating the flow of information and managing the interaction between objects. By encapsulating the control logic in dedicated controller classes, we achieve better separation of concerns and improve the overall flexibility of the system


Polymorphism is a fundamental principle in object-oriented design that enables objects of different classes to be treated uniformly through a common interface. By leveraging polymorphism, we can design systems that are extensible and adaptable to new requirements. Polymorphic behavior allows for code reuse and promotes loosely coupled systems.

Pure Fabrication

The Pure Fabrication principle suggests the creation of artificial classes to improve system design. These classes are not directly tied to the domain or problem being solved but serve as helpers or connectors between other classes. Pure Fabrication aids in achieving low coupling and high cohesion by encapsulating complex operations or providing an interface to external systems.


GRASP principles provide a set of guidelines that help designers make informed decisions when designing object-oriented systems. By adhering to these principles, developers can create software that is modular, flexible, and maintainable. Applying GRASP principles ensures a clear distribution of responsibilities, promotes low coupling, and high cohesion among classes. Moreover, these principles enable the development of systems that are adaptable to change and support future extensions. Mastering GRASP principles is crucial for every software designer aiming to create well-structured and scalable object-oriented systems.



Patrick Karsh

NYC-based Ruby on Rails and Javascript Engineer leveraging AI to explore Engineering.