Niesi hat geschrieben: Mo 27. Jan 2025, 20:20
Ich weiß jetzt grad nicht, aus welcher Ecke diese allen anderen Erkenntnissen widersprechende Verlautbahrung kommt.
Ich fürchte, es ist wie immer: Die, die mit irgendwas nicht klarkommen, wollen es dann auch runtermachen ...
Ohne OOP sind wirklich komplexe Projekte gar nicht mehr möglich.
Ballerspiele und so sind keine solchen.
Gibt diverse Studien Designs, entweder Analyse großer Projekte, z.B. gibt es viele C Projekte (procedural) die auf C++ (OOP) umgestiegen sind, also selbe Entwickler, selbe Code Base direkter Vergleich der C und C++ Komponenten. Alternativ kann man zwischen Projekten ähnlicher Komplexität vergleichen, z.b. verschiedene Projekte des selben Unternehmens.
Bei diesen Experimenten wird meist in die Versionskontrolle geschaut und nachgeschaut wie oft dort über einen gewissen Zeitraum Fehler behoben wurden.
Dann gibt's noch die dritte art an experimenten dort gibt man einem Haufen Studenten Komponenten einmal OOP und einmal Procedural und schaut wie schnell sie mit den Komponenten vertraut sind, wie gut sie darin Fehler finden, etc.
Da ich Grade am handy bin und keine Lust habe die Studien alle rauszusuchen, hier mal woran ich mich erinnere:
Moderne OOP sprachen sind produktiver und weniger fehleranfällig als alte prozedurale sprachen. Insbesonders C++ gewinnt gegen C ziemlich eindeutig.
Moderne prozedurale bzw. Hybrid sprachen wir go oder rust sind aber wiederum besser als ältere OOP sprachen wir C++ oder Java. Moderne OOP sprachen wie swift oder kotlin sind aber auch besser als alte OOP sprachen wie Java oder Objective C.
Aber grundsätzlich kann man sagen, modernere sprachen sind oftmals besser als ältere, was ja auch zu erwarten ist, da moderne sprachen von den fehlern der alten Sprachen lernen, während ältere sprachen wegen rückwärts Kompatibilität die alten Laster nicht einfach ablegen kann
Am interessantesten fand ich eine Studie die praktisch sich angeschaut hat wie einfach es ist mit Komponenten mit verschiedener Vererbungstiefe zu arbeiten. Ergebnisse waren das bis zu 3 Level an Vererbung die wartbarkeit von code erhöht, während es danach runter geht und Komponenten mit Vererbungstiefe von 5 sogar schlechter sind als welche ohne Vererbung. Grund dafür ist das man ab einer gewissen Ebene nicht mehr zuordnen kann welcher code wo ausgeführt wird.
Das ist übrigens auch genau der Effekt warum viele Sprachen von Vererbung auf Komposition wechseln. Komposition vermeidet diese ewig langen Vererbungshierarchien und abstrakte Methoden. Man gewinnt die Kapselung, ohne das man durch die Eingeweide der Vererbungshierarchie sich wühlen muss um rauszufinden was wann ausgeführt wird
Sonstige interessante Erkenntnisse, wenn man sich durch die Literatur wühlt:
Funktionale sprachen verkürzen Entwicklungszeit und Anzahl Fehler sehr stark (Eriksson hat einen produktivitatsboost von Faktor 4-10 gemessen), und werden daher sehr gerne für prototypische Entwicklung verwendet.
Statische Typisierung Gegenüber dynamischer Typerkennung (wie in vielen scriptsprachen) reduziert massiv die Fehlerquote.
Compilezeit polymorphismus (z.b. generics, Funktionsüberladung, etc.) reduziert Fehler Gegenüber Laufzeit polymorphismus (Vererbung, if-then-else), und generell mehr statische Compiler Checks bedeuten normalerweise weniger Fehler