
{"id":1593,"date":"2024-10-24T10:50:02","date_gmt":"2024-10-24T10:50:02","guid":{"rendered":"https:\/\/avant-iconic.com\/?p=1593"},"modified":"2026-01-16T20:22:53","modified_gmt":"2026-01-16T20:22:53","slug":"was-ist-mit-oop-los","status":"publish","type":"post","link":"https:\/\/avant-iconic.com\/en\/was-ist-mit-oop-los\/","title":{"rendered":"Was ist mit OOP passiert?"},"content":{"rendered":"<p class=\"wp-block-paragraph\">In der Landschaft der Programmiersprachen und Frameworks, die sich ohnehin schon schnell ver\u00e4ndert, gab es im letzten Jahrzehnt einen Pradigmenwechsel, der vielen unbemerkt geblieben ist. Zwar sind OOP und die Unterst\u00fctzung von Klassen und Objekten noch immer ein Grundpfeiler vieler Programmiersprachen. Doch die Semantik weicht in der Praxis von dieser scheinbar konstanten Syntax mittlerweile ab, und zwar in fast jedem Softwareprojekt.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Heute gibt es Services, DTOs und Komponenten, die h\u00e4ufig noch formal Objekte sind, aber ganz anders genutzt werden. Ein genauer Blick auf das Thema lohnt sich, denn so kann ein wichtiger Trend aufgedeckt werden, der viele andere Entwicklungen der letzten Jahre erkl\u00e4rt.<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter size-medium\"><img loading=\"lazy\" decoding=\"async\" width=\"300\" height=\"300\" src=\"https:\/\/avant-iconic.com\/wp-content\/uploads\/2024\/01\/DALL\u00b7E-2024-01-23-18.34.35-An-artistic-representation-of-a-UML-Unified-Modeling-Language-diagram-focusing-on-its-structure-and-elements-but-without-any-text.-The-image-shoul-300x300.png\" alt=\"\" class=\"wp-image-1619\" srcset=\"https:\/\/avant-iconic.com\/wp-content\/uploads\/2024\/01\/DALL\u00b7E-2024-01-23-18.34.35-An-artistic-representation-of-a-UML-Unified-Modeling-Language-diagram-focusing-on-its-structure-and-elements-but-without-any-text.-The-image-shoul-300x300.png 300w, https:\/\/avant-iconic.com\/wp-content\/uploads\/2024\/01\/DALL\u00b7E-2024-01-23-18.34.35-An-artistic-representation-of-a-UML-Unified-Modeling-Language-diagram-focusing-on-its-structure-and-elements-but-without-any-text.-The-image-shoul-150x150.png 150w, https:\/\/avant-iconic.com\/wp-content\/uploads\/2024\/01\/DALL\u00b7E-2024-01-23-18.34.35-An-artistic-representation-of-a-UML-Unified-Modeling-Language-diagram-focusing-on-its-structure-and-elements-but-without-any-text.-The-image-shoul-768x768.png 768w, https:\/\/avant-iconic.com\/wp-content\/uploads\/2024\/01\/DALL\u00b7E-2024-01-23-18.34.35-An-artistic-representation-of-a-UML-Unified-Modeling-Language-diagram-focusing-on-its-structure-and-elements-but-without-any-text.-The-image-shoul-12x12.png 12w, https:\/\/avant-iconic.com\/wp-content\/uploads\/2024\/01\/DALL\u00b7E-2024-01-23-18.34.35-An-artistic-representation-of-a-UML-Unified-Modeling-Language-diagram-focusing-on-its-structure-and-elements-but-without-any-text.-The-image-shoul.png 1024w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/figure>\n\n\n\n<div class=\"wp-block-stackable-heading stk-block-heading stk-block-heading--v2 stk-block stk-c3ce202\" id=\"eine-bestandsaufnahme\" data-block-id=\"c3ce202\"><h2 class=\"stk-block-heading__text\">Eine Bestandsaufnahme<\/h2><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">Viele einf\u00fchrende Programmierkurse an Universit\u00e4ten und Fachhochschulen halten immer noch an der Vermittlung der klassischen objektorientierten Denkweise und Semantik fest. So werden Klassen f\u00fcr geometrische Formen, Tiere oder Fahrzeuge entworfen und einfache Spiele oder Simulationen implementiert, wo jedes Objekt der simulierten Welt auch eine Instanz einer Klasse ist. Das soll, so zumindest die Theorie, die Studenten auf die weit-verbreiteten OOP-Entwicklungstechniken vorbereiten.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Doch selbst in der Spieleentwicklung ist mittlerweile etwa das <a href=\"https:\/\/www.guru99.com\/entity-component-system.html\" target=\"_blank\" rel=\"noopener\">ECS-Pattern<\/a> fest etabliert, das allenfalls oberfl\u00e4chlich mit OOP zu tun hat, indem es meist die Klassen-Syntax der Programmiersprache nutzt.<\/p>\n\n\n\n<div class=\"wp-block-stackable-heading stk-block-heading stk-block-heading--v2 stk-block stk-27ebfae\" id=\"oop-im-backend\" data-block-id=\"27ebfae\"><h3 class=\"stk-block-heading__text\">OOP im Backend<\/h3><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">Noch deutlicher ist die Diskrepanz im Backend. Hier nutzen die meisten Systeme das Design Pattern (auch Entwurfsmuster genannt) der Dependency Injection. Klassische Beispiele hierf\u00fcr sind ASP.NET (Core), Spring Boot, Nest.JS oder Laravel, im Frontend-Bereich ist auch Angular zu erw\u00e4hnen. Dieses Pattern hat zweifellos seinen Ursprung in der Objektorientierung und wurde oft dazu genutzt, die <a href=\"https:\/\/de.wikipedia.org\/wiki\/Prinzipien_objektorientierten_Designs#SOLID-Prinzipien\" target=\"_blank\" rel=\"noopener\">SOLID-Prinzipien<\/a> umzusetzen. Es \u00fcberwindet jedoch, genauso wie SOLID, auch ein St\u00fcck weit die Einschr\u00e4nkungen und Probleme von OOP. Es \u00e4hnelt heute in der Praxis eher einer Art flexiblem Modulsystem und steht in Konkurrenz zu Konstrukten wie ES6-Modulen oder C- und C++-Includes.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Woran kann man diese gewagt erscheinende Behauptung festmachen? Ganz einfach: Ein typisches API-Projekt in ASP.NET Core oder Spring Boot besteht aus Controllern und Services. Diese besitzen meist keinen Zustand, kapseln aber daf\u00fcr die gesamte Funktionalit\u00e4t. Die DTOs, also Datenobjekte f\u00fcr den externen Gebrauch und Entities, also Datenbank-Datenobjekte, enthalten dagegen alle Daten und daf\u00fcr nahezu keine eigene Funktionalit\u00e4t. Genau also wie ordentlicher nicht-OOP-Code in C oder JavaScript.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Diese Trennung von Funktionalit\u00e4t und Daten wurde noch vor wenigen Jahren von OOPlern als &#8222;prozedural&#8220; angeprangert. Damals galt prozeduraler Code als grunds\u00e4tzlich schlecht. Objekte sollten immer Daten <em>und <\/em>Funktionalit\u00e4t enthalten und die Daten so gut wie m\u00f6glich kapseln (wobei die Sprachen Java und C# daf\u00fcr nie optimal geeignet waren).<\/p>\n\n\n\n<div class=\"wp-block-stackable-heading stk-block-heading stk-block-heading--v2 stk-block stk-043ea6a\" id=\"implizite-einschrankung-der-oop-nutzung\" data-block-id=\"043ea6a\"><h4 class=\"stk-block-heading__text\">Implizite Einschr\u00e4nkung der OOP-Nutzung<\/h4><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">Das hat aufgeh\u00f6rt, zumindest was die Nutzung der eben erw\u00e4hnten Frameworks angeht. Nat\u00fcrlich gibt es auch Hybridl\u00f6sungen, die meist auf einer Variante der <a href=\"https:\/\/en.wikipedia.org\/wiki\/Hexagonal_architecture_(software)\" target=\"_blank\" rel=\"noopener\">Hexagonal Architecture<\/a> beruhen, wo das Framework lediglich in einem Adapter verwendet wird. Der Applikationskern kann dann nach reiner OOP-Lehre geschrieben sein. Aber auch hier wird durch das System der Adapter implizit zugegeben, dass OOP nicht das Ma\u00df aller Dinge ist.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">In der Praxis trifft man die vollst\u00e4ndige hexagonale Architektur eher selten an. Die Applikation ist meist in einem Stil geschrieben, der zwar wie ECS in der Regel syntaktisch Klassen und Objekte verwendet. Semantisch jedoch ist sie eher eine Mischung aus funktionalem und prozeduralem und idealerweise auch deklarativem Code. Diese Systeme sind meist \u00fcbersichtlicher, oft leichter testbar und brauchen insgesamt wenige Codezeilen f\u00fcr dieselbe Funktionalit\u00e4t als mit traditionellem OOP.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Eine interessante Parallele zwischen Dependency Injection und funktionaler sowie deklarativer Programmierung ist auch, dass die Abh\u00e4ngigkeiten explizit angegeben werden m\u00fcssen. Das macht es leichter, zustandsbedingte Bugs zu vermeiden.<\/p>\n\n\n\n<div class=\"wp-block-stackable-heading stk-block-heading stk-block-heading--v2 stk-block stk-bd75385\" id=\"oop-im-frontend-und-ui\" data-block-id=\"bd75385\"><h3 class=\"stk-block-heading__text\">OOP im Frontend und UI<\/h3><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">Sogar in der UI-Entwicklung hat die Objektorientierung ihren Platzhirsch-Status teilweise eingeb\u00fc\u00dft. Seit 2020 zeigt etwa React mit seinen Functional Components und <a href=\"https:\/\/react.dev\/reference\/react\/hooks\" target=\"_blank\" rel=\"noopener\">Hooks<\/a>, dass auch ein funktionaler Ansatz geeignet ist, um Komponenten und ganze Oberfl\u00e4chen mit viel State-Management zu entwickeln. Dieser Ansatz vermeidet sogar eine Reihe von Fehlerquellen. Auch Alternativen wie <a href=\"https:\/\/svelte.dev\/\" target=\"_blank\" rel=\"noopener\">Svelte<\/a> sind modulorientiert und deklarativ und haben nichts mehr mit Objektorientierung zu tun. Es ist zu erwarten, dass auch bei Desktop-UIs bald \u00e4hnliche Techniken Einzug halten.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Aber wie konnte die objektorientierte Programmierung nahezu unbemerkt von der Bildfl\u00e4che verschwinden? Wie sind wir wieder bei der <a href=\"https:\/\/en.wikipedia.org\/wiki\/Modular_programming\" target=\"_blank\" rel=\"noopener\">modularen Programmierung<\/a> nach David Parnas gelandet? Und das trotz der st\u00e4ndigen Warnungen vor prozeduralem Code?<\/p>\n\n\n\n<div class=\"wp-block-stackable-heading stk-block-heading stk-block-heading--v2 stk-block stk-eaad8ae\" id=\"gebrochene-versprechen-von-oop\" data-block-id=\"eaad8ae\"><h2 class=\"stk-block-heading__text\">Gebrochene Versprechen von OOP<\/h2><\/div>\n\n\n\n<div class=\"wp-block-stackable-text stk-block-text stk-block stk-44735e2\" data-block-id=\"44735e2\"><p class=\"stk-block-text__text\">Die Antworten sind meines Erachtens schon in der Hochzeit der OOP zu suchen. Die realen und imagin\u00e4ren Versprechungen des neuen Programmierparadigmas waren gro\u00df. Viele hatten noch im Kopf, wie das altbekannte GOTO abgeschafft und gegen Schleifen und Funktionen getauscht wurde. Sie  erhofften sich, dass der Wechsel von strukturierter und prozeduraler Programmierung auf OOP einen \u00e4hnlichen Produktivit\u00e4tszuwachs bringen w\u00fcrde. Und tats\u00e4chlich: Die GUIs machten dank OOP massive Fortschritte und auch Spiele und Simulationen profitierten vom neuen Paradigma, wenn auch Klassen mit zehntausenden von Zeilen als Zeugen der neuen Komplexit\u00e4t keine Seltenheit waren.<\/p><\/div>\n\n\n\n<div class=\"wp-block-stackable-heading stk-block-heading stk-block-heading--v2 stk-block stk-c51b81e\" id=\"pragmatismus-umsetzungsschwierigkeiten-und-regeln\" data-block-id=\"c51b81e\"><h3 class=\"stk-block-heading__text\">Pragmatismus, Umsetzungsschwierigkeiten und Regeln<\/h3><\/div>\n\n\n\n<div class=\"wp-block-stackable-text stk-block-text stk-block stk-4fbefe4\" data-block-id=\"4fbefe4\"><p class=\"stk-block-text__text\">Doch im Bereich Gesch\u00e4ftsanwendungen und in der aufkommenden Webentwicklung hatte es OOP schwer. Die meisten Entwicklerteams wussten, dass sie OOP als das neue Paradigma nutzen <em>sollten,<\/em> doch viele empfanden die neue Technik als zu kompliziert und programmierten weiter prozedural und nutzten lediglich Framework-Klassen, ohne eigene zu erstellen, andere erstellten umfangreiche Objektmodelle mit viel Vererbung und vielen Zustandspermutationen, was sich dann in schwer nachzuverfolgenden Bugs \u00e4u\u00dferte. Design Patterns gab es zwar, jedoch herrschte noch die Meinung vor, dass Objekte in erster Linie die reale Welt abbilden sollten und Design Patterns gibt es dort eben nicht.<\/p><\/div>\n\n\n\n<div class=\"wp-block-stackable-text stk-block-text stk-block stk-17b209c\" data-block-id=\"17b209c\"><p class=\"stk-block-text__text\">Mitte der 2000er wuchs die Popularit\u00e4t von Clean Code, TDD und Dependency-Injection-Frameworks an, getragen von OOP-Pionieren der ersten Stunde wie Kent Beck und Robert C. Martin. Der OOP-Trend bekam neuen R\u00fcckenwind. Sowohl die de-facto-prozeduralen Programmierer als auch die Ersteller der komplizierten Vererbungshierarchien wurden von dieser neuen Bewegung hart ins Gericht genommen. Ein dizipliniertes Vorgehen und strenge Regeln sollten OOP nun tats\u00e4chlich zum durchschlagenden Erfolg verhelfen. Gleichzeitig begann im Hintergrund der Aufstieg von JavaScript, einer Sprache mit stark funktionalen Elementen, und funktionalen Features wie LINQ in C# oder List Comprehensions in Python.<\/p><\/div>\n\n\n\n<div class=\"wp-block-stackable-text stk-block-text stk-block stk-19ce3ab\" data-block-id=\"19ce3ab\"><p class=\"stk-block-text__text\">Tats\u00e4chlich haben die neuen OOP-Regeln, konsequent umgesetzt, einiges bewirkt. Doch war das komplex zu erreichen, und die urspr\u00fcnglichen gro\u00dfen Versprechen der OOP verschwanden sang- und klanglos. Hier einige davon: <\/p><\/div>\n\n\n\n<div class=\"wp-block-stackable-heading stk-block-heading stk-block-heading--v2 stk-block stk-2a997c3\" id=\"wiederverwendbarkeit\" data-block-id=\"2a997c3\"><h3 class=\"stk-block-heading__text\">Wiederverwendbarkeit<\/h3><\/div>\n\n\n\n<div class=\"wp-block-stackable-text stk-block-text stk-block stk-fbc3004\" data-block-id=\"fbc3004\"><p class=\"stk-block-text__text\">Das Versprechen extremer Wiederverwendbarkeit ist der &#8222;Klassiker&#8220; der nicht eingehaltenen Versprechen, dessen Nichteinhaltung auch viele eingefleischte OOP-Fans schnell eingestehen. Als in den 1990er-Jahren mit der gro\u00dffl\u00e4chigen Einf\u00fchrung von C++ die gro\u00dfe OOP-Welle \u00fcber die Softwarebranche hereinbrach, wurde pausenlos von der massiv verbesserten Wiederverwendbarkeit objektorientierten Codes gesprochen, damals in erster Linie durch Implementierungsvererbung. Frameworks wie Embarcadero Delphi, das es heute noch gibt, zeugen von dieser Philosophie.<\/p><\/div>\n\n\n\n<div class=\"wp-block-stackable-text stk-block-text stk-block stk-bdf896d\" data-block-id=\"bdf896d\"><p class=\"stk-block-text__text\">Die Realit\u00e4t war eher ern\u00fcchternd und der Prozentsatz an wiederverwendbarem Code stagnierte. Zu viel Zustand, der zu verwalten war und der nach der traditionellen OOP-Lehre geradezu w\u00fcnschenswert war, machte es schwer, Objekte in verschiedenen Kontexten zu verwenden, ohne spukhafte Fernwirkungen zu erzeugen. Was uns die OOP-Community daf\u00fcr aber geschenkt hat war eine neue Variante der Bibliotheken mit eigenen Vor- und Nachteilen: die Frameworks. Diese erleichtern viele Aufgaben, sind aber aufw\u00e4ndig in der Architektur und werden daher in der Regel zugekauft oder als Open-Source-Paket integriert. F\u00fcr die interne Wiederverwendung von Code sind Frameworks dagegen oft wenig attraktiv.<\/p><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">Hier sind wiederum funktionale L\u00f6sungen \u00fcberlegen. Seit der Einf\u00fchrung von Functional Components in React etwa hat so gut wie jedes komplexere Projekt <a href=\"https:\/\/react.dev\/learn\/reusing-logic-with-custom-hooks\" target=\"_blank\" rel=\"noopener\">Custom Hooks<\/a>. Diese sind deutlich einfacher zu erstellen und viel modular als riesige, projekt- oder firmenspezifische Frameworks. Bei der Vorg\u00e4ngertechnik der Class-based components konnte man auch mit funktionalen Techniken arbeiten, aber deutlich eingeschr\u00e4nkter und vor allem mit weniger Wiederverwendungsm\u00f6glichkeiten.<\/p>\n\n\n\n<div class=\"wp-block-stackable-heading stk-block-heading stk-block-heading--v2 stk-block stk-024c80d\" id=\"bessere-ubereinstimmung-mit-dem-menschlichen-denkmodell\" data-block-id=\"024c80d\"><h3 class=\"stk-block-heading__text\">Bessere \u00dcbereinstimmung mit dem menschlichen Denkmodell<\/h3><\/div>\n\n\n\n<div class=\"wp-block-stackable-text stk-block-text stk-block stk-e239ce7\" data-block-id=\"e239ce7\"><p class=\"stk-block-text__text\">Die Einf\u00fchrung von OOP und schon die Beschreibung der ersten objektorientierten Sprache, Simula, thematisierte immer wieder, dass die objektorientierte Programmierung viel n\u00e4her an der nat\u00fcrlichen Denkweise des Menschen sei. \u00dcberall um uns herum befinden sich Objekte mit verschiedenen Identit\u00e4ten und Eigenschaften, <em>mit<\/em> denen man etwas tun kann. Das Gehirn hat nach dieser Lesart also st\u00e4ndig mit Objekten zu tun. Das h\u00f6rt sich erst einmal schl\u00fcssig an.<\/p><\/div>\n\n\n\n<div class=\"wp-block-stackable-text stk-block-text stk-block stk-a0aecc3\" data-block-id=\"a0aecc3\"><p class=\"stk-block-text__text\">Doch hier liegt ein Denkfehler vor. Denn OOP-Programme arbeiten mit Ausdr\u00fccken wie <code>invoice.save()<\/code> oder <code>fileSystemSaver.save(invoice)<\/code>. Kein Mensch k\u00e4me von selbst auf die Idee, seine Rechnung anzuweisen, sich selbst zu speichern (urspr\u00fcngliche OOP-Idee) oder sich einen abstrakten &#8222;Dateisystem-Speicherer&#8220; auszudenken (neue OOP-Schule), der abstrakte Dateien speichert. Die Syntax <code>computer.save(invoice)<\/code> entspr\u00e4che viel eher dem menschlichen Denken, das machte <code>computer<\/code> aber zu einer \u201eGott-Klasse\u201c, was gemeinhin als Anti-Pattern gilt.<\/p><\/div>\n\n\n\n<div class=\"wp-block-stackable-text stk-block-text stk-block stk-a89e0c7\" data-block-id=\"a89e0c7\"><p class=\"stk-block-text__text\">Einem &#8222;Sprechen mit dem Computer&#8220; kommen prozeduralen Sprachen oder auch praktisch alle Shell-Scriptsprachen wie Bash oder PowerShell mit ihrer Syntax bereits n\u00e4her als funktionale Sprachen oder gar OOP. Auch deklarative Ans\u00e4tze, wie man sie in ganz verschiedenen Sprachen erfolgreich einsetzen kann, \u00e4hneln der menschlichen Ausdrucksweise. In Zukunft k\u00f6nnten Large Language Models noch eine gr\u00f6\u00dfere Ann\u00e4herung daran bringen. Die St\u00e4rke von OOP ist das aber gerade nicht.<\/p><\/div>\n\n\n\n<div class=\"wp-block-stackable-text stk-block-text stk-block stk-6198db5\" data-block-id=\"6198db5\"><p class=\"stk-block-text__text\">Wenn man (sinnvollerweise!) Implementierungsvererbung vermeidet und oft auf Interfaces setzt, ist die Diskrepanz noch extremer. Wer denkt schon von seinem Auto als <code>IDrivable<\/code>? Wir sehen also, dass dieses Argument sehr zweifelhaft ist oder zumindest aus sehr unterschiedlichen Perspektiven betrachtet werden kann. Im Gegensatz zur Wiederverwendbarkeit wurde dieses Argument auch bis heute wenig von der Community dementiert.<\/p><\/div>\n\n\n\n<div class=\"wp-block-stackable-heading stk-block-heading stk-block-heading--v2 stk-block stk-1d25827\" id=\"was-bleibt-von-der-oop-kultur\" data-block-id=\"1d25827\"><h2 class=\"stk-block-heading__text\">Was bleibt von der OOP-Kultur?<\/h2><\/div>\n\n\n\n<div class=\"wp-block-stackable-text stk-block-text stk-block stk-c143fcd\" data-block-id=\"c143fcd\"><p class=\"stk-block-text__text\">War die Objektorientierung ein v\u00f6lliger Irrweg? Das w\u00e4re eine \u00fcbertriebene Aussage. Denn viele Techniken w\u00e4ren ohne die OOPler und ihr Umfeld nicht oder wom\u00f6glich erst viel sp\u00e4ter entstanden, und viele funktionieren sogar noch besser in einem nicht-OOP-Umfeld als mit OOP selbst.<\/p><\/div>\n\n\n\n<div class=\"wp-block-stackable-text stk-block-text stk-block stk-57a352a\" data-block-id=\"57a352a\"><p class=\"stk-block-text__text\">Robert C. Martin, genannt &#8222;Uncle Bob&#8220; und Erfinder der SOLID-Prinzipien, hat sich vor einigen Jahren wohlwollend \u00fcber <a href=\"https:\/\/blog.cleancoder.com\/uncle-bob\/2019\/08\/22\/WhyClojure.html\" target=\"_blank\" rel=\"noopener\">Clojure und das funktionale Paradigma ge\u00e4u\u00dfert<\/a> und empfindet dieses offenbar als sehr kompatibel mit seinen Ideen.<\/p><\/div>\n\n\n\n<div class=\"wp-block-stackable-text stk-block-text stk-block stk-7ef4913\" data-block-id=\"7ef4913\"><p class=\"stk-block-text__text\">Die folgenden Ideen aus dem OOP-Umfeld lohnt es sich auf jeden Fall zu studieren und in die Zukunft zu \u00fcbernehmen.<\/p><\/div>\n\n\n\n<div class=\"wp-block-stackable-heading stk-block-heading stk-block-heading--v2 stk-block stk-973a5bc\" id=\"strong-test-driven-development-strong-tdd-strong-strong\" data-block-id=\"973a5bc\"><h3 class=\"stk-block-heading__text\"><strong>Test Driven Development <strong>(TDD)<\/strong><\/strong><\/h3><\/div>\n\n\n\n<div class=\"wp-block-stackable-text stk-block-text stk-block stk-f58a80b\" data-block-id=\"f58a80b\"><p class=\"stk-block-text__text\">Auch wenn striktes TDD, vor allem f\u00fcr schlecht spezifizierte Probleme oder f\u00fcr Frontend-Logik, oft wenig zielf\u00fchrend ist, ist die Technik, zuerst einen Test zu schreiben und diesen dann zu erf\u00fcllen, ein wichtiges Werkzeug im Arsenal eines Entwicklers.<\/p><\/div>\n\n\n\n<div class=\"wp-block-stackable-text stk-block-text stk-block stk-00ce587\" data-block-id=\"00ce587\"><p class=\"stk-block-text__text\">Extrem n\u00fctzlich ist diese Technik auch als Vorbereitung auf ein umfangreiches Refactoring. Hier wird zuerst die aktuelle Implementierung validiert und dann nach jedem Refactoring-Schritt \u00fcberpr\u00fcft, ob immer noch alles funktioniert. OOPler haben zwar das automatisierte Testen nicht erfunden, aber enorm weiterentwickelt.<\/p><\/div>\n\n\n\n<div class=\"wp-block-stackable-text stk-block-text stk-block stk-9295c3f\" data-block-id=\"9295c3f\"><p class=\"stk-block-text__text\">Auch um Bugs zu beheben, eignet sich eine leicht adaptierte Variante der Technik. Man tastet sich mit &#8222;gr\u00fcnen&#8220;, also erfolgreich durchlaufenden, Tests, an den Bug heran. Dann isoliert man ihn mit einem fehlschlagenden Test und findet dann in der Regel sofort die Stelle, wo sich der Bug versteckt und kann ihn dann beheben. Die bereits erfolgreichen Tests verringern die Wahrscheinlichkeit deutlich, dass die vemeintliche Behebung einen anderen Bug zum Vorschein bringt.<\/p><\/div>\n\n\n\n<div class=\"wp-block-stackable-text stk-block-text stk-block stk-143cb4d\" data-block-id=\"143cb4d\"><p class=\"stk-block-text__text\">Interessanterweise geht TDD bei funktionalem Code meist leichter von der Hand als mit OOP, da weniger &#8222;Ger\u00fcstbau&#8220; notwendig ist, um den Code zum Laufen zu bekommen.<\/p><\/div>\n\n\n\n<div class=\"wp-block-stackable-heading stk-block-heading stk-block-heading--v2 stk-block stk-0474606\" id=\"refactoring\" data-block-id=\"0474606\"><h3 class=\"stk-block-heading__text\">Refactoring<\/h3><\/div>\n\n\n\n<div class=\"wp-block-stackable-text stk-block-text stk-block stk-0e0cc32\" data-block-id=\"0e0cc32\"><p class=\"stk-block-text__text\">Der Begriff Refactoring stammt urspr\u00fcnglich von <a href=\"https:\/\/martinfowler.com\/\" target=\"_blank\" rel=\"noopener\">Martin Fowler<\/a> und wurde von ihm eher eng definiert als &#8222;diszipliniertes Verfahren, um einen bestehenden Programmcode umzustrukturieren, wobei die interne Struktur ge\u00e4ndert wird und das Verhalten nach au\u00dfen gleich bleibt&#8220; (<a href=\"https:\/\/refactoring.com\/\" target=\"_blank\" rel=\"noopener\">Quelle<\/a>). Martin Fowler war und ist eine wichtige Figur in der OOP-Community.<\/p><\/div>\n\n\n\n<div class=\"wp-block-stackable-text stk-block-text stk-block stk-e66736c\" data-block-id=\"e66736c\"><p class=\"stk-block-text__text\">Ganz so streng wie Fowler nehmen viele die Definition von Refactoring nicht, so werden im Rahmen sogenannter Refactorings in der Praxis auch gerne einmal der Funktionsumfang erweitert, die Oberfl\u00e4che verbessert oder Sicherheitsl\u00fccken geschlossen. Fowler pl\u00e4diert f\u00fcr einen kleinschrittigen Refactoring-Prozess und sieht daher eine Kombination mit Erweiterungen als fehleranf\u00e4llig an.<\/p><\/div>\n\n\n\n<p class=\"wp-block-paragraph\"> Grunds\u00e4tzlich ist dem auch beizupflichten, moderne Versionskontroll-Systeme, wie der derzeitige Monopolist Git, haben diese Problematik aber etwas entsch\u00e4rft. Denn solange man auf Commit-Ebene die Refactorings sauber von den Erweiterungen oder Fehlerbehebungen trennt, lassen sich auch alle \u00c4nderungen sauber voneinander entflechten, wenn das n\u00f6tig sein sollte.<\/p>\n\n\n\n<div class=\"wp-block-stackable-heading stk-block-heading stk-block-heading--v2 stk-block stk-ad1cb9d\" id=\"refactoring-als-best-practice\" data-block-id=\"ad1cb9d\"><h4 class=\"stk-block-heading__text\">Refactoring als Best Practice<\/h4><\/div>\n\n\n\n<div class=\"wp-block-stackable-text stk-block-text stk-block stk-c76c913\" data-block-id=\"c76c913\"><p class=\"stk-block-text__text\">Regelm\u00e4\u00dfiges Refactoring, oder besser noch, Refactoring als Vorbereitungsschritt vor jeder Software\u00e4nderung, ist wichtig. Und das v\u00f6llig unabh\u00e4ngig vom Programmierparadigma. Es hat sich enorm als Instrument bew\u00e4hrt, um die Qualit\u00e4t von Software zu verbessern. Im Gegensatz zur Feature-Entwicklung geht es meist <em>schneller<\/em> von der Hand, als man denkt, vor allem, wenn Tests in der richtigen Granularit\u00e4t vorliegen.<\/p><\/div>\n\n\n\n<div class=\"wp-block-stackable-text stk-block-text stk-block stk-87a9baa\" data-block-id=\"87a9baa\"><p class=\"stk-block-text__text\">Hier liegt aber auch die Crux. Sind Tests zu kleinteilig (viele &#8222;Solitary Unit Tests&#8220; nach Fowlers Terminologie, vielerorts oft nur &#8222;Unit Tests&#8220; genannt, wobei dann alles andere ein &#8222;Integration Test&#8220; ist), muss man die Refactoring-Arbeit schnell doppelt machen, einmal im Code und einmal in den Tests, kann aber Fehler genau lokalisieren. Andererseits sind grobschl\u00e4chtige End-To-End-Tests oder API-Tests aufw\u00e4ndig zu schreiben und helfen nicht so sehr bei der Fehlerfindung, schlagen aber selten falschen Alarm. Zu entscheiden, welche Tests man schreiben soll, ist teilweise eine &#8222;Wissenschaft f\u00fcr sich&#8220; und wird in zuk\u00fcnftigen Beitr\u00e4gen noch Thema sein.<\/p><\/div>\n\n\n\n<div class=\"wp-block-stackable-heading stk-block-heading stk-block-heading--v2 stk-block stk-e46c859\" id=\"strong-dependency-injection-strong\" data-block-id=\"e46c859\"><h3 class=\"stk-block-heading__text\"><strong>Dependency Injection<\/strong><\/h3><\/div>\n\n\n\n<div class=\"wp-block-stackable-text stk-block-text stk-block stk-3ac4289\" data-block-id=\"3ac4289\"><p class=\"stk-block-text__text\">Die Technik der Dependency Injection  ist zwar, wie wir gesehen haben, nicht immer objektorientiert, stammt urspr\u00fcnglich aber aus diesem Umfeld. Eine wichtige Errungenschaft durch Dependency Injection ist einfacheres Testen, was sich vor allem bemerkbar macht, wenn man kleinteilige Unit-Tests erstellen will. Auch hier l\u00e4sst es sich trefflich \u00fcbertreiben und dogmatisieren, aber es ist auf jeden Fall gut, die M\u00f6glichkeit, einzelne Module isoliert zu testen, immer in der Hinterhand zu haben.<\/p><\/div>\n\n\n\n<div class=\"wp-block-stackable-heading stk-block-heading stk-block-heading--v2 stk-block stk-7ca9c92\" id=\"strong-patterns-strong\" data-block-id=\"7ca9c92\"><h3 class=\"stk-block-heading__text\"><strong>Patterns<\/strong><\/h3><\/div>\n\n\n\n<div class=\"wp-block-stackable-text stk-block-text stk-block stk-2316169\" data-block-id=\"2316169\"><p class=\"stk-block-text__text\">Hier wird bewusst nicht von <em>Design<\/em> Patterns gesprochen, denn da ist man schnell wieder in Gedanken bei den 23 <a href=\"https:\/\/www.digitalocean.com\/community\/tutorials\/gangs-of-four-gof-design-patterns\" target=\"_blank\" rel=\"noopener\">Gang-of-Four-Patterns<\/a>, und diese sind nicht unbedingt alle gut gealtert. Singleton und Visitor in ihrer urspr\u00fcnglichen Form sind heute eher als Anti-Patterns verschrien. Was bleibt, ist aber der grunds\u00e4tzliche Gedanke, dass man die Struktur hinter guten Programmierl\u00f6sungen und gutem Code versteht und daraus eine Blaupause macht, die man wieder und wieder anwenden kann. Wichtig dabei ist nur, dass man nie davon ausgeht, bereits alle, oder auch nur die besten Patterns, gefunden zu haben.<\/p><\/div>\n\n\n\n<div class=\"wp-block-stackable-text stk-block-text stk-block stk-03838c6\" data-block-id=\"03838c6\"><p class=\"stk-block-text__text\">Ein Beispiel: Momentan revolutioniert <a href=\"https:\/\/htmx.org\/\" target=\"_blank\" rel=\"noopener\">HTMX<\/a> sowohl Frontend als auch Backend und l\u00f6st ein bisher erfolgreiches Architektur-Pattern, clientseitiges State-Management in Kombination mit JSON-APIs, in Teilen ab. HTMX zeigt damit, dass wir uns bisher eventuell \u00fcberm\u00e4\u00dfig auf dieses Pattern verlassen haben. Seit der offiziellen Einf\u00fchrung von HTML5 im Jahr 2014, wo auch React noch in den Kinderschuhen steckte, w\u00e4re eine Library wie HTMX bereits m\u00f6glich gewesen. Aber erst jetzt setzt sich dieser Ansatz durch.<\/p><\/div>\n\n\n\n<div class=\"wp-block-stackable-heading stk-block-heading stk-block-heading--v2 stk-block stk-795c22e\" id=\"object-relational-mapping-orm\" data-block-id=\"795c22e\"><h3 class=\"stk-block-heading__text\">Object Relational Mapping (ORM)<\/h3><\/div>\n\n\n\n<div class=\"wp-block-stackable-text stk-block-text stk-block stk-9ead6bb\" data-block-id=\"9ead6bb\"><p class=\"stk-block-text__text\">Die Softwarekategorie der ORMs (Object Relational Mapper) kommt ganz klar aus der objektorientierten Community. Sp\u00e4testens als sich Java durchsetzte, wuchs der Bedarf, objektorientierte Systeme an die schon l\u00e4nger g\u00e4ngigen relationalen Datenbanken anzubinden. Imagebasierte Systeme wie Smalltalk, wo die Daten einfach als Objekte im Image verwaltet wurden, waren im Verschwinden begriffen, und objektorientierte Datenbanken waren den meisten Entscheidern zu nischig und auch noch nicht lizenziert. Also SQL. Doch aus den Datenmengen, die ein <code>SELECT<\/code>-Statement zur\u00fccklieferte, Objekte mit verkn\u00fcpftem Verhalten zu machen und diese dann auch wieder korrekt in die Datenbank zur\u00fcckzuspeichern, stellte sich als m\u00fchsam und fehleranf\u00e4llig heraus. Also musste eine Bibliothek her, die das erleichterte. Daraus entwickelten sich die heutigen ORMs.<\/p><\/div>\n\n\n\n<div class=\"wp-block-stackable-heading stk-block-heading stk-block-heading--v2 stk-block stk-e84c196\" id=\"vorteile-von-or-ms\" data-block-id=\"e84c196\"><h4 class=\"stk-block-heading__text\">Vorteile von ORMs<\/h4><\/div>\n\n\n\n<div class=\"wp-block-stackable-text stk-block-text stk-block stk-e2ad321\" data-block-id=\"e2ad321\"><p class=\"stk-block-text__text\">Es ist nicht wegzudiskutieren, dass ORMs wie TypeORM, Prisma, Hibernate oder Entity Framework Core die Entwicklung von stark datenbankbasierten Anwendungen sehr beschleunigt und vereinfacht haben. Eigentlich ist die Bezeichnung ORM mittlerweile etwas ungenau, denn ORMs lassen sich sehr gut auch in rein prozeduralem oder in Code mit funktionalen Elementen einsetzen. Insbesondere Entity Framework Core ist hier hervorzuheben, da es nahtlos mit dem C#- und .NET-Feature LINQ zusammenarbeitet und funktionale Operationen wie Map (C#: <code>Select<\/code>) oder Filter (C#: <code>Where<\/code>) und viele andere direkt in SQL \u00fcbersetzen kann. Diese Funktionalit\u00e4t ist sogar erweiterbar und wird auch vonseiten Microsofts immer weiter vervollst\u00e4ndigt. Das ORM Prisma, geschrieben in TypeScript und Rust, zeichnet sich wiederum durch sein durchdachtes Migrations- und Schemasystem aus.<\/p><\/div>\n\n\n\n<div class=\"wp-block-stackable-heading stk-block-heading stk-block-heading--v2 stk-block stk-68b5931\" id=\"nachteile-und-einschrankungen-von-or-ms\" data-block-id=\"68b5931\"><h4 class=\"stk-block-heading__text\">Nachteile und Einschr\u00e4nkungen von ORMs<\/h4><\/div>\n\n\n\n<div class=\"wp-block-stackable-text stk-block-text stk-block stk-8600a4d\" data-block-id=\"8600a4d\"><p class=\"stk-block-text__text\">Nichtsdestotrotz gibt es auch hier Schattenseiten. Man handelt sich etwa, insbesondere bei einem OOP-Ansatz, zwei oft sehr \u00e4hnliche Objektkategorien ein: Entities, also Datenbankobjekte und Dom\u00e4nen-Objekte oder bei einem weniger objektorientierten Ansatz DTOs. Diese beiden Objektkategorien ineinander umzusetzen kann, vor allem bei Sprachen wie Java oder C#, die kein Duck-Typing bzw. strukturelle Typisierung unterst\u00fctzen, viel Boilerplate-Code oder <a href=\"https:\/\/docs.automapper.org\/en\/stable\/Getting-started.html\" target=\"_blank\" rel=\"noopener\">eigene Libraries<\/a> erfordern. Hier zeigt sich der &#8222;Object-relational impedance mismatch\u00a8 dann doch wieder, was zeigt, das ORMs allenfalls syntaktisch Objekte erzeugen, aber nicht semantisch.<\/p><\/div>\n\n\n\n<div class=\"wp-block-stackable-text stk-block-text stk-block stk-51faf64\" data-block-id=\"51faf64\"><p class=\"stk-block-text__text\">Manche ORMs, wie etwa Prisma, leiden noch unter dem <a href=\"https:\/\/stackoverflow.com\/questions\/97197\/what-is-the-n1-selects-problem-in-orm-object-relational-mapping\" target=\"_blank\" rel=\"noopener\">1+N-Problem<\/a>, das schon aus den Fr\u00fchzeiten der ORMs bekannt ist und selbst von Delphi schon besser umschifft wurde. Abfragen mit vielen Joins, die vor allem in Bereichen wie Datenanalyse- und Export oder der Transformation von Daten f\u00fcr eine andere Zielgruppe nicht selten sind, werden dadurch so langsam, dass das System nicht benutzbar ist. Abgesehen davon zeigen alle ORMs gewisse Schw\u00e4chen bei Themen wie Transaktions-Handling und komplexen <code>INSERT<\/code>&#8211; und <code>UPDATE<\/code>-Befehlen. Jedes ORM bringt au\u00dferdem zwangsl\u00e4ufig wenn auch noch so geringe Performanceeinbu\u00dfen und mehr Komplexit\u00e4t mit.<\/p><\/div>\n\n\n\n<div class=\"wp-block-stackable-text stk-block-text stk-block stk-ada4dc7\" data-block-id=\"ada4dc7\"><p class=\"stk-block-text__text\">Nicht zuletzt besteht bei der Nutzung von ORMs bei Projekten &#8222;auf der gr\u00fcnen Wiese&#8220; die Gefahr, dass sich Datenbank-Designfehler einschleichen, wenn neue Entity-Klassen erzeugt und miteinander verkn\u00fcpft werden, ohne auf deren relationale Eigenschaften zu achten. Das \u00e4u\u00dfert sich dann sp\u00e4ter, bei gr\u00f6\u00dferen Datenmengen, in pl\u00f6tzlichen Performanceproblemen, Bugs oder unerkl\u00e4rlichen Abst\u00fcrzen.<\/p><\/div>\n\n\n\n<div class=\"wp-block-stackable-heading stk-block-heading stk-block-heading--v2 stk-block stk-9f680b8\" id=\"neue-regeln-fur-die-performance\" data-block-id=\"9f680b8\"><h4 class=\"stk-block-heading__text\">Neue Regeln f\u00fcr die Performance<\/h4><\/div>\n\n\n\n<div class=\"wp-block-stackable-text stk-block-text stk-block stk-e868f12\" data-block-id=\"e868f12\"><p class=\"stk-block-text__text\">Das Moore&#8217;sche Gesetz, nach dem sich jedes Jahr die Anzahl der Transistoren und damit ungef\u00e4hr die Rechenleistung von Mikrochips verdoppelt, ist bereits seit 2010 au\u00dfer Kraft. Daher kann man sich nicht mehr so sehr darauf verlassen, dass steigende oder billigere Rechenleistung Performanceprobleme ausb\u00fcgelt, zumindest nicht bei CPUs. Es ist wichtig, Datenbanken daf\u00fcr zu verwenden, was sie gut k\u00f6nnen, n\u00e4mlich gro\u00dfe Datenmengen zu verarbeiten. Auch deswegen sind ORMs kein Allheilmittel. Wer sie einsetzt, sollte immer damit rechnen, auch einmal rohes SQL schreiben zu m\u00fcssen. Ein hier zu erw\u00e4hnendes Anti-Pattern ist das &#8222;Hacken&#8220; des ORMs, indem so lange am Query herumgedoktert wird, bis effizientes SQL herauskommt, anstatt das SQL einfach selbst zu schreiben.<\/p><\/div>\n\n\n\n<div class=\"wp-block-stackable-heading stk-block-heading stk-block-heading--v2 stk-block stk-906e5fc\" id=\"agile-softwareentwicklungstechniken\" data-block-id=\"906e5fc\"><h3 class=\"stk-block-heading__text\">Agile Softwareentwicklungstechniken<\/h3><\/div>\n\n\n\n<div class=\"wp-block-stackable-text stk-block-text stk-block stk-e710ae6\" data-block-id=\"e710ae6\"><p class=\"stk-block-text__text\">Niemand m\u00f6chte zur\u00fcck zum Wasserfall-Prozess und bis auf wenige Branchen ist die reine Wasserfall-Entwicklung ohne Zwischenfeedback oder -releases auch zur Seltenheit geworden. Dass dem so ist, haben wir zu gro\u00dfen Teilen der agilen Bewegung zu verdanken. Diese war immer sehr eng mit der objektorientierten Community und mit Vertretern von Unit-Testing, TDD und SOLID verkn\u00fcpft.<\/p><\/div>\n\n\n\n<div class=\"wp-block-stackable-text stk-block-text stk-block stk-756b807\" data-block-id=\"756b807\"><p class=\"stk-block-text__text\">Doch auch hier gibt es Schattenseiten und Anlass zur Kritik. Die reflexhafte Reaktion &#8222;Das war kein richtiges Scrum\/XP&#8220;, wenn auf Probleme mit der Umsetzung agiler Techniken hingewiesen wird, ist weder hilfreich, noch pragmatisch. Hochspezifizierte agile Prozesse, wie Scrum, sind in vielen F\u00e4llen noch zu b\u00fcrokratisch. Sie erlauben es auch, Hierarchien offiziell wegzudefinieren und inoffiziell beizubehalten, was eine schlechtere L\u00f6sung ist, als eine offene Hierarchie. Weiters fehlt bei fast allen agilen Prozessmodellen eine Differenzierung zwischen produkt- und projektbasierter Entwicklung.<\/p><\/div>\n\n\n\n<div class=\"wp-block-stackable-heading stk-block-heading stk-block-heading--v2 stk-block stk-a535f6e\" id=\"auf-welche-elemente-kann-man-eher-verzichten\" data-block-id=\"a535f6e\"><h3 class=\"stk-block-heading__text\">Auf welche Elemente kann man eher verzichten?<\/h3><\/div>\n\n\n\n<div class=\"wp-block-stackable-text stk-block-text stk-block stk-00ae677\" data-block-id=\"00ae677\"><p class=\"stk-block-text__text\">Hier sind einige Eigenschaften der OOP-Kultur aufgef\u00fchrt, die eher \u00fcberholt sind oder noch nie besonders hilfreich waren:<\/p><\/div>\n\n\n\n<div class=\"wp-block-stackable-heading stk-block-heading stk-block-heading--v2 stk-block stk-35a1a32\" id=\"strong-detaillierte-architekturdiagramme-und-uml-strong\" data-block-id=\"35a1a32\"><h4 class=\"stk-block-heading__text\"><strong>Detaillierte Architekturdiagramme und UML<\/strong><\/h4><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">Die umfangreiche <a href=\"https:\/\/de.wikipedia.org\/wiki\/Unified_Modeling_Language\" target=\"_blank\" rel=\"noopener\">Unified Modeling Language<\/a> bietet Vorlagen f\u00fcr viele Diagramme, die eine detaillierte Planung von Softwaresystemen erlauben. Zwar kann UML in einer Basisvariante, und in der Regel handschriftlich, ein n\u00fctzliches Mittel f\u00fcr die Verst\u00e4ndigung zwischen Entwicklern sein, wenn man gemeinsam verschiedene Architekturvarianten ausbaldowert, eine Nutzung die dar\u00fcber hinausgeht, zahlt sich aber meist nicht aus. Ge\u00e4nderte Anforderungen f\u00fchren dazu, dass ein initiales Refactoring n\u00f6tig wird, bevor man die neuen Anforderungen implementiert. Dann helfen die alten UML-Diagramme wenig. Oft verbirgt sich hinter der Nutzung von UML ein Anti-Pattern, wo nur ein Entwickler als Architekt fungiert und die anderen nur codieren. So bleibt aber der Lerneffekt aus oder ist viel geringer, als er sein k\u00f6nnte.<\/p>\n\n\n\n<div class=\"wp-block-stackable-heading stk-block-heading stk-block-heading--v2 stk-block stk-bca0517\" id=\"strong-dogmatismus-strong\" data-block-id=\"bca0517\"><h4 class=\"stk-block-heading__text\"><strong>Dogmatismus<\/strong><\/h4><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">Dogmatismus ist, zumindest meines Erachtens, ein generelles Problem in der Softwarebranche. Es zeigt sich durch Aussagen wie &#8222;Das war kein echtes Scrum&#8220; oder einer \u00dcberh\u00f6hung der eigenen Sprache oder des eigenen Frameworks, oder auch einem Elitismus gegen\u00fcber Technologien wie PHP oder Visual-Programming-Tools. Auch Vorw\u00fcrfe, man sei nicht professionell, wenn man nicht <em>einen<\/em> bestimmten Prozess, wie etwa TDD, einsetze, fallen in diese Kategorie. Produktive Diskussionen sehen f\u00fcr uns anders aus.<\/p>\n\n\n\n<div class=\"wp-block-stackable-heading stk-block-heading stk-block-heading--v2 stk-block stk-c167a9a\" id=\"strong-wegdefinieren-von-problemen-ohne-diese-tatsachlich-zu-losen-strong\" data-block-id=\"c167a9a\"><h4 class=\"stk-block-heading__text\"><strong>Wegdefinieren von Problemen, ohne diese tats\u00e4chlich zu l\u00f6sen<\/strong><\/h4><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">Die Tendenz, eigene Fehler nicht zuzugeben, h\u00e4ngt unmittelbar mit Dogmatismus zusammen und ist daher keineswegs ein Alleinstellungsmerkmal der OOP-Community. Dennoch hat die diese und ihr Umfeld viele vollmundige Versprechungen abgegeben, wie extreme Wiederverwendbarkeit, &#8222;Twice the work in half the time&#8220; (Scrum), garantierte Bugfreiheit beim Refactoring und garantiert saubere Architektur (TDD). Diese wurden zu einem gro\u00dfen Teil dann nicht eingehalten und erst viel sp\u00e4ter wurden die Einschr\u00e4nkungen zerknirscht einger\u00e4umt. Das widerspricht dem Grundsatz &#8222;Underpromise and overdeliver.&#8220;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">In allen drei F\u00e4llen hat man lange an den Versprechungen festgehalten. Wenn sie nicht eingetreten sind, hat man das auf handwerkliche Fehler zur\u00fcckgef\u00fchrt. In der agilen Community ist das noch heute verbreitet. Die Taktik funktioniert, da handwerkliche Fehler in der Praxis nat\u00fcrlich vorkommen. Nur ist, selbst wenn es sich immer nur um handwerkliche Fehler handeln sollte, eine Technik, die kaum jemand richtig anwenden kann, keine gute Technik.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Diese Schw\u00e4che ist nicht zu verwechseln mit dem \u00e4u\u00dferst erfolgreichen Prinzip &#8222;Define errors out of existence&#8220; von John Ousterhout und Fehlerreduktionsmethoden, die auf W. Edwards Deming zur\u00fcckgehen. Diese Ans\u00e4tze versprechen jedoch nur, dass die absolute Fehlerzahl immer weiter reduziert wird, nicht dass Fehler zur G\u00e4nze abgeschafft werden. Das macht sie, im Gegensatz zu vielen agilen und OOP-Ans\u00e4tzen, realit\u00e4tsnah und pragmatisch.<\/p>\n\n\n\n<div class=\"wp-block-stackable-heading stk-block-heading stk-block-heading--v2 stk-block stk-fed0153\" id=\"strong-solid-prinzipien-strong\" data-block-id=\"fed0153\"><h4 class=\"stk-block-heading__text\"><strong>SOLID-Prinzipien<\/strong><\/h4><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">Die SOLID-Prinzipien f\u00fchren, wenn man sie konsequent umsetzt, zu einer Codebasis, die einer funktional-prozeduralen \u00e4hnelt. Sie ist jedoch meist un\u00fcbersichtlicher (&#8222;everything happens somewhere else&#8220;) und l\u00e4sst wenig Kapselung zu. Aufgrund der konsequenten Trennung aller Zust\u00e4ndigkeiten muss der Entwickler hier Klassen aufspalten. Das bedeutet zwangsl\u00e4ufig, dass mehr Daten hin- und herwandern.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Nat\u00fcrlich l\u00e4sst sich das mit tiefen Klassenverschachtelungen in den Griff bekommen, aber da finden wir eine logisch strukturierte Codebasis, die funktionale Techniken nutzt, doch deutlich \u00fcbersichtlicher.<\/p>\n\n\n\n<div class=\"wp-block-stackable-heading stk-block-heading stk-block-heading--v2 stk-block stk-5e38cfb\" id=\"fazit\" data-block-id=\"5e38cfb\"><h2 class=\"stk-block-heading__text\">Conclusion<\/h2><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">Der Trend weg von der Objektorientierung ist ungebrochen und es ist zweifelhaft, ob die reine Lehre der OOP jemals wieder zur\u00fcckkommen wird. Die Entwickler-Community hat erkannt, dass variable Zust\u00e4nde zu Buganf\u00e4lligkeit f\u00fchren und dass viele Techniken aus dem agilen Umfeld im Post-OOP-Paradigma sogar besser funktionieren als mit OOP. Es wird Zeit, dass auch die akademische Lehre abseits von Machine-Learning oder Datenanalyse diese Erkenntnisse \u00fcbernimmt.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Durch die neue Welt, in der wir leben und in der wir uns immer schneller anpassen m\u00fcssen, k\u00f6nnen wir uns Struktur als Selbstzweck nicht mehr leisten. Die kommenden Jahre und wom\u00f6glich Jahrzehnte sind die Zeit des Pragmatismus. Immer mehr lokale Maxima werden aufgebrochen und es wird gnadenlos optimiert. Nur die besten und flexibelsten Systeme \u00fcberleben. Gehen wir gemeinsam in diese spannende Zeit!<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The title image is generated AI.<\/p>","protected":false},"excerpt":{"rendered":"<p>In der Landschaft der Programmiersprachen und Frameworks, die sich ohnehin schon schnell ver\u00e4ndert, gab es im letzten Jahrzehnt einen Pradigmenwechsel, der vielen unbemerkt geblieben ist. Zwar sind OOP und die Unterst\u00fctzung von Klassen und Objekten noch immer ein Grundpfeiler vieler Programmiersprachen. Doch die Semantik weicht in der Praxis von dieser scheinbar konstanten Syntax mittlerweile ab, [&hellip;]<\/p>\n","protected":false},"author":4,"featured_media":1619,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[39,38,41],"tags":[],"class_list":["post-1593","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-software","category-nerd-talk","category-projektmanagement"],"blocksy_meta":[],"acf":[],"_links":{"self":[{"href":"https:\/\/avant-iconic.com\/en\/wp-json\/wp\/v2\/posts\/1593","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/avant-iconic.com\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/avant-iconic.com\/en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/avant-iconic.com\/en\/wp-json\/wp\/v2\/users\/4"}],"replies":[{"embeddable":true,"href":"https:\/\/avant-iconic.com\/en\/wp-json\/wp\/v2\/comments?post=1593"}],"version-history":[{"count":1,"href":"https:\/\/avant-iconic.com\/en\/wp-json\/wp\/v2\/posts\/1593\/revisions"}],"predecessor-version":[{"id":2392,"href":"https:\/\/avant-iconic.com\/en\/wp-json\/wp\/v2\/posts\/1593\/revisions\/2392"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/avant-iconic.com\/en\/wp-json\/wp\/v2\/media\/1619"}],"wp:attachment":[{"href":"https:\/\/avant-iconic.com\/en\/wp-json\/wp\/v2\/media?parent=1593"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/avant-iconic.com\/en\/wp-json\/wp\/v2\/categories?post=1593"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/avant-iconic.com\/en\/wp-json\/wp\/v2\/tags?post=1593"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}