rails elaborando crear con apis ruby-on-rails design-patterns architecture dci

ruby-on-rails - elaborando - ruby on rails api rest



¿Qué es DCI y cómo puede encajar con Rails? (4)

Un debate reciente con un compañero de trabajo sobre diferentes enfoques para diseñar y codificar los modelos en una aplicación de Rails me trajo a través de DCI en el contexto de Rails .

Sin embargo, parece que no puedo comprender todo el concepto, incluso después de revisar esta aplicación de ejemplo .

Actualmente, tiendo a ir más o menos " por el libro " cuando escribo una aplicación de Rails.

Así que hay algunas cosas que me gustaría preguntar -

  • ¿Qué es DCI y cuáles son sus ventajas cuando se implementa junto con MVC sobre MVC antiguo (y ActiveRecord en Rails)?
  • ¿Y cómo se puede implementar en Rails (o, en otras palabras, con todos los módulos )?

Editar

Me gustaría ampliar aún más mi pregunta en el contexto de RoR: ¿se recomienda otro nivel de abstracción entre los modelos y los controladores en Rails? ¿Qué tan extendida está en aplicaciones de diferentes escalas?


En el corazón de DCI están las herramientas cognitivas que proporciona el desarrollador. No estoy seguro de si has visto todas las grandes conferencias de James Coplien / Trygve Reenskaug , pero intentaré extraer la esencia de esto para alguien nuevo en los conceptos. Se trata de mover el comportamiento del sistema fuera de los objetos del dominio que interactúan (las entidades de datos o lo que es el sistema), y de los objetos de comportamiento (lo que hace el sistema) como ciudadanos de primera clase que median la colaboración entre objetos al inyectarlos con funcionalidad. en el contexto de un caso de uso justo a tiempo.

Piense BDD. Codificamos el comportamiento no a través de muchos objetos, como partículas de funcionalidad distribuida por todos nuestros objetos de datos que están altamente acoplados a la capa de persistencia, sino dentro de objetos cohesivos que existen únicamente para un caso de uso (historia), y que inyectan capacidades en y coordinan Las interacciones de estos objetos de datos tontos. Al igual que las capas de una arquitectura física, los objetos de datos que cambian lentamente no se cargan con la implementación de características que cambian rápidamente y que llevan todo el tiempo. Más bien, Ruby nos brinda la capacidad de inyectar fácilmente el comportamiento en los objetos en tiempo de ejecución cuando sea necesario solo en el contexto de un caso de uso.

Como ejemplo en ROR, si tiene una acción de controlador involucrada en un caso de uso en el que hay una matriz de probabilidad de evento donde la mayoría de las entradas pueden activarse en solo un pequeño porcentaje de solicitudes, luego se crea una instancia de una red de objetos inflados de comportamiento pesado con el conocimiento para ejecutar cada evento para cada posible uso de los datos es innecesario. Además, no tener que revisar 18 archivos en mi editor de texto para comprender cómo funciona esa interacción en lugar de tener toda la lógica abstraída de los patrones en una interfaz provista por el objeto de contexto es también una ventaja definitiva.

Con respecto a su pregunta sobre "otra" capa de abstracción entre controladores y modelos en los rieles, no estoy seguro de a qué otro se refiere. En cualquier caso, sí. Por todos los medios. No hay problema. Los patrones de diseño y los principios SOLID Uncle Bobs son las mejores prácticas generalmente aceptadas en el diseño OO. Ambos fomentan fuertemente las abstracciones entre políticas e implementación. Ambos ayudan a evitar los volcados cerebrales catostróficos de la magnitud de demolición del imperio romano, porque proporcionan un marco común que todos entienden. DCI, para mí, proporciona el mismo tipo de marco cognitivo, pero para facilitar la comprensión y el tratamiento de un sistema, y ​​este es el Santo Grial para cualquier diseñador orientado a objetos.


Hay un libro (actualmente en progreso) sobre el uso de DCI en Ruby / Rails: book . Recomiendo que te pongas en la lista de notificaciones: he leído partes de este libro y se ve muy bien.

DCI está ganando aceptación en el mundo de Rails: ha habido una serie de publicaciones de blog interesantes al respecto durante los últimos 3 meses aproximadamente.


Para las personas que se preguntan qué significa DCI.

DCI significa Data Context Interaction


DCI es un paradigma y, por lo tanto, mucho más que una forma de diseñar una aplicación. Es una forma de pensar en modelar y estructurar código. Una de las partes importantes de DCI es mantener lo que el sistema es (el modelo de dominio) y lo que el sistema hace (funcionalidad) aparte. DCI no es un enfoque diferente para resolver el mismo problema que MVC, por lo que su primera pregunta no puede ser respondida. Puede usar MVC y DCI simultáneamente, lo cual no es una coincidencia ya que Trygve Renskaug es el padre de MVC y DCI. Recientemente respondió a una pregunta similar a esta en el grupo de google ''object-composition''.

El ejemplo al que se ha vinculado viola algunas de las ideas básicas, como mantener los roles privados en los contextos, y tampoco pude encontrar un solo contexto, pero eso podría deberse a que pasé poco tiempo explorando el código.

No sé RoR, por lo que no puedo darte un ejemplo de RoR, pero si vas a FullOO encontrarás ejemplos escritos en diferentes idiomas, incluyendo a Ruby y Marvin, el primer idioma diseñado para DCI.

EDITAR No existe una respuesta simple a la pregunta "¿Qué es DCI?" DCI es un paradigma, al igual que OOP es un paradigma. Ambos tienen las mismas raíces y responder a la pregunta anterior es tan complicado como responder "¿Qué es la programación orientada a objetos". Las cosas se complican aún más por el hecho de que DCI está orientada a objetos y la POO en todos los lenguajes OO principales en realidad está orientada a clases y no a objetos. DCI tiene como objetivo producir código donde la interacción entre objetos en tiempo de ejecución sea visible en el código en tiempo de compilación y, en términos más generales, intente hacer que sea más fácil razonar sobre el comportamiento del tiempo de ejecución al leer el código. El sitio al que he vinculado anteriormente está dedicado a explicar de qué se trata DCI y también muestra ejemplos en varios idiomas. Ruby siendo uno de ellos.

EDITAR Hay un book sobre ruby ​​y DCI en camino. El autor es bastante activo en la composición de objetos y perspicacia.