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.