This is an old revision of the document!
Table of Contents
Tell Don't Ask/Information Expert (TdA/IE)
Variants and Alternative Names
Context
Principle Statement
- Assign a responsibility to that module which has the largest subset of the required information.
- Don't ask an object for information, make computations and set values on the object later. Tell the object what it should do.
Description
Each module has a set of responsibilities. Subsystems have specific tasks, packages group several related classes, classes have methods and attributes, and so on. So there is a kind of mapping between modules and responsibilities. This mapping is good when the information which is necessary to fulfill the given task is present in the given module so there is no need to acquire all this information.
Rationale
When this principle is not adhered to, then a module has a responsibility for which it is lacking some information. So in order to fulfill the task the module has to first acquire the needed information by invoking other modules. This increases the dependencies between the modules (which may lead to ripple effects).
Strategies
- Assign a responsibility to the class that has the largest subset of the needed information.
- Mirror functionality of composed objects to the interface of the class instead of having a getter-method returning the composed object
- Have the objects operate on their own data using appropriate methods. Avoid getters and setters.
Caveats
Sometimes assigning responsibilities using IE results in bas solutions (high coupling, low cohesion). This is because IE just focuses on the availability of data. So for example IE would demand domain objects saving themselves to the database. This is bad since it couples the domain objects to the database interface (JDBC, SQL, etc.) and lowers cohesion by adding unrelated responsibilities to the classes. Here it is better to give the task of persisting the domain objects to a separate class.4)
See also section contrary principles.
Origin
Craig Larman: Applying UML and Patterns – An Introduction to Object-Oriented Analysis and Design and Iterative Development
Evidence
Accepted: This principle is prominently described in Craig Larman's book Applying UMl and Patterns.
Relations to Other Principles
Generalizations
Specializations
Contrary Principles
- More Is More Complex (MIMC): Adhering to TdA/IE sometimes results in adding further methods.
Complementary Principles
- Low Coupling Adhering to IE typically leads to low coupling as there is less need to communicate with other modules to get the necessary information. But in some cases IE also increases coupling (see caveats.
- High Cohesion Adhering to IE typically leads to high cohesion as responsibilities which belong together typically operate on the same data. But in some cases IE also lowers cohesion (see caveats).
- Model Principle (MP): TdA/IE tells how to distribute functionality among the natural classes which are created according to the Model Principle.
- Information Hiding/Encapsulation (IH/E): Assigning responsibilities to objects using Information Expert may accidentally break encapsulation. It typically does not but it has to be considered. Furthermore TdA is about not having getter methods returning constituent parts of a module. Encapsulation can be another reason for that.
- Principle of Separate Understandability (PSU): TdA/IE is about responsibility assignment. Another aspect of this task is treated by PSU.
Principle Collections
Examples
Description Status
Further Reading
- Andrew Hunt and David Thomas: The Art of Enbugging