Éditer:
Pour éviter toute confusion: je ne parle pas des services Web et autres. Je parle de structurer des applications en interne, il ne s'agit pas de la façon dont les ordinateurs communiquent. Il s'agit des langages de programmation, des compilateurs et de la façon dont le paradigme de programmation impératif est étendu.
Original:
Dans le domaine de la programmation impérative, nous avons vu deux paradigmes au cours des 20 dernières années (ou plus): orienté objet (OO) et orienté service (SO). à base de composants (CB).
Les deux paradigmes étendent le paradigme de programmation impérative en introduisant leur propre notion de modules. OO les appelle objets (et classes) et leur permet d'encapsuler à la fois les données (champs) et les procédures (méthodes). SO, en revanche, sépare les données (enregistrements, beans, ...) du code (composants, services).
Cependant, seul OO possède des langages de programmation qui prennent en charge nativement son paradigme: Smalltalk, C ++, Java et tous les autres compatibles JVM, C # et tous les autres compatibles .NET, Python, etc.
SO n'a pas une telle langue maternelle. Il n'existe que par-dessus les langages procéduraux ou langages OO: COM / DCOM (binaire, C, C ++), CORBA, EJB, Spring, Guice (tout Java), ...
Ces frameworks SO souffrent clairement du manque de prise en charge en langue maternelle de leurs concepts.
- Ils commencent à utiliser des classes OO pour représenter des services et des enregistrements. Cela conduit à des conceptions où il existe une distinction claire entre les classes qui ont uniquement des méthodes (services) et celles qui ont uniquement des champs (enregistrements). L'héritage entre services ou enregistrements est ensuite simulé par héritage de classes. Techniquement, ce n'est pas gardé si strictement mais en général les programmeurs sont invités à faire des classes pour jouer seulement un des deux rôles.
- Ils utilisent des langages externes supplémentaires pour représenter les parties manquantes: IDL, configurations XML, annotations en code Java, ou même DSL intégré comme dans Guice. Cela est particulièrement nécessaire, mais sans s'y limiter, car la composition des services ne fait pas partie du code de service lui-même. Dans OO, les objets créent d'autres objets, il n'y a donc pas besoin de telles fonctionnalités, mais pour SO, c'est parce que les services n'instancient ni ne configurent d'autres services.
- Ils établissent un effet de plate-forme interne au-dessus d'OO (début EJB, CORBA) où le programmeur doit écrire tout le code nécessaire pour "piloter" SO. Les classes ne représentent qu'une partie de la nature d'un service et de nombreuses classes doivent être écrites pour former un service ensemble. Toute cette plaque de chaudière est nécessaire car il n'y a pas de compilateur SO qui le ferait pour le programmeur. C'est comme certaines personnes l'ont fait en C pour OO quand il n'y avait pas de C ++. Vous passez simplement l'enregistrement qui contient les données de l'objet comme premier paramètre à la procédure qui est la méthode. Dans un langage OO, ce paramètre est implicite et le compilateur produit tout le code dont nous avons besoin pour les fonctions virtuelles, etc. Pour SO, cela est clairement manquant.
- En particulier, les nouveaux cadres utilisent largement AOP ou introspection pour ajouter les parties manquantes à un langage OO. Cela n'apporte pas l'expressivité du langage nécessaire mais évite le code de la plateforme de la chaudière décrit au point précédent.
- Certains cadres utilisent la génération de code pour produire le code de plaque de chaudière. Les fichiers de configuration en XML ou les annotations en code OO en sont la source d'informations.
Tous les phénomènes que j'ai mentionnés ci-dessus ne peuvent pas être attribués à SO, mais j'espère que cela montre clairement qu'il existe un besoin pour un langage SO. Puisque ce paradigme est si populaire: pourquoi n'y en a-t-il pas? Ou peut-être y en a-t-il des universitaires, mais au moins l'industrie n'en utilise pas.