Editar:
Para evitar la confusión adicional: estoy no hablando de servicios web y tal. Estoy hablando de estructurar aplicaciones internamente, no se trata de cómo se comunican las computadoras. Se trata de lenguajes de programación, compiladores y cómo se extiende el paradigma de programación imperativo.
Original:
En el campo de la programación imperativa, vimos dos paradigmas en los últimos 20 años (o más): orientado a objetos (OO) y orientado a servicios (SO) aka. basado en componentes (CB).
Ambos paradigmas extienden el paradigma de programación imperativa al introducir su propia noción de módulos. OO los llama objetos (y clases) y les permite encapsular datos (campos) y procedimientos (métodos) juntos. SO, por el contrario, separa los datos (registros, beans, ...) del código (componentes, servicios).
Sin embargo, solo OO tiene lenguajes de programación que soportan de forma nativa su paradigma: Smalltalk, C ++, Java y todos los demás compatibles con JVM, C # y todos los demás .NET compatibles, Python, etc.
SO no tiene tal idioma nativo. Solo llega a existir sobre lenguajes de procedimiento o lenguajes OO: COM / DCOM (binario, C, C ++), CORBA, EJB, Spring, Guice (todo Java), ...
Estos marcos SO claramente sufren de la falta de soporte de sus conceptos en el idioma nativo.
- Comienzan a usar clases OO para representar servicios y registros. Esto conduce a diseños en los que existe una clara distinción entre las clases que solo tienen métodos (servicios) y las que solo tienen campos (registros). La herencia entre servicios o registros se simula luego mediante la herencia de clases. Técnicamente, no se mantiene de manera tan estricta, pero en general se recomienda a los programadores que hagan clases para desempeñar solo uno de los dos roles.
- Utilizan lenguajes externos adicionales para representar las partes que faltan: IDL, configuraciones XML, anotaciones en código Java o incluso DSL incrustado como en Guice. Esto es especialmente necesario, pero no limitado a, ya que la composición de los servicios no es parte del código de servicio en sí. En OO, los objetos crean otros objetos, por lo que no hay necesidad de tales instalaciones, pero sí lo hay porque los servicios no crean instancias ni configuran otros servicios.
- Establecen un efecto de plataforma interna sobre OO (principios de EJB, CORBA) donde el programador tiene que escribir todo el código que se necesita para "conducir" SO. Las clases representan solo una parte de la naturaleza de un servicio y muchas clases tienen que escribirse para formar un servicio juntos. Toda esa placa de caldera es necesaria porque no hay un compilador SO que lo haga por el programador. Esto es como algunas personas lo hicieron en C para OO cuando no había C ++. Simplemente pasa el registro que contiene los datos del objeto como primer parámetro al procedimiento que es el método. En un lenguaje OO, este parámetro es implícito y el compilador produce todo el código que necesitamos para funciones virtuales, etc. Para SO, esto claramente falta.
- Especialmente los marcos más nuevos utilizan ampliamente AOP o introspección para agregar las partes faltantes a un lenguaje OO. Esto no brinda la expresividad del lenguaje necesaria, pero evita el código de la plataforma de calderas descrito en el punto anterior.
- Algunos marcos utilizan la generación de código para producir el código de la placa de la caldera. Los archivos de configuración en XML o las anotaciones en código OO son la fuente de información para esto.
No todos los fenómenos que mencioné anteriormente se pueden atribuir a SO, pero espero que muestre claramente que existe la necesidad de un lenguaje SO. Dado que este paradigma es tan popular: ¿por qué no hay uno? O tal vez hay algunos académicos, pero al menos la industria no usa uno.