Vorwort
Diese Arbeit wurde mithilfe von KI übersetzt. Wir freuen uns über dein Feedback und deine Kommentare: translation-feedback@oreilly.com
In deinen Händen hältst du das C++-Buch, das ich vor vielen Jahren gerne gehabt hätte. Nicht als eines meiner ersten Bücher, nein, sondern als Buch für Fortgeschrittene, nachdem ich die Sprachmechanik bereits verdaut hatte und in der Lage war, über die C++-Syntax hinaus zu denken. Ja, dieses Buch hätte mir definitiv geholfen, die grundlegenden Aspekte von wartbarer Software besser zu verstehen, und ich bin sicher, dass es auch dir helfen wird.
Warum ich dieses Buch geschrieben habe
Zu der Zeit, als ich mich wirklich mit der Sprache beschäftigte (das war ein paar Jahre nach der Veröffentlichung des ersten C++-Standards), hatte ich so ziemlich jedes C++-Buch gelesen, das es gab. Obwohl viele dieser Bücher großartig waren und mir den Weg zu meiner jetzigen Karriere als C++-Trainer und -Berater geebnet haben, konzentrierten sie sich zu sehr auf die kleinen Details und die Besonderheiten der Implementierung und waren zu weit von dem großen Ganzen einer wartbaren Software entfernt.
Zu dieser Zeit gab es nur wenige Bücher, die sich wirklich mit der Entwicklung großer Softwaresysteme befassten. Zu diesen Büchern gehörten John Lakos' Large ScaleC++ Software Design,1 eine großartige, aber buchstäblich schwere Einführung in das Abhängigkeitsmanagement, und das so genannte Gang of Four-Buch,das klassische Buch über Software-Entwurfsmuster.2 Leider hat sich diese Situation im Laufe der Jahre nicht wirklich geändert: Die meisten Bücher, Vorträge, Blogs usw. konzentrieren sich in erster Linie auf die Sprachmechanik und -funktionen - die kleinen Details und Besonderheiten. Nur sehr wenige - und meiner Meinung nach viel zu wenige - Neuerscheinungen konzentrieren sich auf wartbare Software, Änderbarkeit, Erweiterbarkeit und Testbarkeit. Und wenn sie es versuchen, fallen sie leider schnell wieder in die übliche Gewohnheit zurück, Sprachmechanismen zu erklären und Funktionen zu demonstrieren.
Aus diesem Grund habe ich dieses Buch geschrieben. Ein Buch, das sich im Gegensatz zu den meisten anderen nicht mit der Mechanik oder den vielen Funktionen der Sprache beschäftigt, sondern sich vor allem auf die Änderbarkeit, Erweiterbarkeit und Testbarkeit von Software im Allgemeinen konzentriert. Ein Buch, das nicht vorgibt, dass die Verwendung neuer C++-Standards oder -Funktionen den Unterschied zwischen guter und schlechter Software ausmacht, sondern das stattdessen deutlich zeigt, dass das Management von Abhängigkeiten entscheidend ist, dass die Abhängigkeiten in unserem Code darüber entscheiden, ob er gut oder schlecht ist. Damit ist es ein seltenes Buch in der Welt von C++, denn es konzentriert sich auf das große Ganze: das Softwaredesign.
Worum es in diesem Buch geht
Software Design
Meiner Meinung nach ist gutes Softwaredesign das A und O eines jeden erfolgreichen Softwareprojekts. Doch trotz seiner grundlegenden Rolle gibt es nur wenig Literatur zu diesem Thema und nur wenige Ratschläge, was man tun sollte und wie man es richtig macht. Warum das so ist? Nun, weil es schwierig ist. Sehr schwierig. Wahrscheinlich ist es der schwierigste Aspekt beim Schreiben von Software, mit dem wir uns auseinandersetzen müssen. Und das liegt daran, dass es keine einzige "richtige" Lösung gibt, keinen "goldenen" Ratschlag, der über Generationen von Softwareentwicklern weitergegeben werden kann. Es kommt immer darauf an.
Trotz dieser Einschränkung werde ich dir Tipps geben, wie du gute, qualitativ hochwertige Software entwickeln kannst. Ich werde Entwurfsprinzipien, Entwurfsrichtlinien und Entwurfsmuster vorstellen, die dir helfen, Abhängigkeiten besser zu verstehen und deine Software zu etwas zu machen, mit dem du jahrzehntelang arbeiten kannst. Wie bereits erwähnt, gibt es keinen "goldenen" Ratschlag und dieses Buch enthält keine ultimative oder perfekte Lösung. Stattdessen versuche ich, die grundlegenden Aspekte guter Software, die wichtigsten Details, die Vielfalt sowie die Vor- und Nachteile verschiedener Designs aufzuzeigen. Außerdem formuliere ich intrinsische Designziele und zeige, wie man diese Ziele mit Modern C++ erreichen kann.
Modernes C++
Seit mehr als einem Jahrzehnt feiern wir die Einführung von Modern C++, loben die vielen neuen Funktionen und Erweiterungen der Sprache und erwecken damit den Eindruck, dass Modern C++ uns helfen wird, alle softwarebezogenen Probleme zu lösen. Nicht so in diesem Buch. Dieses Buch gibt nicht vor, dass ein paar intelligente Zeiger den Code "modern" machen oder automatisch zu einem guten Design führen. Außerdem zeigt dieses Buch Modern C++ nicht als eine Ansammlung neuer Funktionen. Stattdessen zeigt es, wie sich die Philosophie der Sprache entwickelt hat und wie wir heute C++-Lösungen implementieren.
Aber natürlich werden wir auch Code sehen. Sehr viel davon. Und natürlich werden in diesem Buch die Funktionen der neueren C++-Standards (einschließlich C++20) genutzt, aber es wird auch darauf geachtet, dass das Design unabhängig von den Implementierungsdetails und den verwendeten Funktionen ist. Neue Funktionen ändern nicht die Regeln darüber, was gutes oder schlechtes Design ist; sie verändern lediglich die Art und Weise, wie wir gutes Design umsetzen. Sie machen es einfacher, gutes Design zu implementieren. Dieses Buch zeigt und diskutiert also Implementierungsdetails, verliert sich aber (hoffentlich) nicht in ihnen und bleibt immer auf das große Ganze fokussiert: Softwaredesign und Entwurfsmuster.
Entwurfsmuster
Als sobald du von Entwurfsmustern sprichst, weckst du unwillkürlich die Erwartung an objektorientierte Programmierung und Vererbungshierarchien. Ja, dieses Buch wird den objektorientierten Ursprung vieler Entwurfsmuster aufzeigen. Es wird aber auch deutlich machen, dass es nicht nur einen Weg gibt, ein Entwurfsmuster sinnvoll zu nutzen. Ich zeige, wie sich die Umsetzung von Entwurfsmustern weiterentwickelt und diversifiziert hat. Dabei kommen viele verschiedene Paradigmen zum Einsatz, darunter objektorientierte Programmierung, generische Programmierung und funktionale Programmierung. Dieses Buch erkennt die Realität an, dass es nicht das eine wahre Paradigma gibt, und tut nicht so, als gäbe es nur einen einzigen Ansatz, eine immer funktionierende Lösung für alle Probleme. Stattdessen versucht es, Modern C++ als das zu zeigen, was es wirklich ist: die Möglichkeit, alle Paradigmen zu kombinieren, sie zu einem starken und dauerhaften Netz zu verweben und ein Softwaredesign zu schaffen, das über Jahrzehnte hinweg Bestand hat.
Ich hoffe, dieses Buch erweist sich als das fehlende Stück in der C++ Literatur. Ich hoffe, es hilft dir so sehr, wie es mir geholfen hätte. Ich hoffe, dass es einige Antworten enthält, nach denen du gesucht hast, und dir ein paar wichtige Erkenntnisse liefert, die dir gefehlt haben. Und ich hoffe auch, dass dieses Buch dich ein wenig unterhält und motiviert, alles zu lesen. Vor allem aber hoffe ich, dass dieses Buch dir die Bedeutung von Softwaredesign und die Rolle von Entwurfsmustern zeigt. Denn, wie du sehen wirst, sind Design Patterns überall!
Für wen dieses Buch ist
Dieses Buch ist für jeden C++-Entwickler von Wert. Insbesondere ist es für jeden C++-Entwickler gedacht, der daran interessiert ist, die üblichen Probleme wartbarer Software zu verstehen und gemeinsame Lösungen für diese Probleme kennenzulernen (und ich gehe davon aus, dass das tatsächlichjeder C++-Entwickler ist). Dieses Buch ist jedoch kein Buch für C++-Anfänger. Tatsächlich setzen die meisten Richtlinien in diesem Buch eine gewisse Erfahrung mit Softwareentwicklung im Allgemeinen und C++ im Besonderen voraus. Ich gehe zum Beispiel davon aus, dass du die Sprachmechanik der Vererbungshierarchien gut beherrschst und etwas Erfahrung mit Templates hast. Dann kann ich, wann immer es nötig und sinnvoll ist, zu den entsprechenden Funktionen greifen. Hin und wieder werde ich sogar auf einige C++20-Features (insbesondere C++20-Konzepte) zurückgreifen. Da der Schwerpunkt jedoch auf dem Softwaredesign liegt, werde ich mich nur selten mit der Erklärung eines bestimmten Features aufhalten; wenn du also ein Feature nicht kennst, schaue bitte in deiner Lieblings-C++-Sprachreferenz nach. Nur gelegentlich werde ich einige Hinweise hinzufügen, meist zu gängigen C++-Idiomen (wie der 5er-Regel).
Wie dieses Buch strukturiert ist
Dieses Buch ist in Kapitel gegliedert, die jeweils mehrere Richtlinien enthalten. Jede Richtlinie konzentriert sich auf einen Schlüsselaspekt wartbarer Software oder ein bestimmtes Entwurfsmuster. Die Richtlinien stellen also die wichtigsten Erkenntnisse dar, die Aspekte, von denen ich hoffe, dass sie dir den größten Nutzen bringen. Sie sind so geschrieben, dass du sie alle von vorne bis hinten lesen kannst, aber da sie nur lose miteinander verbunden sind, kannst du auch mit dem Leitfaden beginnen, der deine Aufmerksamkeit erregt. Trotzdem sind sie nicht unabhängig voneinander. Deshalb enthält jeder Leitfaden die notwendigen Querverweise auf andere Leitfäden, um dir zu zeigen, dass alles miteinander verbunden ist.
In diesem Buch verwendete Konventionen
In diesem Buch werden die folgenden typografischen Konventionen verwendet:
- Kursiv
-
Weist auf neue Begriffe, URLs, E-Mail-Adressen, Dateinamen und Dateierweiterungen hin.
Constant width
-
Wird für Programmlistings sowie innerhalb von Absätzen verwendet, um auf Programmelemente wie Variablen- oder Funktionsnamen, Datenbanken, Datentypen, Umgebungsvariablen, Anweisungen und Schlüsselwörter hinzuweisen.
Constant width bold
-
Zeigt Befehle oder anderen Text an, der vom Benutzer wortwörtlich eingetippt werden sollte.
Constant width italic
-
Zeigt Text an, der durch vom Benutzer eingegebene Werte oder durch kontextabhängige Werte ersetzt werden soll.
Tipp
Dieses Element steht für einen Tipp oder eine Anregung.
Hinweis
Dieses Element steht für einen allgemeinen Hinweis.
Code-Beispiele verwenden
Zusätzliches Material (Code-Beispiele, Übungen usw.) steht unter https://github.com/igl42/cpp_software_design zum Download bereit .
Wenn du eine technische Frage oder ein Problem mit den Codebeispielen hast, sende bitte eine E-Mail an bookquestions@oreilly.com.
Dieses Buch soll dir helfen, deine Arbeit zu erledigen. Wenn in diesem Buch Beispielcode angeboten wird, darfst du ihn in deinen Programmen und deiner Dokumentation verwenden. Du musst uns nicht um Erlaubnis fragen, es sei denn, du reproduzierst einen großen Teil des Codes. Wenn du zum Beispiel ein Programm schreibst, das mehrere Teile des Codes aus diesem Buch verwendet, brauchst du keine Erlaubnis. Der Verkauf oder die Verbreitung von Beispielen aus O'Reilly-Büchern erfordert jedoch eine Genehmigung. Die Beantwortung einer Frage mit einem Zitat aus diesem Buch und einem Beispielcode erfordert keine Genehmigung. Wenn du einen großen Teil des Beispielcodes aus diesem Buch in die Dokumentation deines Produkts aufnimmst, ist eineGenehmigung erforderlich.
Wir freuen uns über eine Namensnennung, verlangen sie aber in der Regel nicht. Eine Quellenangabe umfasst normalerweise den Titel, den Autor, den Verlag und die ISBN. Zum Beispiel: "C++ Software Design von Klaus Iglberger (O'Reilly). Copyright 2022 Klaus Iglberger, 978-1-098-11316-2."
Wenn du der Meinung bist, dass deine Verwendung von Codebeispielen nicht unter die Fair-Use-Regelung oder die oben genannte Erlaubnis fällt, kannst du uns gerne unter permissions@oreilly.com kontaktieren .
O'Reilly Online Learning
Hinweis
Seit mehr als 40 Jahren bietet O'Reilly Media Schulungen, Wissen und Einblicke in Technologie und Wirtschaft, um Unternehmen zum Erfolg zu verhelfen.
Unser einzigartiges Netzwerk von Experten und Innovatoren teilt sein Wissen und seine Erfahrung durch Bücher, Artikel und unsere Online-Lernplattform. Die Online-Lernplattform von O'Reilly bietet dir On-Demand-Zugang zu Live-Trainingskursen, ausführlichen Lernpfaden, interaktiven Programmierumgebungen und einer umfangreichen Text- und Videosammlung von O'Reilly und über 200 anderen Verlagen. Weitere Informationen erhältst du unter http://oreilly.com.
Wie du uns kontaktierst
Bitte wende dich mit Kommentaren und Fragen zu diesem Buch an den Verlag:
- O'Reilly Media, Inc.
- 1005 Gravenstein Highway Nord
- Sebastopol, CA 95472
- 800-998-9938 (in den Vereinigten Staaten oder Kanada)
- 707-829-0515 (international oder lokal)
- 707-829-0104 (Fax)
Wir haben eine Webseite für dieses Buch, auf der wir Errata, Beispiele und zusätzliche Informationen auflisten. Du kannst diese Seite unter https://oreil.ly/c-plus-plus aufrufen .
Schreib eine E-Mail an bookquestions@oreilly.com, um Kommentare oder technische Fragen zu diesem Buch zu stellen.
Neuigkeiten und Informationen über unsere Bücher und Kurse findest du unter http://oreilly.com.
Du findest uns auf LinkedIn: https://linkedin.com/company/oreilly-media.
Folge uns auf Twitter: http://twitter.com/oreillymedia.
Sieh uns auf YouTube: http://youtube.com/oreillymedia.
Danksagungen
Ein Buch wie dieses ist niemals die Leistung einer einzelnen Person. Im Gegenteil, ich muss mich ausdrücklich bei vielen Menschen bedanken, die mir auf unterschiedliche Weise geholfen haben, dieses Buch Wirklichkeit werden zu lassen. Zuallererst möchte ich meiner Frau Steffi meinen tiefen Dank aussprechen, die das gesamte Buch durchgelesen hat, ohne C++ überhaupt zu kennen. Und die sich um unsere beiden Kinder gekümmert hat, um mir die nötige Ruhe zu geben, um all diese Informationen zu Papier zu bringen (ich bin mir immer noch nicht sicher, welches der beiden das größere Opfer war).
Ein besonderes Dankeschön geht an meine Rezensenten, Daniela Engert, Patrice Roy, Stefan Weller, Mark Summerfield und Jacob Bandes-Storch, die ihre wertvolle Zeit investiert haben, um dieses Buch zu verbessern, indem sie meine Erklärungen und Beispiele immer wieder in Frage gestellt haben.
Ein großes Dankeschön geht auch an Arthur O'Dwyer, Eduardo Madrid und Julian Schmidt für ihren Input und ihr Feedback zum Type Erasure Design Pattern und an Johannes Gutekunst für die Diskussionen zur Softwarearchitektur und Dokumentation.
Außerdem möchte ich mich bei meinen beiden Kaltlesern, Matthias Dörfel und Vittorio Romeo, bedanken, die mir geholfen haben, viele Fehler in letzter Sekunde zu finden (und das haben sie auch).
Zu guter Letzt geht ein großes Dankeschön an meine Lektorin Shira Evans, die viele Stunden damit verbracht hat, mir wertvolle Ratschläge zu geben, damit das Buch einheitlicher wird und mehr Spaß beim Lesen macht.
Get C++ Software Design now with the O’Reilly learning platform.
O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.