Table of Contents

Encapsulate the Concept that Varies (ECV)

Variants and Alternative Names

Context

Principle Statement

Encapsulate the Concept that Varies, i.e. a design is better when those parts that vary are encapsulated in a separate module.

Description

This principle has two aspects that roughly correspond to the two sub-principles SRP and 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 cross-cutting concerns are avoided as much as possible. This is not completely possible but in many cases it is.

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

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 ripple effects.

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.

Strategies

Caveats

See section contrary principles.

Origin

The principle is stated, explained and used in the GoF book:

Erich Gamma, Richard Helm, Ralph Johnson, John Vlissides: Design Patterns: Elements of Reusable Object-Oriented Software (“GoF book”), p. 29

But the idea if ECV is actually much older. It was first presented in

David Parnas: On the Criteria To Be Used in Decomposing Systems into Modules

Evidence

Relations to Other Principles

Generalizations

Specializations

Contrary Principles

Complementary Principles

Principle Collections

OOD Principle Language
General Principles
ML KISS MIMC DRY GP RoE
Modularization Principles
MP HC ECV
Module Communication Principles
TdA/IE LC DIP
Interface Design Principles
EUHM PLS UP
Internal Module Design Principles
IH/E IAP LSP PSU

Examples

Description Status

Incomplete

Further Reading

Discussion

Discuss this wiki article and the principle on the corresponding talk page.