Modernes C ++ -Design
![]() | |
Autor | Andrei Alexandrescu |
---|---|
Sprache | Englisch |
Thema | C ++ |
Verleger | Addison-Wesley |
Veröffentlichungsdatum | 2001 |
Seiten | 323 pp |
ISBN | 978-0-201-70431-0 |
OCLC | 45129236 |
005.13/3 21 | |
LC -Klasse | QA76.73.C153 A42 2001 |
Modernes C ++ - Design: Generische Programmier- und Entwurfsmuster angewendet ist ein Buch von geschrieben von Andrei Alexandrescu, veröffentlicht 2001 von Addison-Wesley. Es wurde als "eines der wichtigsten C ++ - Bücher von" angesehen " Scott Meyers.[1]
Das Buch benutzt und erforscht a C ++ Programmierungstechnik genannt Vorlage Metaprogrammierung. Während Alexandrescu die Technik nicht erfunden hat, hat er sie unter den Programmierern populär gemacht. Sein Buch enthält Lösungen für praktische Probleme, denen C ++ -Programmierer konfrontiert sind. Mehrere Phrasen aus dem Buch werden jetzt in der C ++ - Community als generische Begriffe verwendet: Modernes C ++ (im Gegensatz zum C/C ++-Style), politisches Design und Typelist.
Der gesamte im Buch beschriebene Code ist in seiner Bibliothek frei verfügbar Loki. Das Buch wurde seit 2001 veröffentlicht und in mehrere Sprachen übersetzt.
Richtlinienbasierter Design
Richtlinienbasierter Design, auch bekannt als Richtlinienbasierte Klassengestaltung oder Richtlinienbasierte Programmierung, ist der Begriff in verwendet in Modernes C ++ -Design für einen Designansatz basierend auf einem Idiom Für C ++ bekannt als als Richtlinien. Es wurde als als beschrieben Kompilierungszeit Variante der Strategiemusterund hat Verbindungen zu C ++ Vorlage Metaprogrammierung. Es wurde zuerst in C ++ von Andrei Alexandrescu mit populär gemacht Modernes C ++ -Design und mit seiner Kolumne Generisches <programmieren> in dem C/C ++ Users Journalund es ist derzeit eng mit C ++ und assoziiert D Wie es benötigt wird Compiler mit hoch robust Unterstützung für Vorlagen, was vor ungefähr 2003 nicht üblich war.
Frühere Beispiele für diesen Entwurfsansatz, basierend auf dem parametrisierten generischen Code, enthalten parametrische Module (Functors) der Ml Sprachen,[2] und C ++ Allokatoren Für die Speicherverwaltungsrichtlinie.
Die zentrale Idiom in politisch basiertem Design ist a Klasse Vorlage (genannt die Gastgeber Klasse), mehrere nehmen Typ Parameter als Eingabe, die sind instanziiert mit vom Benutzer ausgewählten Typen (genannt Richtlinienklassen), jeder Implementierung ein besonderes implizites Schnittstelle (genannt Politik), und Einkapselung etwas senkrecht (oder meistens orthogonal) Aspekt des Verhaltens der sofortigen Host -Klasse. Durch die Lieferung einer Hostklasse in Kombination mit einer Reihe unterschiedlicher Implementierungen in Dosen für jede Richtlinie a Bibliothek oder Modul kann ein unterstützen exponentiell Anzahl der verschiedenen Verhaltenskombinationen, die zur Kompilierungszeit aufgelöst und durch Mischen und Übereinstimmung der verschiedenen gelieferten Richtlinienklassen in der Instanziierung der Host -Klassenvorlage ausgewählt wurden. Durch das Schreiben einer benutzerdefinierten Implementierung einer bestimmten Richtlinie kann in Situationen, in denen vom Bibliotheksimplementierer unvorhergesehene Verhaltensweisen erforderlich sind, in Situationen verwendet werden. Selbst in Fällen, in denen nicht mehr als eine Implementierung jeder Richtlinie verwendet wird, kann die Dekoration einer Klasse in Richtlinien den Entwurfsprozess unterstützen, indem sie die Modularität erhöhen und genau dort hervorheben, wo orthogonale Entwurfsentscheidungen getroffen wurden.
Während die Zusammenstellung von Softwarekomponenten aus austauschbaren Modulen ein weit entferntes neues Konzept ist, stellt das politikbasierte Design eine Innovation in der Art und Weise dar, wie es dieses Konzept auf der (relativ geringen) Ebene der Definition des Verhaltens einer einzelnen Klasse anwendet. Richtlinienklassen haben eine gewisse Ähnlichkeit mit Rückrufe, aber unterscheiden sich darin, anstatt aus einem einzigen zu bestehen FunktionEine Richtlinienklasse enthält normalerweise mehrere verwandte Funktionen (Methoden), oft kombiniert mit Zustand Variablen oder andere Einrichtungen wie verschachtelte Typen. Eine politischen Host-Klasse kann als eine Art von Art von betrachtet werden Metafunktion, nehmen Sie eine Reihe von Verhaltensweisen, die durch Typen als Eingabe dargestellt werden und als Ausgabe zurückkehren. Ein Typ, der das Ergebnis der Kombination dieser Verhaltensweisen in ein funktionierendes Ganzes darstellt. (Nicht wie Mpl Metafunktionen werden jedoch in der Regel durch die instanziierte Hostklasse selbst und nicht durch einen verschachtelten Ausgangstyp dargestellt.)
Ein wichtiges Merkmal der Politik Idiom ist, dass die Hostklasse normalerweise (obwohl es nicht ausschließlich notwendig ist) ableiten von (machen sich selbst a Kinderklasse von) jeder seiner politischen Klassen mit (öffentlich) Mehrfacherbe. (Alternativen sind für die Host -Klasse, die lediglich eine Mitgliedsvariable jedes Richtlinienklassentyps enthalten oder die Richtlinienklassen privat erben. Die Erben der Richtlinienklassen hat jedoch öffentlich den Hauptvorteil, dass eine Richtlinienklasse neue Methoden hinzufügen kann, die von den geerbt werden können instanziierte Hostklasse und für ihre Benutzer zugänglich, die die Host -Klasse selbst nicht einmal wissen muss.) Ein bemerkenswerter Merkmal dieses Aspekts der Richtlinien -Idiom ist, dass, relativ zu Objekt orientierte Programmierung, Richtlinien umdrehen die Beziehung zwischen Basisklasse und abgeleitete Klasse - während in OOP -Schnittstellen traditionell dargestellt werden durch ((abstrakt) Basisklassen und Implementierungen von Schnittstellen durch abgeleitete Klassen, in politisch basiertem Design Die abgeleitete (Host) Klasse repräsentiert die Schnittstellen und die Basisklassen (Richtlinien) implementieren sie. Bei Richtlinien stellt das öffentliche Erbe keine IS-A-Beziehung zwischen dem Host und den politischen Klassen dar. Dies würde zwar traditionell als Beweis für einen Designfehler in OOP -Kontexten angesehen werden, dies gilt jedoch nicht im Kontext der politischen Idiom.
Ein Nachteil der Richtlinien in ihrer gegenwärtigen Inkarnation ist, dass die politische Schnittstelle keine direkte, explizite Vertretung in hat Code, sondern implizit definiert, über Ententypisierungund muss separat und manuell dokumentiert werden, in Kommentare. Die Hauptidee besteht darin, die Analyse der Commonality-Variability-Analyse zu verwenden, um den Typ in die feste Implementierung und Schnittstelle, die politischbasierte Klasse und die verschiedenen Richtlinien zu unterteilen. Der Trick besteht darin, zu wissen, was in die Hauptklasse geht und welche Richtlinien man erzeugen sollte. Der oben erwähnte Artikel enthält folgende Antwort: Wo immer wir eine mögliche einschränkende Entwurfsentscheidung treffen müssen, sollten wir diese Entscheidung verschieben, wir sollten sie an eine angemessen benannte Richtlinie delegieren.
Richtlinienklassen können Implementierung, Typdefinitionen usw. enthalten. Grundsätzlich definiert der Designer der Hauptvorlagenklasse, was die Richtlinienklassen bereitstellen sollen, welche Anpassungspunkte sie implementieren müssen.
Es kann eine heikle Aufgabe sein, eine gute Reihe von Richtlinien zu erstellen, genau die richtige Zahl (z. B. das erforderliche Minimum). Die unterschiedlichen Anpassungspunkte, die zusammen gehören, sollten in ein politisches Argument wie Speicherrichtlinie, Validierungsrichtlinie usw. eingehen. Grafikdesigner können ihren Richtlinien einen Namen geben, der Konzepte darstellt, und nicht derjenigen, die Operationen oder kleinere Implementierungsdetails darstellen.
Das politikbasierte Design kann andere nützliche Techniken enthalten. Zum Beispiel die Template -Methodenmuster kann für die Kompilierungszeit neu interpretiert werden, so dass eine Hauptklasse eine hat Skelettalgorithmus, was - an Anpassungsstellen - die entsprechenden Funktionen einiger Richtlinien bezeichnet.
Dies wird dynamisch durch erreicht Konzepte[3] In zukünftigen Versionen von C ++.
Einfaches Beispiel
Unten dargestellt ist ein einfaches (erfundenes) Beispiel eines C ++ Hallo Weltprogramm, wo der zu druckende Text und die Druckmethode mit Richtlinien zersetzt werden. In diesem Beispiel, Hallo Welt ist eine Host -Klasse, in der zwei Richtlinien erforderlich sind, um anzugeben, wie eine Nachricht angezeigt werden soll, und die andere für die tatsächliche Nachricht. Beachten Sie, dass die generische Implementierung in liegt Laufen
und deshalb kann der Code nicht kompiliert werden, es sei denn, beide Richtlinien (Richtlinien (Drucken
und Nachricht
) sind bereitgestellt.
#enthalten #enthalten Schablone <Modellname Ausgabepolizität, Modellname Languagepolicy> Klasse Hallo Welt : Privatgelände Ausgabepolizität, Privatgelände Languagepolicy { Öffentlichkeit: // Verhaltensmethode. Leere Laufen() Const { // Zwei politische Methoden. Drucken(Nachricht()); } Privatgelände: Verwendung Languagepolicy::Nachricht; Verwendung Ausgabepolizität::Drucken; }; Klasse OutputPolicyWritetocout { geschützt: Schablone <Modellname Nachrichtentyp> Leere Drucken(Nachrichtentyp&& Botschaft) Const { std::Cout << Botschaft << std::Endl; } }; Klasse LangusepolicyEnglish { geschützt: std::Saite Nachricht() Const { Rückkehr "Hallo Welt!"; } }; Klasse LanguagePolicygerman { geschützt: std::Saite Nachricht() Const { Rückkehr "Hallo Welt!"; } }; int hauptsächlich() { // Beispiel 1 Verwendung HelloWorldenglish = Hallo Welt<OutputPolicyWritetocout, LangusepolicyEnglish>; HelloWorldenglish Hallo Welt; Hallo Welt.Laufen(); // Drucke "Hallo, Welt!". // Beispiel 2 // tut dasselbe, verwendet aber eine andere Sprachpolitik. Verwendung HelloWorldgerman = Hallo Welt<OutputPolicyWritetocout, LanguagePolicygerman>; HelloWorldgerman Hello_world2; Hello_world2.Laufen(); // druckt "Hallo Welt!". }
Designer können einfach mehr schreiben Ausgabepolizität
s durch Hinzufügen neuer Klassen mit der Mitgliedsfunktion Drucken
und nimm diese als neu Ausgabepolizität
s.
Loki -Bibliothek
Loki ist der Name von a C ++ Softwarebibliothek geschrieben von Andrei Alexandrescu Als Teil seines Buches Modernes C ++ -Design.
Die Bibliothek nutzt C ++ umfassend Vorlage Metaprogrammierung und implementiert mehrere häufig verwendete Werkzeuge: Typelist, Functor, Singleton, Smart Zeiger, Objektfabrik, Besucher und Multimethods.
Ursprünglich war die Bibliothek nur mit zwei der am häufigsten konformen C ++ - Compiler kompatibel (Codewarrior und Comeau C/C ++): Spätere Anstrengungen haben es mit einer Vielzahl von Compilern (einschließlich älteren Visuell c ++ 6.0, Borland C ++ Builder 6.0, Klang und GCC). Compiler -Anbieter verwendeten Loki als Kompatibilitätsbenchmark, was die Anzahl der konformen Compiler weiter erhöhte.[4]
Die Wartung und Weiterentwicklung von Loki wurde in einer Open-Source-Gemeinschaft unter der Leitung von Peter Kümmermel und Richard Sposato als a fortgesetzt SourceForge -Projekt. Die laufenden Beiträge vieler Menschen haben die allgemeine Robustheit und Funktionalität der Bibliothek verbessert. Loki ist nicht mehr an das Buch gebunden, da es bereits viele neue Komponenten hat (z. B. StrongPTR, Printf und ScopeGuard). Loki inspirierte ähnliche Werkzeuge und Funktionen jetzt auch in der Schub Bibliothekssammlung.
Siehe auch
Verweise
- ^ Scott Meyers, die wichtigsten C ++ - Bücher aller Zeiten
- ^ https://www.cl.cam.ac.uk/~lp15/mlbook/pdf/chapter7.pdf[Bare URL PDF]
- ^ http://www.strustrup.com/good_concepts.pdf[Bare URL PDF]
- ^ C ++ und darüber hinaus 2011: "Fragen Sie uns irgendetwas", Sitzung, http://channel9.msdn.com/shows/going+deep/c-and-beyond-2011-scott---- und -herb-ask-us-anything bei 51: 40-51: 51
Externe Links
- Alexandrescus Website (mit Buch errata [1])
- Smart Zeiger (Beispielkapitel aus dem Buch)
- Loki an SourceForge
- Originalquellcode des Buchverlags