Vorteile der klassischen OOP-Sprache gegenüber der Go-Sprache

13

Ich habe viel über Sprachdesign nachgedacht und darüber, welche Elemente für eine "ideale" Programmiersprache erforderlich sind, und das Studium von Go von Google hat mich dazu veranlasst, eine Menge sonst üblicher Kenntnisse in Frage zu stellen.

Insbesondere scheint Go alle interessanten Vorteile der objektorientierten Programmierung zu bieten, ohne die Struktur einer objektorientierten Sprache zu haben. Es gibt keine Klassen, nur Strukturen; Es gibt keine Klassen- / Strukturvererbung, sondern nur die Einbettung von Strukturen. Es gibt keine Hierarchien, keine übergeordneten Klassen, keine expliziten Schnittstellenimplementierungen. Typumwandlungsregeln basieren stattdessen auf einem losen System, das der Duck-Typisierung ähnelt. Wenn eine Struktur die erforderlichen Elemente eines "Readers" oder einer "Anforderung" oder einer "Codierung" implementiert, können Sie sie umwandeln und verwenden als ein.

Gibt es etwas an OOP, das in C ++ und Java und C # implementiert ist, das von Natur aus leistungsfähiger und wartungsfreundlicher ist und das Sie aufgeben müssen, wenn Sie in eine Sprache wie Go wechseln? Welchen Nutzen müssen Sie aufgeben, um die Einfachheit dieses neuen Paradigmas zu erreichen?

BEARBEITEN
Die "obsolete" Frage, an der die Leser zu hängen schienen und die sie ärgerte, wurde entfernt.

Die Frage ist, was das traditionelle objektorientierte Paradigma (mit Hierarchien und dergleichen), wie es häufig in Implementierungen in gemeinsamen Sprachen zu sehen ist, zu bieten hat, das in diesem einfacheren Modell nicht so einfach zu bewerkstelligen ist. Oder, mit anderen Worten, wenn Sie heute eine Sprache entwerfen würden, gibt es einen Grund, warum Sie das Konzept der Klassenhierarchien einbeziehen möchten?

tylerl
quelle
1
Hat OOP die prozedurale Programmierung überflüssig gemacht? Ich hasse es, pedantisch zu klingen oder dass ich mit dir rede, aber das war der erste Satz, der mir in den Sinn kam. Go bietet ein neues (ish) Paradigma. Wenn Sie experimentieren, werden Sie herausfinden, worin es gut ist und worin es nicht gut ist (wie bei allen Paradigmen und Sprachen), und Sie werden am Ende Hunderte großartiger Produkte (zusammen mit einem angemessenen Anteil an schlechten Produkten) in Go erhalten . Zumindest ist das meine Meinung
Jamie Taylor
1
Es gibt einige interessante Lesungen, wenn Sie Google für OOP tot ist . Ich empfehle The Web wird sterben, wenn OOP stirbt
Andomar
OOP hat einen so geringen Wert, dass es sich nicht lohnt, Ihre Zeit zu verschwenden.
SK-logic
1
Ich stimme dem vorherigen Kommentar zu und konzentriere mich nicht zu sehr auf OOP. Außerdem bedeutet OOP nicht C ++ oder Java. Versuchen Sie abit auf ltu.org
AndreasScheinert
C ++, Java und C # sind keine "klassischen" OOP-Sprachen. Wenn es eine klassische OOP-Sprache gibt, denke ich, dass es Smalltalk ist.
Kevin Cline

Antworten:

16

Es gibt kein neues Paradigma. Die Objektorientierung ist ein Muster, mit dem Sie Programme schreiben, das nicht einmal klar definiert ist. Verschiedene Sprachen bieten verschiedene Merkmale, die für die Objektorientierung typisch sind (Definition neuer Typen, Verkapselung, Typhierarchien, Polymorphismus, Nachrichtenübergabe und mehr), andere jedoch möglicherweise nicht. In diesen Fällen liegt es an den Programmierern, diese bei Bedarf zu emulieren.

