Was sind die Unterschiede zwischen diesen Programmierparadigmen und sind sie besser für bestimmte Probleme geeignet oder bevorzugen Anwendungsfälle einen gegenüber den anderen?
Architekturbeispiele geschätzt!
Was sind die Unterschiede zwischen diesen Programmierparadigmen und sind sie besser für bestimmte Probleme geeignet oder bevorzugen Anwendungsfälle einen gegenüber den anderen?
Architekturbeispiele geschätzt!
Antworten:
Alle von ihnen sind auf ihre Weise gut - sie sind einfach unterschiedliche Ansätze für die gleichen Probleme.
In einem rein prozeduralen Stil sind Daten in der Regel stark von den Funktionen entkoppelt, die sie ausführen.
In einem objektorientierten Stil neigen Daten dazu, eine Sammlung von Funktionen mit sich zu führen.
In einem funktionalen Stil haben Daten und Funktionen tendenziell mehr Gemeinsamkeiten (wie in Lisp und Scheme) und bieten gleichzeitig mehr Flexibilität hinsichtlich der tatsächlichen Verwendung von Funktionen. Algorithmen werden eher als Rekursion und Komposition als als Schleifen und Iteration definiert.
Natürlich beeinflusst die Sprache selbst nur, welcher Stil bevorzugt wird. Selbst in einer rein funktionalen Sprache wie Haskell können Sie in einem prozeduralen Stil schreiben (obwohl davon dringend abgeraten wird), und selbst in einer prozeduralen Sprache wie C können Sie in einem objektorientierten Stil programmieren (wie in GTK + und EFL-APIs).
Der "Vorteil" jedes Paradigmas liegt einfach in der Modellierung Ihrer Algorithmen und Datenstrukturen. Wenn Ihr Algorithmus beispielsweise Listen und Bäume enthält, ist ein Funktionsalgorithmus möglicherweise am sinnvollsten. Wenn Ihre Daten beispielsweise stark strukturiert sind, ist es möglicherweise sinnvoller, sie als Objekte zusammenzustellen, wenn dies das native Paradigma Ihrer Sprache ist - oder sie können genauso einfach geschrieben werden wie eine funktionale Abstraktion von Monaden, die ist das native Paradigma von Sprachen wie Haskell oder ML.
Die Wahl, die Sie verwenden, ist einfach sinnvoller für Ihr Projekt und die Abstraktionen, die Ihre Sprache unterstützt.
Ich denke, die verfügbaren Bibliotheken, Tools, Beispiele und Communitys übertreffen das Paradigma heutzutage völlig. Zum Beispiel könnte ML (oder was auch immer) die ultimative Allzweck-Programmiersprache sein, aber wenn Sie keine guten Bibliotheken für das bekommen, was Sie tun, sind Sie fertig.
Wenn Sie beispielsweise ein Videospiel erstellen, gibt es in C ++ mehr gute Codebeispiele und SDKs, sodass Sie damit wahrscheinlich besser dran sind. Für eine kleine Webanwendung gibt es einige großartige Python-, PHP- und Ruby-Frameworks, mit denen Sie sehr schnell loslegen können. Java ist aufgrund der Überprüfung der Kompilierungszeit und der Unternehmensbibliotheken und -plattformen eine gute Wahl für größere Projekte.
Früher war es so, dass die Standardbibliotheken für verschiedene Sprachen ziemlich klein und leicht zu replizieren waren - C, C ++, Assembler, ML, LISP usw. kamen mit den Grundlagen, neigten jedoch dazu, sich zu standardisieren, wenn es um die Standardisierung von Dingen ging Wie Netzwerkkommunikation, Verschlüsselung, Grafiken, Datendateiformate (einschließlich XML) wurden auch grundlegende Datenstrukturen wie ausgeglichene Bäume und Hashtabellen weggelassen!
Moderne Sprachen wie Python, PHP, Ruby und Java verfügen jetzt über eine weitaus anständigere Standardbibliothek und verfügen über viele gute Bibliotheken von Drittanbietern, die Sie problemlos verwenden können, was zum großen Teil auf die Verwendung von Namespaces zurückzuführen ist, um zu verhindern, dass Bibliotheken miteinander kollidieren. und Speicherbereinigung, um die Speicherverwaltungsschemata der Bibliotheken zu standardisieren.
Diese Paradigmen müssen sich nicht gegenseitig ausschließen. Wenn Sie sich Python ansehen, unterstützt es Funktionen und Klassen, aber gleichzeitig ist alles ein Objekt, einschließlich Funktionen. Sie können den funktionalen / oop / prozeduralen Stil in einem Code kombinieren.
Ich meine, in funktionalen Sprachen (zumindest in Haskell, der einzigen, die ich studiert habe) gibt es keine Aussagen! Funktionen sind nur ein Ausdruck in ihnen erlaubt !! ABER Funktionen sind erstklassige Bürger, Sie können sie zusammen mit einer Reihe anderer Fähigkeiten als Parameter weitergeben. Sie können mit wenigen Codezeilen mächtige Dinge tun.
In einer prozeduralen Sprache wie C können Sie Funktionen nur mithilfe von Funktionszeigern weitergeben, und dies allein ermöglicht nicht viele leistungsstarke Aufgaben.
In Python ist eine Funktion ein erstklassiger Bürger, kann jedoch eine beliebige Anzahl von Anweisungen enthalten. Sie können also eine Funktion haben, die prozeduralen Code enthält, aber Sie können ihn genau wie funktionale Sprachen weitergeben.
Gleiches gilt für OOP. In einer Sprache wie Java können Sie keine Prozeduren / Funktionen außerhalb einer Klasse schreiben. Die einzige Möglichkeit, eine Funktion weiterzugeben, besteht darin, sie in ein Objekt zu verpacken, das diese Funktion implementiert, und dieses Objekt dann weiterzugeben.
In Python gibt es diese Einschränkung nicht.
Für die GUI würde ich sagen, dass das objektorientierte Paradigma sehr gut geeignet ist. Das Fenster ist ein Objekt, die Textfelder sind Objekte und die Okay-Schaltfläche ist auch eines. Auf der anderen Seite können Dinge wie die String-Verarbeitung mit viel weniger Aufwand erledigt werden und sind daher mit einem einfachen prozeduralen Paradigma einfacher.
Ich denke auch nicht, dass es eine Frage der Sprache ist. Sie können in fast jeder gängigen Sprache funktional, prozedural oder objektorientiert schreiben, obwohl dies in einigen Sprachen ein zusätzlicher Aufwand sein kann.
Um Ihre Frage zu beantworten, benötigen wir zwei Elemente:
Eine Liste der Softwarearchitekturstile / -muster finden Sie im Artikel zur Softwarearchitektur auf Wikipeida. Und Sie können sie einfach im Internet recherchieren.
Kurz gesagt und allgemein ist Procedural gut für ein Modell, das einer Prozedur folgt, OOP ist gut für das Design und Functional ist gut für die Programmierung auf hoher Ebene.
Ich denke, Sie sollten versuchen, die Geschichte jedes Paradigmas zu lesen und herauszufinden, warum Menschen es schaffen, und Sie können sie leicht verstehen.
Nachdem Sie beide verstanden haben, können Sie die Elemente von Architekturstilen / -mustern mit Programmierparadigmen verknüpfen.
Ich denke, dass sie oft nicht "gegen" sind, aber Sie können sie kombinieren. Ich denke auch, dass die Wörter, die Sie erwähnen, oft nur Schlagworte sind. Es gibt nur wenige Menschen, die tatsächlich wissen, was "objektorientiert" bedeutet, selbst wenn sie die schärfsten Evangelisten davon sind.
Einer meiner Freunde schreibt eine Grafik-App mit NVIDIA CUDA . Die Anwendung passt sehr gut zum OOP-Paradigma und das Problem kann ordentlich in Module zerlegt werden. Um CUDA verwenden zu können, müssen Sie jedoch C verwenden, das die Vererbung nicht unterstützt . Deshalb müssen Sie klug sein.
a) Sie entwickeln ein cleveres System, das bis zu einem gewissen Grad die Vererbung emuliert. Es kann getan werden!
i) Sie können ein Hook-System verwenden , das erwartet, dass jedes Kind C von Elternteil P eine bestimmte Überschreibung für Funktion F hat. Sie können Kinder dazu bringen, ihre Überschreibungen zu registrieren, die gespeichert und bei Bedarf aufgerufen werden.
ii) Sie können struct verwenden Speicherausrichtung Funktion Guss Kinder in Eltern.
Dies kann ordentlich sein, aber es ist nicht einfach, eine zukunftssichere, zuverlässige Lösung zu finden. Sie werden viel Zeit damit verbringen, das System zu entwerfen, und es gibt keine Garantie dafür, dass Sie in der Mitte des Projekts nicht auf Probleme stoßen. Die Implementierung der Mehrfachvererbung ist noch schwieriger, wenn nicht sogar fast unmöglich.
b) Sie können eine konsistente Namensrichtlinie verwenden und den Divide and Conquer- Ansatz verwenden, um ein Programm zu erstellen. Es wird keine Vererbung haben, aber da Ihre Funktionen klein, leicht verständlich und konsistent formatiert sind, benötigen Sie sie nicht. Die Menge an Code, die Sie schreiben müssen, steigt, es ist sehr schwierig, konzentriert zu bleiben und nicht einfachen Lösungen (Hacks) zu erliegen. Diese Ninja-Codierungsmethode ist jedoch die C-Codierungsmethode. Das Gleichgewicht zwischen Freiheit auf niedriger Ebene und dem Schreiben von gutem Code halten. Ein guter Weg, dies zu erreichen, besteht darin, Prototypen in einer funktionalen Sprache zu schreiben. Zum Beispiel eignet sich Haskell hervorragend für Prototyping-Algorithmen.
Ich tendiere zur Annäherung b. Ich habe eine mögliche Lösung mit Ansatz a geschrieben, und ich werde ehrlich sein, es fühlte sich mit diesem Code sehr unnatürlich an.