This shows you the differences between two versions of the page.
Both sides previous revision Previous revision Next revision | Previous revision Last revision Both sides next revision | ||
principles:encapsulate_the_concept_that_varies [2021-09-02 12:26] 65.21.179.175 old revision restored (2021-05-19 11:22) |
principles:encapsulate_the_concept_that_varies [2021-10-18 21:31] christian old revision restored (2019-10-07 08:29) |
||
---|---|---|---|
Line 5: | Line 5: | ||
===== Context ===== | ===== Context ===== | ||
/* fill in contexts here: */ | /* fill in contexts here: */ | ||
- | * [[contexts: | + | * [[contexts: |
+ | * [[contexts: | ||
+ | * [[contexts: | ||
===== Principle Statement ===== | ===== Principle Statement ===== | ||
Line 14: | Line 15: | ||
===== Description ===== | ===== Description ===== | ||
+ | |||
+ | This principle has two aspects that roughly correspond to the two sub-principles [[Single Responsibility Principle|SRP]] and [[Open-Closed Principle|OCP]]. The first one is about making changes local. Everything which is supposed to change in the future should be encapsulated in a single module. This means [[glossary: | ||
+ | |||
+ | The second aspect is about introducing abstractions. Sometime the varying concept is one which varies at runtime rather than by maintenance. So at runtime it is decided upon a certain variation or there can be even several variations at the same time. In this case there has to be an abstract base class or an interface which encapsulates the varying concept. Several concrete descendant classes then specify the concrete variation. | ||
+ | |||
+ | The difference between the two aspects is whether the varying concept is one that changes over time during maintenance or one that may change at runtime. Nevertheless the advice is the same: encapsulate the concept that varies. | ||
===== Rationale ===== | ===== Rationale ===== | ||
+ | |||
+ | There are two reasons for this principle. The first reason is locality. When a varying concept is properly encapsulated in a single module, only this module is affected in case of a change. This reduces maintenance effort and [[glossary: | ||
+ | |||
+ | The second reason comes to play when the varying concept is implemented as an abstract class or interface. In this case a variation can be introduced without changing existing and tested code. This reduces testing effort (as already tested code does not need to be retested as it is not changed) as well as ripple effects (as the enhancement is done simply by adding a class. Note that for this rationale to work, the [[Liskov Substitution Principle]] also has to be adhered to. | ||
Line 37: | Line 48: | ||
* Visitor: New operations have to be added to a given more or less static inheritance structure of classes. | * Visitor: New operations have to be added to a given more or less static inheritance structure of classes. | ||
* ... | * ... | ||
+ | |||
+ | ===== Caveats ===== | ||
+ | |||
+ | See section [[#contrary principles]]. | ||
+ | |||
===== Origin ===== | ===== Origin ===== | ||
+ | |||
+ | The principle is stated, explained and used in the GoF book: | ||
Erich Gamma, Richard Helm, Ralph Johnson, John Vlissides: // | Erich Gamma, Richard Helm, Ralph Johnson, John Vlissides: // | ||
+ | |||
+ | But the idea if ECV is actually much older. It was first presented in | ||
+ | |||
+ | David Parnas: // | ||
+ | |||
===== Evidence ===== | ===== Evidence ===== | ||
Line 54: | Line 77: | ||
==== Generalizations ==== | ==== Generalizations ==== | ||
- | |||
- | * [[Generalization Principle]] (GP): Encapsulating a varying concept typically results in a more generally applicable solution. This is especially true when an abstract concept is encapsulated by introducing an interface or an abstract class. | ||
==== Specializations ==== | ==== Specializations ==== | ||
Line 64: | Line 85: | ||
==== Contrary Principles ==== | ==== Contrary Principles ==== | ||
- | * [[More Is More Complex]] (MIMC): ECV demands adding a new class for a new varying concept. | + | |
- | | + | * [[Model Principle]] (MP): ECV sometimes results in classes which do not correspond |
- | * [[Model Principle]] (MP): ECV sometimes results in classes which do not correspond | + | |
==== Complementary Principles ==== | ==== Complementary Principles ==== | ||
- | * [[Dependency Inversion | + | * [[Low Coupling]] (LC): ECV results in the creation of a new module. When introducing such a new module, LC has to be adhered to. |
- | + | * [[Liskov Substitution | |
+ | * [[Generalization Principle]] | ||
+ | * [[Dependency Inversion Principle]] (DIP): ECV may result in the introduction of an abstract base class. Here DIP demands | ||
+ | * [[Information Hiding/ | ||
==== Principle Collections ==== | ==== Principle Collections ==== | ||
{{page> | {{page> | ||
- | {{page> | ||
- | {{page> | ||
- | ===== Example | + | |
+ | ===== Examples | ||
===== Description Status ===== | ===== Description Status ===== | ||
/* Choose one of the following and comment out the rest: */ | /* Choose one of the following and comment out the rest: */ | ||
- | [[wiki: | + | /*[[wiki: |
- | /*[[wiki: | + | [[wiki: |
/ | / | ||
Line 92: | Line 113: | ||
* Erich Gamma, Richard Helm, Ralph Johnson and John Vlissides: // | * Erich Gamma, Richard Helm, Ralph Johnson and John Vlissides: // | ||
| | ||
- | * Bertrand Meyer: //[[wp> | + | * [[Single Responsibility Principle]] |
- | * Robert C. Martin: //Agile Software Development, | + | * [[Open-Closed Principle]] |
- | * [[http:// | + | |
+ | ===== Discussion ===== | ||
+ | |||
+ | Discuss this wiki article |