Editar:
Para evitar mais confusão: Estou não falando de serviços web e tal. Estou falando de estruturar aplicativos internamente, não é sobre como os computadores se comunicam. É sobre linguagens de programação, compiladores e como o paradigma de programação imperativa é estendido.
Original:
No campo da programação imperativa, vimos dois paradigmas nos últimos 20 anos (ou mais): orientado a objetos (OO) e orientado a serviços (SO). baseado em componentes (CB).
Ambos os paradigmas estendem o paradigma imperativo de programação, introduzindo sua própria noção de módulos. OO os chama de objetos (e classes) e permite que eles encapsulem dados (campos) e procedimentos (métodos) juntos. O SO, por outro lado, separa os dados (registros, beans, ...) do código (componentes, serviços).
No entanto, apenas o OO possui linguagens de programação que suportam nativamente seu paradigma: Smalltalk, C ++, Java e todos os outros compatíveis com JVM, C # e todos os outros compatíveis com .NET, Python etc.
SO não possui esse idioma nativo. Ele só existe em cima de linguagens procedurais ou linguagens OO: COM / DCOM (binário, C, C ++), CORBA, EJB, Spring, Guice (todo Java), ...
Essas estruturas SO sofrem claramente da falta de suporte à linguagem nativa de seus conceitos.
- Eles começam a usar classes OO para representar serviços e registros. Isso leva a designs nos quais há uma clara distinção entre classes que possuem apenas métodos (serviços) e aquelas que possuem apenas campos (registros). A herança entre serviços ou registros é simulada pela herança de classes. Tecnicamente, não é mantido tão rigorosamente, mas em geral os programadores são aconselhados a fazer aulas para desempenhar apenas um dos dois papéis.
- Eles usam linguagens externas adicionais para representar as partes ausentes: IDLs, configurações XML, anotações no código Java ou mesmo DSL incorporado, como no Guice. Isso é especialmente necessário, mas não limitado a, pois a composição dos serviços não faz parte do próprio código de serviço. No OO, os objetos criam outros objetos, portanto não há necessidade de tais instalações, mas no SO existe porque os serviços não instanciam ou configuram outros serviços.
- Eles estabelecem um efeito de plataforma interna sobre o OO (EJB, CORBA), onde o programador deve escrever todo o código necessário para "dirigir" o SO. As classes representam apenas uma parte da natureza de um serviço e muitas classes precisam ser escritas para formar um serviço juntos. Toda essa placa da caldeira é necessária porque não existe um compilador SO que o faça para o programador. É como algumas pessoas fizeram em C para OO quando não havia C ++. Você apenas passa o registro que contém os dados do objeto como primeiro parâmetro para o procedimento que é o método. Em uma linguagem OO, esse parâmetro está implícito e o compilador produz todo o código que precisamos para funções virtuais etc. Para SO, isso está claramente ausente.
- Especialmente, as estruturas mais recentes usam extensivamente AOP ou introspecção para adicionar as partes ausentes a uma linguagem OO. Isso não traz a expressividade necessária do idioma, mas evita o código da plataforma da caldeira descrito no ponto anterior.
- Algumas estruturas usam a geração de código para produzir o código da placa da caldeira. Arquivos de configuração em XML ou anotações no código OO são a fonte de informações para isso.
Nem todos os fenômenos que mencionei acima podem ser atribuídos ao SO, mas espero que mostre claramente que há uma necessidade de uma linguagem SO. Como esse paradigma é tão popular: por que não existe um? Ou talvez existam alguns acadêmicos, mas pelo menos a indústria não usa um.