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.
fuente
Respuestas:
Porque <5% del código en realidad está definiendo un servicio, y yo diría que una cantidad de tiempo sustancialmente menor. Una vez que se define la interfaz, se realiza en gran medida. El resto del tiempo se gasta en OO (o alternativas) haciendo que las cosas funcionen .
En pocas palabras, no es una gran victoria hacer un lenguaje especializado para esa pequeña porción del problema. En todo caso, tener dos idiomas (uno para el servicio y otro para la implementación / consumo) es solo pedir una mayor complejidad de integración.
[editar para la aclaración de los OP de que es el diseño interno de la aplicación, no el límite de la aplicación]
El objetivo principal de tener un diseño de servicio de este tipo es tener puntos de contacto delgados entre los servicios. Mi razón original aún se mantiene (imo) y agrego a esa respuesta el hecho de que relativamente pocos problemas se adaptan bien a una estructura de aplicación interna basada en el servicio. Entonces, no solo está abordando una pequeña porción del problema, sino un menor porcentaje de problemas en general.
fuente
Los lenguajes funcionales están muy orientados al servicio en su núcleo. En lugar de crear objetos y llamar funciones a ellos, crea funciones y les pasa mensajes. Erlang es un excelente ejemplo de esta técnica porque incluso más allá de los aspectos funcionales del lenguaje, tiene comunicación entre procesos e incluso entre máquinas integrada en su marco central que le permite enviar mensajes a un proceso remoto como si fuera un proceso local. .
Otros lenguajes como Scala, Clojure y F # también proporcionan una semántica "orientada al servicio". El problema no es que no existan, es que la población general les tiene miedo y, por lo tanto, no son tan populares.
fuente
La orientación del servicio fue / es una respuesta arquitectónica a los problemas de integración. Idealmente, la integración es una solución integral que se adapta a cualquier idioma, producto, dispositivo o recurso existente en una imagen más amplia.
No hay necesidad de un nuevo lenguaje, ya que el problema es tener demasiados idiomas , lo que causa un alto costo de interoperabilidad.
Sin embargo, se introdujo un tipo de lenguaje, el lenguaje de definición del servicio web. WSDL es metalenguaje de SOA (y hay otro abandonado para REST llamado WADL)
fuente
Daré la vuelta a la pregunta y preguntaré "¿cómo sería un lenguaje SO?"
¿Cómo se escribirían esos contratos entre módulos?
¿Cómo se ejecutaría la mecánica fundamental de la operación?
Los servicios orientados son una propiedad de la aplicación, no necesariamente el lenguaje utilizado. El servicio es una construcción que se basa en una función. La función es una construcción que se basa en la mecánica de un lenguaje de programación para traducir la operación en instrucciones ejecutables de la máquina.
BPEL es un posible ejemplo de un lenguaje SO, pero tiene un nivel muy alto y se basa en módulos disponibles para su uso. Esos módulos a su vez están escritos en idiomas que no son BPEL para que el trabajo pueda realizarse (también conocido como traducido al lenguaje de máquina).
Gran Q y me dio un buen momento de reflexión.
fuente
Ofreceré una respuesta a mi propia pregunta para ver cuántas personas están de acuerdo y en desacuerdo.
Algunas posibilidades:
Parece difícil construir un lenguaje SO. Principalmente debido a la separación de la implementación de los servicios y su composición. Hay un par de soluciones académicas de las que he oído hablar en la universidad (sin referencia, lo siento), pero no parece que lleguen a la industria. Pero cuento esto como una excusa, no una razón real. Los lenguajes y compiladores OO también son bastante difíciles de implementar, sin embargo, hay soluciones en el mercado desde hace mucho tiempo.
Los programadores usan lenguajes OO para SO porque no entienden OO y lo usan de manera incorrecta. Digo mal porque hay dos conceptos fundamentales en OO que contradicen SO:
La funcionalidad va a la clase donde se encuentran los datos en los que trabajan. El código y los datos se juntan en el mismo módulo. No es estilo OO tener clases separadas que funcionen con los datos de otras clases. Ese es el enfoque de Herramientas y materiales (WAM) de Züllighofen que coincide con el paradigma SO.
Los objetos crean otros objetos y forman redes de objetos. Pueden crear jerarquías o cualquier relación compleja. Los servicios siempre forman redes planas que se componen desde el exterior. Los servicios generalmente tienen solo una instancia (Singleton), mientras que los objetos se instancian con la frecuencia que existe la entidad que representan. Los registros en SO no están conectados en redes.
Algunas características de OO se parecen a SO, o se pueden usar para facilitar lo que se necesita para SO, por lo que resulta útil usar un lenguaje OO.
El principio de inversión de dependencia en OO es similar a la forma en que los servicios se componen externamente.
Los objetos Singleton son como servicios, las fábricas de objetos son como localizadores de servicios.
OO también tiene interfaces que son similares a las interfaces de servicio.
La herencia de clases puede ser similar (¿igual?) Que la herencia de servicios y registros.
OO y SO son útiles para diferentes tipos de problemas. Por lo tanto, en todas las aplicaciones es tentador usar cualquier paradigma aquí o allá. Tener un idioma separado dificultaría el cambio entre los dos dentro del mismo programa.
SO no es solo un paradigma de programación sino también un comportamiento de programa: los servicios web, los componentes del sistema operativo, etc. son SO pero no necesitan estar escritos en un lenguaje SO necesariamente. Este tipo de "componentes binarios" es muy natural y exitoso. Pero es una cosa diferente: es cómo los programas se comunican entre sí, no cómo se comunica internamente el programa. Supongo que la gente lo mezcla a menudo.
fuente