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?
Antworten:
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.
quelle
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.
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.
quelle
Ich denke, deine Vorstellung von OOP ist ziemlich verkehrt:
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.
quelle
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.
quelle
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.
quelle