Viele der Sprachen, die diese Funktionen bereitstellen, haben keine Entsprechung zum Klassenkonzept - zum Beispiel Javascript und Common Lisp. Die Implementierung von Java-ähnlichen Sprachen (klassenbasiert, mit einfacher Vererbung, Schnittstellen, typbasiertem Versand) ist nur eine der Möglichkeiten und nicht unbedingt die beste.

Andrea
quelle
11
+1 für "nicht unbedingt das beste". Unter Berufung auf Alan Kay: "Ich habe den Begriff objektorientiert erfunden und kann Ihnen sagen, dass ich C ++ nicht im Sinn hatte." (noch hatte er C # und / oder Java, würde ich demütig
schätzen
1
@herby Ich habe gesehen, dass es nahe legt, dass Agentensysteme (ähnlich wie Erlang) Alan Kays letztendlicher Absicht für OOP näher sind.
CodexArcanum
2
Äh, Common Lisp hat definitiv Unterricht. In der Regel enthält eine CL-Klasse jedoch Daten und Methoden, die für "generische Funktionen" definiert sind. Als Nebeneffekt können Sie auf diese Weise auf bequeme Weise mehrere Versandvorgänge ausführen, da die Methoden nicht mehr eng an "eine einzelne Implementierungsklasse" gekoppelt sind.
Vatine
Ja, ich meinte, dass es keine Klassen im Java-Sinne gibt
Andrea
5

Welchen Nutzen müssen Sie aufgeben, um die Einfachheit dieses neuen Paradigmas zu erreichen?

Die Typprüfung für ein Strukturtypsystem ist sehr viel komplexer als nur zu prüfen, ob sich die Basisklasse in Ihrer Vererbungsliste befindet. Virtueller Versand wird etwas kniffliger und wahrscheinlich weniger performant.

Veraltet ein solches System das Konzept von OOP?

Nein. Solange Sie das Programm in Form von "Objekten, die Dinge tun" anstatt einer Liste von Anweisungen, einem deklarierten Regelsatz oder einer kaskadierenden Reihe von Funktionen erstellen können, spielt die Implementierung keine Rolle. Ebenso macht das Ändern des Typsystems keines der allgemeinen OO-Prinzipien ungültig.

Sie können immer noch an einem Basistyp arbeiten und sich nicht um den tatsächlichen Typ kümmern. Sie können Typen trotzdem erweitern, ohne sie zu ändern. Sie können einen Typ immer noch dazu bringen, nur eine Sache zu tun. Sie können weiterhin feinkörnige Schnittstellen bereitstellen. Sie können weiterhin Abstraktionen für Ihre Typen bereitstellen.

Wie eine Sprache das zulässt, ist eigentlich egal.

Telastyn
quelle
Tatsächlich vereinfacht Go all diese OOP- Aufgaben und fügt einige zusätzliche Möglichkeiten hinzu, z. B. die Erweiterung eines Typs, um eine neue Schnittstelle für vorhandene Instanzen bereitzustellen (sofern Sie natürlich keine neuen Datenelemente benötigen).
Jan Hudec
4

Ich denke, deine Vorstellung von OOP ist ziemlich verkehrt:

Ich habe den Begriff 'objektorientierte Programmierung' erfunden und dies {Java und C ++} ist nicht das, was ich mir vorgestellt habe.
- Alan Kay .

Die Wahl der Typisierung (Nominativ-Subtypisierung, Struktur-Subtypisierung oder Enten-Typisierung - oder eine Kombination davon) ist weitgehend orthogonal zu OOP. Vererbung und Klassen sind vollständig orthogonal zu OOP. Wenn Sie sich etwas Zeit nehmen, um mit io zu spielen, werden Sie das sehen.

Nun können Sie sich fragen, welche Art von Typsystemen "besser" sind und welche Mittel zur Wiederverwendung und Kombination von Code vorhanden sind. Versuchen Sie, die Vor- und Nachteile zwischen den in Simula (und später in C ++, Java und C #) getroffenen und den in Go getroffenen Entscheidungen zu ermitteln. Aber das sind alles unterschiedliche und unterschiedliche Fragen.

Letztendlich ist OOP ein sehr vages Konzept, und alle Versuche, es umzusetzen, kommen in einer Vielzahl von Varianten. Aber um die Dinge wirklich zu vereinfachen, würde ich sagen, dass die Kernidee von OOP darin besteht, Systeme aus SOLID- Subsystemen zusammenzusetzen. Dies verwischt die Grenze zu anderen Paradigmen, aber ich würde spekulieren, dass dies der Grund ist, warum Sprachen mit mehreren Paradigmen in letzter Zeit immer beliebter werden und warum Google mit Go einen eigenen Versuch unternommen hat.

back2dos
quelle
2
Die Frage bezieht sich auf die Konzepte, nicht unbedingt auf den Begriff. Wenn Sie einen besseren Namen als "OOP" finden, um auf das Konzept der Klassenhierarchien und den damit verbundenen Beschnitt zu verweisen, können Sie diesen stattdessen verwenden.
Tyler
@tylerl: Du verwechselst mindestens zwei Fragen zu einer. Eine ist, ob strukturelle Untertypen besser sind als nominative Untertypen. Die andere ist im Grunde, ob Zusammensetzung besser ist als Vererbung. Diese Fragen sind orthogonal zueinander. Ich denke, letztendlich trifft die "beste" Sprache diese Wahl nicht für Sie. Ich würde spekulieren, dass Go einfach andere Probleme hat, aber wir werden sehen, ob Google diese Funktionen "zurück" hinzufügt oder nicht.
back2dos
Ich möchte nur eine Sprache, die die meisten Funktionen von C ++ besitzt, aber kleiner und einfacher ist. C ++ ist die einzige Sprache außer C, die für Kernel realistisch ist, und bietet äußerst nützliche Tools wie Destruktoren und die STL. Und das wichtige Prinzip "Wenn Sie es nicht benutzen, bezahlen Sie nicht dafür". OO, richtig angewendet, ist extrem leistungsfähig. Aber auch Generika und andere Non-OO-Konzepte sind unabdingbar. C geben Sie fast nichts, und Go wirft echte OO für einige seltsame neue Ideen.
Erik Alapää
1

OOP ist nicht überholt.

Wie Andrea sagte, wurden viele Konzepte als Alternative zu Klassen vorgeschlagen (zum Beispiel: Hashell-Typenklasse). OOP hat einen großen Vorteil: Es wird an vielen Orten unterrichtet, und die Kultur von OOP wird größtenteils unter Entwicklern geteilt.

Dies ermöglicht eine reichhaltigere Kommunikation innerhalb eines Teams. Man kann leichter über Fabriken sprechen als über Zygohistomorphe Präpromorphismen . OOP strukturiert die Art und Weise, wie Sie Ihr Programm organisieren und mit Hilfe von häufig verwendeten Diagrammen kommunizieren. Dies ist ein starkes Kapital.

Simon Bergot
quelle
1
Ich denke: an vielen Stellen durchdacht. Ist eigentlich kein Vorteil.
AndreasScheinert
@AndreasScheinert warum wäre das nicht ein Vorteil?
Simon Bergot
Denn um ein Urteil zu fällen, sollte man mindestens 1 Alternative gleich gut kennen. Es ist eine Gewohnheit, dass Menschen gerne in ihrer Komfortzone bleiben und dies zu einer Stagnation führt.
AndreasScheinert
@AndreasScheinert das richtige Werkzeug für den Job verwenden. Oop funktioniert nicht für alle Szenarien .... hat nichts mit ihrer Komfortzone zu tun
pqsk
1

Nein, hier gibt es nichts Neues und OOP ist nicht mehr aktuell. C ++ hat auch implizite Schnittstellen in Form von Vorlagen, aber die Leute verwenden immer noch virtuelle Funktionen. Sie benötigen explizite Schnittstellen, um mit z. B. binären Schnittstellen fertig zu werden, oder Schnittstellen, bei denen der andere Code zur Kompilierungszeit einfach nicht bekannt ist.

Man könnte argumentieren, dass dies einfach ein Fall von Folgerung ist, anstatt es explizit zu formulieren, was nichts mit einem "neuen Paradigma" zu tun hat und wirklich nur bequemer ist.

DeadMG
quelle