Funktionale vs Objektorientierte Programmierung, was ist besser?

Das Ergebnis basiert auf 15 Abstimmungen

Objektorientiert 73%
Funktional 27%

11 Antworten

Vom Fragesteller als hilfreich ausgezeichnet

Das ist wie "gute Wohnlage vs. gute Wärmedämmung" bei der Wohnungssuche. Also unabhängige Begriffe.

Auch funktional programmierte Projekte sind kaum noch zu warten, wenn an allen Seiten Zusatzfeatures angeklebt worden sind. Das hat mit strukturiertem Programmieren zu tun, also mit Selbstdisziplin der Programmierer (pardon, ein klein wenig Selbstdisziplin der Programmierer und sehr viel Verständnis des Managements für "heute 10% Zeitbedarf mehr statt 300% mehr Zeitbedarf in 5 Jahren").

Lies dir mal https://de.wikipedia.org/wiki/Funktionale_Programmierung durch und schau dir ein paar altehrwürdige LISP-Projekte an ... Selbstmodifizierende Algorithmen sind notorisch schwer zu warten. Dass Haskell einen so guten Ruf in Puncto Verifizierbarkeit hat, dürfte daran liegen, dass es (noch?) nicht in der Software-Industrie ("Kurzfristiger Gewinn - gibt es wirklich Phantasten, die glauben, es könnte ein anderes Ziel geben?") angekommen ist.

Warum muss das ein Entweder-Oder sein?

Häufig sind ältere OOP Programme kaum mehr vernünftig zu lesen, wenn immer mehr auf sie draufgesetzt wird.

Sind funktionale Programme vernünftig zu lesen, wenn immer mehr auf sie draufgesetzt wird?

Auch FP ist nur ein Werkzeug von vielen, mit Komplexität umzugehen - das lernst du, wenn du mal länger Erfahrung gesammelt hast. Brooks' Essay "No Silver Bullet" gilt nach wie vor uneingeschränkt (und wenn du davon noch nichts gehört hast, ist es höchste Zeit).

Valentin1720653 
Fragesteller
 16.07.2022, 19:37

Mit einer vernünftigen Dokumentation die dir sagt was eine Funktion genau macht definitiv.

Du hast dann ja keine Seiteneffekte also alles der gleiche Input führt immer zum gleichen Output.

0
schnfz  16.07.2022, 19:44
@Valentin1720653

Mal ehrlich, hast du überhaupt schon etwas größere Software (wir reden hier wenigstens von ein paar 10 kLOC) funktional entwickelt und gewartet, am besten in einem verteilten Team, wie es in der Realität vorkommt?

Dokumentation ist immer nur die letzte Verteidigungslinie. Die Eigenschaft "seiteneffektfrei" ist zweifellos sehr schön, aber letztlich verschiebt sich damit auch nur, wo der veränderliche Zustand der Applikation durchgeschleust wird. Spätestens wenn Closures durch die Gegend geschickt werden und es (nicht offensichtliche!) zyklische Abhängigkeiten zwischen Funktionen gibt wird's dann genauso mühsam und schlecht testbar wie in einem übermodellierten OOP-Design. Wie gesagt: dafür muss die Software halt deutlich größer werden als die Projekte, die man auf der Uni hat.

Den echten Unterschied macht dann das Architekturmanagement, nicht OOP oder FP.

5
Palladin007  17.07.2022, 00:00
@Valentin1720653
Mit einer vernünftigen Dokumentation die dir sagt was eine Funktion genau macht definitiv.

Wie viele Dokumentationen hast Du gesehen, die auch tatsächlich vernünftig sind, ausreichend ausführlich sind - und nach ein paar Jahren immer noch? ;)

Dokumentation ist immer das erste, was veraltet - nicht gut, darauf zu bauen.
Was man mMn. dokumentieren sollte, sind grundlegende Konzepte und Ziele hinter der der Architektur und natürlich die Funktionen der Software.

0

Nicht lesbarer Code: Das bekommst Du überall (oop/func) hin und ist nur ein Zeichen schlechten Handwerks und insbesondere schlechten Desgins.

Im ordentlichem Design bekommst du mit OOP deutlich größere Probleme vernünftig in den Griff.

Hab keine klare Meinung aber funktionaler Code ist definitiv nicht pauschal einfacher zu lesen. Bei Haskell ist das richtig schlimm

Woher ich das weiß:Studium / Ausbildung – Informatikstudium
Valentin1720653 
Fragesteller
 16.07.2022, 19:36

Naja mit einer Dokumentation die dir sagt was eine Funktion genau macht schon.

Funktionen (sollte man funktional programmieren) produzieren keine Seiteneffekte, de4 gleiche Input führt immer zum gleichen Output.

0
magicced01  16.07.2022, 20:02
@Valentin1720653

Aber es macht halt viele triviale Sachen deutlich schwere und ist bei größeren Codebases auch echt nicht easy zu verwalten. Außerdem gibts Lambda Funktionen Pattern Matching und sowas auch mittlerweile integriert in vielen OOP Sprachen

0

Mit Composition > Inheritance ist OOP eigentlich immer noch ganz vernünftig. Und funktionale Elemente sind ebenso immer wieder praktisch. Ich denke nicht, dass das Eine besser als das Andere ist, sondern man kann beides relativ gut in Kombination nutzen.