[ 1] Gamma, Erich,
Richard Helm, Ralph
Johnson, and John
of Reusable Object-Oriented Software.
Boston: Addison-Wesley, 1994.
itself is a design pattern. For
pure functional programming
languages, a monad is a design
pattern to implement states
or functions with side effects.
Model-based paradigms are
expected to accompany design
patterns when overcoming their
inherent static nature.
The existing paradigms were
never intended for generic use.
Except for imperative programming, the paradigms emerged
as byproducts from the need
to solve problems in particular
• Functional programming:
• Model-driven engineering:
[ 2] Alexandrescu,
Andrei. Modern C++
what constitutes a design pattern
depends on what is considered
good software design. Otherwise,
design patterns would not have
been discovered in the first
Design patterns are specific
to programming paradigms.
Programming paradigms represent the core programming concepts understood by the software
developer. While many claim to
be programming paradigms, only
a few qualify as fundamental:
• Imperative programming
• Functional programming
• Model-driven engineering
[ 3] Arnout, Karin.
“From Patterns to
diss., Swiss Institute
of Technology, 2004.
February 20, 2008.
each step the software is restructured by separation into units of
concerns. The idea is to repeat
refactoring until the product has
regained the state of good software design—until the software
is in a state where developers
can perform anticipated changes
without proliferation of conventions.
However, refactoring has
limits. Refactoring comes to
a halt as it reaches the border
of the programming language.
The idiosyncrasies of the used
programming language prevent
the remaining conventions from
being refactored or factored out.
There is a name for such conventions: design patterns. The book
Design Patterns states [ 1]: “Our
design patterns capture many of
the structures that result from
refactoring.” In other words,
design patterns are residual
conventions after refactoring for
good software design.
It is noteworthy that certain
design patterns have been successfully factored out for some
programming languages [ 2, 3].
These findings confirm that
These paradigms are characterized by their restrictive view.
The names they carry signal that
the entire software is expressed
in terms of a single concept:
Everything is an instruction, a
function, an object, or a model.
Design patterns exist for all
these paradigms. The original
Design Patterns [ 1] includes 23
design patterns for OOP. For
imperative programming OOP
The arbitrariness of the paradigms is responsible for making proliferation of conventions
inevitable. As loosely defined as
they are, there is no hint that
they were formed by conscious
design. Programming languages
reuse and extend these arbitrary paradigms. The ones that
commit themselves to a single
paradigm proudly state that they
are pure object-oriented or pure
functional. Other programming
languages can be classified as
hybrid or even multiparadigm
languages. Although programming languages include syntactic
sugar as conveniences for commonly provoked conventions, the
paradigms remain fundamentally unaltered.
Integrated development environments (IDEs) ease software
development by integrating the
most popular tools supporting