Where it came from?
• GRASP like a term and principles firstly was described at Craig
Larman’s book “Applying UML and Patterns”
GRASP stands for:
• Patterns (Principles)
• Informational Expert
• Low Coupling
• High Cohesion
• Pure Fabrication
• Protected Variation
Differences from GoF and SOLID
• Patterns of assigning responsibilities (RDD)
• GRASP declares more common principles responsibility
separation, when GoF describe more specific and complex
• SOLID – more common OOP principles less oriented on
• GRASP somewhere between GoF patterns and SOLID principles.
Representation in Sequence Diagram (UML)
• Relationship between methods and responsibilities.
• Assuming that Sale objects are responsible to create Payment
• “doing” responsibilities
– Doing something itself, such as creation an object or doing a
– Initiating action in other objects
– Controlling and coordinating activities in other objects.
• “knowing” responsibilities
– Knowing about encapsulated data.
– Knowing about related objects.
– Knowing about things it can derive or calculate.
Problem: Which class possesses information about object A?
More common question: What is a general principle of assigning
responsibilities to objects?
Assign the responsibility to the class that knows the necessary
information for performing required action and fulfill the
Problem: Who should be responsible for creating object A?
In general, a class B should be responsible for creating instances of
class A if one, or preferably more, of the following apply:
• Instances of B contain or compositely aggregate instances of A
• Instances of B record instances of A
• Instances of B closely use instances of A
• Instances of B have the initializing information for instances of A
and pass it on creation.
• The goal is to define creator-object, which will be related to all
In case of complex creation login, based on some external
cases, make sense to use Factory pattern, and delegate creation
responsibility to auxiliary class.
• Related patterns: Concrete Factory and Abstract Factory
• Problem: How to reduce design change impact, support low
dependency and increase reuse?
Coupling is the degree, defines how tightly one component linked
to other components, or how much information it knows about
• A change in one module usually forces a ripple effect of changes in other
• Assembly of modules might require more effort and/or time due to the
increased inter-module dependency.
• A particular module might be harder to reuse and/or test because
dependent modules must be included.
• Assign a responsibility so that coupling remains low.
Low Coupling is an evaluative pattern, which dictates how to
assign responsibilities to support:
• lower dependency between the classes,
• change in one class having lower impact on other classes,
• higher reuse potential.
• Problem: How to keep objects
focused, understandable, manageable, and support low
Cohesion is a measure of how strongly related or focused the
responsibilities of a single module are.
High Cohesion is an evaluative pattern that attempts to keep
objects appropriately focused, manageable and understandable.
Alternatively, low cohesion is a situation in which a given element
has too many unrelated responsibilities (“God Object”)
Cohesion is decreased if:
• The functionalities embedded in a class, accessed through its methods, have
little in common.
• Methods carry out many varied activities, often using coarsely grained or
unrelated sets of data.
Disadvantages of low cohesion (or “weak cohesion”) are:
• Increased difficulty in understanding modules.
• Increased difficulty in maintaining a system, because logical changes in the
domain affect multiple modules, and because changes in one module require
changes in related modules.
• Increased difficulty in reusing a module because most applications won’t
need the random set of operations provided by a module.
• Problem: Who should be responsible for handling events and
messages from external actors (UI, …)?
• Assign the responsibility to a class, such as:
– A class that represents the overall system, device, or subsystem.
• Façade Controller Pattern
– A class that represent a use case, whereby performs handling
particular system operation.
• Use Case Controller Pattern
• Generally does not perform operation by itself, but delegate
responsibility to component objects.
• Problem: How to act different depending in object’s class, or
how to design pluggable components?
• In case of class behavior might changes, responsibilities
segregates to different behavior specific classes, using
polymorphic operations for this class.
• Advise: Do not use type checking, but conditional logic for
implementation different variations based on object type.
• There are (roughly) 3 types a polymorphism:
– Ad hoc Polymorphism
– Parametric Polymorphism
– Subtype Polymorphism
• Problem: How to assign responsibilities if applying the
Informational Expert principle decreases cohesion and increases
• Assign the responsibility to an artificial class that does not
belongs to the domain model.
• Pure Fabrication is a class that does not reflect any business
domain object, but required only for increase cohesion and
• Problem: How to assign responsibilities in order to avoid direct
coupling between two components, and keep ability for reuse.
• Assign responsibility to intermediate class for providing linking
between objects not linking directly.
• Related design patterns: Adapter, Bridge, Mediator.
• Problem: How to design system and subsystems, that changes in
these components does not affects on other components.
• Identify points of possible variations and instability; create
stable interfaces upon instable components.
• Open-Closed Principle almost equivalent to PV pattern.
• There are 2 types of points:
– Variation point – branching point on existing system or in
requirements. For example we need to support several types of
interfaces for tax payment system
– Evolution point – supposed branching point, which might occur in
future, but does not declared by existing requirements.
• Protected variation pattern applying for both variation and
Law of Demeter (not part of GRASP)
Specific case of loose coupling.
• Each unit should have only limited knowledge about other units
• Each unit should only talk to its friend (“don’t talk to strangers”)
Law of Demeter (not part of GRASP)
More formally, the Law of Demeter for functions requires that a
method m of an object O may only invoke the methods of the
following kinds of objects:
• O itself
• m's parameters
• Any objects created/instantiated within m
• O's direct component objects
• A global variable, accessible by O, in the scope of m
“Don’t talk to strangers”
RDD conflicts with Law of Demeter
• Therefore, sending a message to the result of a previous
message send isn't allowed.
However, "returned values are part of the
client/server contract. There need be no
correlation between the structure of an object
and the object returned by the message.“
Wirfs-Brock, Rebecca; McKean, Alan
(November 2002). Object Design:
Roles, Responsibilities, and Collaborations.
Assign a responsibility to the class that has the information
needed to fulfill it.
Assign class B the responsibility to create an instance of
class A if one of these is true (the more the better):
• B "contains" or compositely aggregates A.
• B records A.
• B closely uses A.
• B has the initializing data for A that will be passed to A
when it is crated. Thus B is an Expert with respect to
Assign the responsibility to a class representing one of the
• Major subsystem classes
• A use case scenario classes within which the system
Assign a responsibility so that coupling remains low.
Assign a responsibility so that cohesion remains high.
The same name operations (methods) in the difference
classes is defined. And assign a responsibility to the class
the class that the behavior is changed.
Define a class for convenience' sake that doesn't express
the concept of the problem area at all.
Assign the responsibility to an intermediate object to
mediate between other components or services, so that
they are not directly coupled.
Assign responsibility to create a stable interface around an
unstable or predictably variable subsystem or component.