In the simplest definition,
generic programming is a style of
computer programming in which algorithms are written in terms of types
to-be-specified-later that are then
instantiated when needed for specific types provided as
parameters. This approach, pioneered by
ML in 1973, permits writing common
functions or
types that differ only in the set of types on which they operate when used, thus reducing
duplication. Such software entities are known as
generics in
Ada,
Delphi,
Eiffel,
Java,
C#,
F#,
Objective-C,
Swift, and
Visual Basic .NET;
parametric polymorphism in
ML,
Scala,
Haskell (the Haskell community also uses the term "generic" for a related but somewhat different concept) and
Julia;
templates in
C++ and
D; and
parameterized types in the influential 1994 book
Design Patterns. The authors of
Design Patterns note that this technique, especially when combined with
delegation, is very powerful but that "[dynamic], highly parameterized software is harder to understand than more static software."