Wie Bjarne Stroustrup betont, ist „C++ eine Multiparadigmensprache“. Sie unterstützt zahlreiche unterschiedliche Programmierstile beziehungsweise Paradigmen, und die objektorientierte Programmierung ist nur eines davon. Weitere Beispiele sind die strukturierte und die generische Programmierung.
Wie Thomas Becker in diesem interessanten Artikel erläutert, besteht ein Spannungsverhältnis zwischen generischer Programmierung und OOP. Dort wird auch Alexander Stepanov, einer der erfahrensten Köpfe der C++-Welt, mit seiner Meinung zu OOP zitiert:
Let us start with a little trivia quiz. Who said the following things about object-oriented programming?
"I find OOP technically unsound."
"I find OOP philosophically unsound."
"I find OOP methodologically wrong."
"I have yet to see an interesting piece of code that comes from these OO people."
"I think that object orientedness is almost as much of a hoax as artificial intelligence."
All the quotes above are from an interview with Alexander Stepanov, the inventor of the STL and elder statesman of generic programming.
To have a concrete idea about the generics flexibility, let’s compare the implementation of a class calculating a tax in OOP and generic programming.Betrachten wir einen wesentlichen Unterschied zwischen beiden Ansätzen, der Alexander Stepanovs Haltung zur OOP erklären könnte. Als einfaches Beispiel dient uns ein Steuerrechner.

CTaxCalculator arbeitet ausschließlich mit Klassen zusammen, die von ICalculator abgeleitet sind. Um unseren Algorithmus zu implementieren, müssen wir von ICalculator erben und einige virtuelle Methoden überschreiben.
Zum Vergleich hier ein Beispiel für einen generischen TaxCalculator:

Die Klasse CGenericTaxCalculator ist nicht auf eine bestimmte Art von Klasse beschränkt. Sie kann mit jedem Typ arbeiten, der die Steuer berechnen kann – unabhängig davon, wo dieser Typ in einer Klassenhierarchie steht.
Der OOP-Ansatz folgt eher einem „Ist-orientierten Ansatz“: Vererbung wird übermäßig eingesetzt, und in fast jedem OOP-Code arbeitet eine Klasse A mit einer anderen Klasse B zusammen, wenn Bisteine Art einer anderen Klasse ist – unabhängig davon, ob diese abstrakt ist oder nicht.
Beim generischen Ansatz hingegen arbeitet eine Klasse A mit B zusammen, wenn Bhatbestimmte Methoden und Felder besitzt – eine Vererbung von einer bestimmten Klasse ist nicht erforderlich.
Dadurch wirkt generische Programmierung natürlicher und flexibler: Entwickler können einen „Hat-orientierten Ansatz“ verfolgen. OOP ist aufgrund der durch Vererbung entstehenden starken Kopplung starrer und zwingt Entwickler eher zu einem „Ist-orientierten Ansatz“.
Denken Sie darüber nach: Der „Hat-orientierten Ansatz“ ist der natürlichere Ansatz. Auch in der realen Welt arbeite ich mit einer Person zusammen, diehatbestimmte Fähigkeiten besitzt – unabhängig davon, ob sieistaus einer bestimmten Familie stammt.
Die Flexibilität generischer Programmierung kann sie zu einer bevorzugten Wahl für modernes C++-Design machen, wie Andrei Alexandrescu hervorhebt:
Modern C++ Design defines and systematically uses generische Komponenten - highly flexible design artifacts that are mixable and matchable to obtain rich behaviors with a small, orthogonal body of code.Drei Punkte seiner Aussage sind besonders interessant:
- Modern C++ Design definiert undverwendet systematischgenerische Komponenten.
- HochgradigflexiblesDesign.
- Umfangreiches Verhalten mit einemkleinen, orthogonalenCodebestand erzielen.
Zusammenfassend lässt sich sagen: Generische Programmierung ist natürlicher und flexibler als der OOP-Ansatz und bietet mehr Möglichkeiten, effizienten Code zu schreiben.
