Bearbeiten:
Um weitere Verwirrung zu vermeiden: Ich spreche nicht über Webdienste und dergleichen. Ich spreche über die interne Strukturierung von Anwendungen, es geht nicht darum, wie Computer kommunizieren. Es geht um Programmiersprachen, Compiler und wie das imperative Programmierparadigma erweitert wird.
Original:
Im Bereich der imperativen Programmierung haben wir in den letzten 20 Jahren (oder länger) zwei Paradigmen gesehen: objektorientiert (OO) und serviceorientiert (SO) aka. komponentenbasiert (CB).
Beide Paradigmen erweitern das imperative Programmierparadigma, indem sie ihren eigenen Begriff von Modulen einführen. OO nennt sie Objekte (und Klassen) und lässt sie sowohl Daten (Felder) als auch Prozeduren (Methoden) zusammenkapseln. Im Gegensatz dazu trennt SO Daten (Datensätze, Beans, ...) vom Code (Komponenten, Dienste).
Allerdings hat nur OO Programmiersprachen, die sein Paradigma nativ unterstützen: Smalltalk, C ++, Java und alle anderen JVM-kompatiblen, C # und alle anderen .NET-kompatiblen, Python usw.
SO hat keine solche Muttersprache. Es entsteht nur zusätzlich zu prozeduralen Sprachen oder OO-Sprachen: COM / DCOM (binär, C, C ++), CORBA, EJB, Spring, Guice (alle Java), ...
Diese SO-Frameworks leiden eindeutig unter der fehlenden Unterstützung ihrer Konzepte in der Muttersprache.
- Sie verwenden OO-Klassen, um Dienste und Datensätze darzustellen. Dies führt zu Entwürfen, bei denen klar zwischen Klassen unterschieden wird, die nur Methoden (Dienste) haben, und solchen, die nur Felder haben (Datensätze). Die Vererbung zwischen Diensten oder Datensätzen wird dann durch Vererbung von Klassen simuliert. Technisch gesehen wird es nicht so streng gehalten, aber im Allgemeinen wird Programmierern empfohlen, Klassen so zu gestalten, dass sie nur eine der beiden Rollen spielen.
- Sie verwenden zusätzliche externe Sprachen, um die fehlenden Teile darzustellen: IDLs, XML-Konfigurationen, Anmerkungen in Java-Code oder sogar eingebettetes DSL wie in Guice. Dies ist insbesondere erforderlich, aber nicht beschränkt auf, da die Zusammensetzung der Dienste nicht Teil des Dienstcodes selbst ist. In OO erstellen Objekte andere Objekte, sodass solche Einrichtungen nicht erforderlich sind, für SO jedoch, weil Dienste andere Dienste nicht instanziieren oder konfigurieren.
- Sie erzeugen einen plattforminternen Effekt zusätzlich zu OO (frühes EJB, CORBA), bei dem der Programmierer den gesamten Code schreiben muss, der zum "Fahren" von SO erforderlich ist. Klassen stellen nur einen Teil der Natur eines Dienstes dar und viele Klassen müssen geschrieben werden, um zusammen einen Dienst zu bilden. All diese Kesselplatte ist notwendig, weil es keinen SO-Compiler gibt, der dies für den Programmierer tun würde. Dies ist genau so, wie es einige Leute in C für OO getan haben, als es kein C ++ gab. Sie übergeben einfach den Datensatz, der die Daten des Objekts als ersten Parameter enthält, an die Prozedur, die die Methode ist. In einer OO-Sprache ist dieser Parameter implizit und der Compiler erzeugt den gesamten Code, den wir für virtuelle Funktionen usw. benötigen. Für SO fehlt dies eindeutig.
- Insbesondere die neueren Frameworks verwenden häufig AOP oder Introspection, um die fehlenden Teile zu einer OO-Sprache hinzuzufügen. Dies bringt nicht die erforderliche Ausdruckskraft der Sprache, vermeidet jedoch den im vorherigen Punkt beschriebenen Code der Kesselplattform.
- Einige Frameworks verwenden die Codegenerierung, um den Kesselplattencode zu erzeugen. Konfigurationsdateien in XML oder Anmerkungen in OO-Code sind hierfür die Informationsquelle.
Nicht alle der oben genannten Phänomene können auf SO zurückgeführt werden, aber ich hoffe, es zeigt deutlich, dass eine SO-Sprache erforderlich ist. Da dieses Paradigma so beliebt ist: Warum gibt es keines? Oder vielleicht gibt es einige akademische, aber zumindest die Industrie verwendet keine.
quelle
Antworten:
Weil <5% des Codes tatsächlich einen Dienst definieren und ich eine wesentlich kürzere Zeitspanne argumentieren würde. Sobald die Schnittstelle definiert ist, ist sie weitgehend fertig. Der Rest der Zeit wird in OO (oder Alternativen) verbracht, damit die Dinge funktionieren .
Einfach ausgedrückt ist es kein großer Gewinn, eine spezielle Sprache für diesen kleinen Teil des Problems zu erstellen. Wenn Sie zwei Sprachen haben (eine für den Service und eine für die Implementierung / den Verbrauch), müssen Sie lediglich die Komplexität der Integration erhöhen.
[Bearbeiten Sie für die OP-Klarstellung, dass es sich um das interne Anwendungslayout handelt, nicht um die Anwendungsgrenze]:
Das Hauptziel eines solchen Dienstlayouts besteht darin, dünne Berührungspunkte zwischen den Diensten zu haben. Mein ursprünglicher Grund gilt immer noch (imo) und fügt dieser Antwort die Tatsache hinzu, dass relativ wenige Probleme gut zu einer internen Anwendungsstruktur passen, die auf Diensten basiert. Sie sprechen also nicht nur einen kleinen Teil des Problems an, sondern insgesamt auch einen geringeren Prozentsatz der Probleme.
quelle
Funktionssprachen sind im Kern sehr serviceorientiert. Anstatt Objekte zu erstellen und Funktionen aufzurufen, erstellen Sie Funktionen und übergeben Nachrichten an sie. Erlang ist ein Paradebeispiel für diese Technik, da über die funktionalen Aspekte der Sprache hinaus eine prozess- und sogar maschinenübergreifende Kommunikation in das Kernframework integriert ist, mit der Sie Nachrichten an einen Remote-Prozess senden können, als wäre es ein lokaler Prozess .
Andere Sprachen wie Scala, Clojure und F # bieten ebenfalls eine "serviceorientierte" Semantik. Das Problem ist nicht, dass sie nicht existieren, sondern dass die allgemeine Bevölkerung Angst vor ihnen hat und sie daher nicht so beliebt sind.
quelle
Serviceorientierung war / ist eine architektonische Antwort auf Integrationsprobleme. Die Integration ist idealerweise eine umfassende Lösung, die jede vorhandene Sprache, jedes Produkt, jedes Gerät und jede Ressource in ein größeres Bild einfügt.
Es ist keine neue Sprache erforderlich, da das eigentliche Problem darin besteht, bereits zu viele Sprachen zu haben , was zu hohen Interoperabilitätskosten führt.
Es wurde jedoch eine Art von Sprache eingeführt, die Webdienst-Definitionssprache. WSDL ist die Metasprache von SOA (und es gibt eine andere verlassene Sprache für REST mit dem Namen WADL).
quelle
Ich werde die Frage umdrehen und fragen: "Wie würde eine SO-Sprache aussehen?"
Wie würden diese Verträge zwischen Modulen geschrieben?
Wie würde die grundlegende Funktionsmechanik ausgeführt werden?
Serviceorientiert ist eine Eigenschaft der Anwendung, nicht unbedingt die verwendete Sprache. Der Dienst ist ein Konstrukt, das auf einer Funktion beruht. Die Funktion ist ein Konstrukt, das sich auf die Mechanik einer Programmiersprache stützt, um Operationen in maschinenausführbare Anweisungen zu übersetzen.
BPEL ist ein mögliches Beispiel für eine SO-Sprache, aber es ist ein sehr hohes Niveau und setzt voraus, dass Module verfügbar sind, damit es verwendet werden kann. Diese Module sind wiederum in Nicht-BPEL-Sprachen geschrieben, damit Arbeiten ausgeführt werden können (auch bekannt als in Maschinensprache übersetzt).
Tolles Q und gab mir einen guten Moment zum Nachdenken.
quelle
Ich werde eine Antwort auf meine eigene Frage geben, um zu sehen, wie viele Menschen zustimmen und nicht zustimmen.
Einige Möglichkeiten:
Es scheint schwierig zu sein, eine SO-Sprache zu konstruieren. Vor allem wegen der Trennung der Implementierung von Diensten und ihrer Zusammensetzung. Es gibt ein paar akademische Lösungen, von denen ich an der Universität gehört habe (keine Referenz, sorry), aber es scheint nicht in die Branche zu kommen. Aber ich zähle dies als Entschuldigung, nicht als wirklichen Grund. OO-Sprachen und Compiler sind ebenfalls ziemlich schwierig zu implementieren, aber es gibt seit langem Lösungen auf dem Markt.
Programmierer verwenden OO-Sprachen für SO, weil sie OO nicht verstehen und es falsch verwenden. Ich sage falsch, weil es in OO zwei grundlegende Konzepte gibt, die SO widersprechen:
Die Funktionalität geht an die Klasse, in der sich die Daten befinden, an denen sie arbeiten. Code und Daten werden im selben Modul miteinander gekoppelt. Es ist kein OO-Stil, separate Klassen zu haben, die mit den Daten anderer Klassen arbeiten. Das ist Züllighofens Tools-and-Materials-Ansatz (WAM), der dem SO-Paradigma entspricht.
Objekte erstellen andere Objekte und bilden Netzwerke von Objekten. Sie können Hierarchien oder andere komplexe Beziehungen erstellen. Dienste bilden immer flache Netzwerke, die von außen zusammengesetzt sind. Dienste haben normalerweise nur eine Instanz (Singleton), während Objekte so oft instanziiert werden, wie die von ihnen dargestellte Entität existiert. Datensätze in SO sind nicht in Netzwerken verbunden.
Einige Funktionen von OO ähneln SO oder können verwendet werden, um die für SO erforderlichen Funktionen zu vereinfachen. Daher ist es praktisch, eine OO-Sprache zu verwenden.
Das Prinzip der Abhängigkeitsinversion in OO ähnelt der Art und Weise, wie Dienste extern zusammengesetzt werden.
Singleton-Objekte sind wie Services, Objektfabriken sind wie Service Locators.
OO hat auch Schnittstellen, die den Dienstschnittstellen ähnlich sind.
Die Vererbung von Klassen kann ähnlich (gleich?) Wie die Vererbung von Diensten und Datensätzen sein.
OO und SO sind nützlich für verschiedene Arten von Problemen. Daher ist es in jeder Anwendung verlockend, hier oder da entweder ein Paradigma zu verwenden. Eine separate Sprache würde den Wechsel zwischen beiden innerhalb desselben Programms behindern.
SO ist nicht nur ein Programmierparadigma, sondern auch ein Programmverhalten: Webdienste, Betriebssystemkomponenten usw. sind SO, müssen jedoch nicht unbedingt in einer SO-Sprache geschrieben werden. Diese Art von "binären Komponenten" ist sehr natürlich und erfolgreich. Aber es ist eine andere Sache: Es ist, wie Programme miteinander kommunizieren, nicht wie das Programm intern kommuniziert. Ich denke, die Leute verwechseln das oft genug.
quelle