El espejismo de la separación por “capas”

Algo que comúnmente escucho en el círculo de desarrolladores (especialmente de .Net) es la frase “esto va en la capa de datos” o un “esta regla de negocio esta en la capa de negocio” y hasta un “mira, esta hecho pero aún no están bien separadas las capas”.

Esta palabrita, “capas”, es una de esas buzzwords de arquitectura microsoftica que nos han quedado grabadas en el cerebro, y que debido a que ha sido usada por tanto tiempo, ya la decimos instintivamente y hasta llegamos a creer que si un developer no habla en “capas” no es de respetar.

Comencemos a analizar lo que nos venden cuando hablamos de “capas”. Por lo general la terminología de capas se aplica a la típica arquitectura jerárquica de tres niveles, denotando responsabilidades diferentes y niveles de acceso variables en cada una de ellas, siendo la más conocida de todas la arquitectura de “tres capas”: Data Layer, Business Layer, Presentation Layer.

IC351011

Personalmente creo que este tipo de “ensamblaje” cobra bastante sentido si desarrollabas hace más de 5 años atrás, es decir, los ORM eran “escasamente” conocidos, los DataSet’s reinaban en el mundo de Ado.Net, los webservices no eran más que una extensión de la ASP.NET framework, el desarrollo en Windows y Web se limitaba en su gran extensión a arrastrar y soltar controles sobre un lienzo y crear un test era cosa de escribir en un papel y decirle a alguien que “probara la aplicación”… ¡ahhh, épocas lejanas aquellas! (bueno, creo que mucho de lo que menciono aquí aún esta presente en la lucha hasta el sol de hoy, pero ese es otro tema).

Actualmente muchos siguen desarrollando de esa manera, algunos han llevado esto aún más lejos y se han atrevido a hablar de arquitecturas de dos capas y hasta de n-capas… Hay libros, guías (como esta) y muchísimos posts en internet conversando de como usar Nhibernate o la Entity Framework en un entorno de n capas, como concurso, mientras más capas tenga tu aplicación, mayor será tu “mérito”.

He llegado a entender a aquellos defensores de las arquitecturas por capas, y en base a ello he formulado un conjunto de opciones por las cuales aún hablamos acerca de “capas”

  • Han tanta lógica en la base de datos que hay que distinguir las reglas embebidas en la base de datos de aquellas embebidas en cualquier otro lugar, por lo tanto, hablamos de las reglas de la “capa de datos”
  • La base de datos es mi salvador, por lo tanto debo separarla y distinguirla del resto de código “mortal” de la aplicación
  • La presentación de los datos es tan compleja, que bueno, el codebehind es inmenso y merece tener su propia “capa” debido al tamaño
  • Sigo usando DataSets o procedimientos almacenados que son leídos por DataReaders y al final debo manipularlos para sacar los datos de una factura, consumidor o lo que sea, por lo tanto tengo que distinguir esas responsabilidades en su propia “capsula”
  • No sé que rayos es un Tier y a falta de mejor palabra le llamo Layer

Como sea, pronto conversaremos de porqué el concepto de “capa” está un poco pasado de moda y las opciones que tenemos a la mano para reemplazar la ya vieja arquitectura por capas por una mucho más holística basada en modelos de comportamiento y responsabilidades modeladas a base del dominio y no por imaginación de un arquitecto.

Como siempre, estoy abierto a comentarios en la zona de comentarios, twitter, mail o cualquier otro medio por el cual esporádicamente puedan encontrarme.

¡Hasta la próxima!

This entry was posted in development and tagged , , , . Bookmark the permalink.
  • http://jgamba.myopenid.com/ Jorge Gamba

    Coincido contigo Cristian, ese diagrama clásico hace mucho daño, ya no aplica y si se toma como modelo conduce a varios errores de arquitectura e implementación.

    Por citar un caso, es claro que quien debe orientar todo es el dominio y por lo tanto este no debería tener dependencias sobre por ejemplo una tecnología de acceso a datos o un RDBMS específico, sin embargo, a eso es lo que conduce muchas veces esa estructura/arquitectura inapropiada.

  • http://jgamba.myopenid.com/ Jorge Gamba

    Coincido contigo Cristian, ese diagrama clásico hace mucho daño, ya no aplica y si se toma como modelo conduce a varios errores de arquitectura e implementación.

    Por citar un caso, es claro que quien debe orientar todo es el dominio y por lo tanto este no debería tener dependencias sobre por ejemplo una tecnología de acceso a datos o un RDBMS específico, sin embargo, a eso es lo que conduce muchas veces esa estructura/arquitectura inapropiada.

  • http://www.as-la.org Ignacio

    Increiblemente bien explicado, la verdad que hacia rato que no veia una posición tan clara respecto a esto!

  • http://www.as-la.org Ignacio

    Increiblemente bien explicado, la verdad que hacia rato que no veia una posición tan clara respecto a esto!

  • http://jgamba.myopenid.com/ Jorge Gamba

    Coincido contigo Cristian, ese diagrama clásico hace mucho daño, ya no aplica y si se toma como modelo conduce a varios errores de arquitectura e implementación.

    Por citar un caso, es claro que quien debe orientar todo es el dominio y por lo tanto este no debería tener dependencias sobre por ejemplo una tecnología de acceso a datos o un RDBMS específico, sin embargo, a eso es lo que conduce muchas veces esa estructura/arquitectura inapropiada.

  • Jose Luis Chavez del Cid

    No coincido en esto pues la separación de capas la tendrás siempre cuando separas tus “concerns”, si tu capa de acceso a datos es NHybernate, te da la separación del motor de RDBMS, al definir como se conectan aplicaciones externos a tu business layer, tenes los servicios de aplicación, tus servicios de dominio son tu business layer.

    Si NHybernate es tu capa de acceso a datos, te permite hacer una separación ideal de tu lógica de negocio de como se persiste, si usas MVC es la capa de presentación es una separación ideal, si a tus componentes de lógica de negocio, le creas servicios de aplicación para exponerlo a sistemas externos, ahí tenes otra capa, que pertenece al DDD pero tiene un lugar en tu arquitectura de capas.

    En lo que difiero del diagrama es consumir los servicios desde la capa de acceso a datos, eso debe ser consumible desde el business layer, y corresponde a los servicios de infraestructura que se consumen desde el modelo.

    No es que el concepto de capas este mal, si no la mayoría lo usan como la regla de que debe haber una clase para cada capa que haga todo, cuando en realidad son áreas donde debemos aplicar un patrón que satisfaga las necesidades especificas a esa capa.

    Antes de que se creara el Enterprise Library, por allá por el 2003, yo ya usaba los building blocks y en VS 2003 Architect contábamos con “policies” que reforzaban la separación de las clases en distintas DLLs, claro que limitaba a la creatividad y solución de casos específicos, por que no se podían agregar referencias al acceso a datos en presentación, pero es una buena medida a mi criterio. Al migrar a EL 1.1, entonces avanzamos a la separación del data provider, desde hace unos tres años aprovecho los “providers” para abstraer la implementación del repository, y desde hace un año cuento con mi propio ORM para el acceso a datos.

    A mi punto de vista, hemos avanzado hacia nuevas tendencias, pero son patrones para resolver las diferentes capas.

  • Jose Luis Chavez del Cid

    No coincido en esto pues la separación de capas la tendrás siempre cuando separas tus “concerns”, si tu capa de acceso a datos es NHybernate, te da la separación del motor de RDBMS, al definir como se conectan aplicaciones externos a tu business layer, tenes los servicios de aplicación, tus servicios de dominio son tu business layer.

    Si NHybernate es tu capa de acceso a datos, te permite hacer una separación ideal de tu lógica de negocio de como se persiste, si usas MVC es la capa de presentación es una separación ideal, si a tus componentes de lógica de negocio, le creas servicios de aplicación para exponerlo a sistemas externos, ahí tenes otra capa, que pertenece al DDD pero tiene un lugar en tu arquitectura de capas.

    En lo que difiero del diagrama es consumir los servicios desde la capa de acceso a datos, eso debe ser consumible desde el business layer, y corresponde a los servicios de infraestructura que se consumen desde el modelo.

    No es que el concepto de capas este mal, si no la mayoría lo usan como la regla de que debe haber una clase para cada capa que haga todo, cuando en realidad son áreas donde debemos aplicar un patrón que satisfaga las necesidades especificas a esa capa.

    Antes de que se creara el Enterprise Library, por allá por el 2003, yo ya usaba los building blocks y en VS 2003 Architect contábamos con “policies” que reforzaban la separación de las clases en distintas DLLs, claro que limitaba a la creatividad y solución de casos específicos, por que no se podían agregar referencias al acceso a datos en presentación, pero es una buena medida a mi criterio. Al migrar a EL 1.1, entonces avanzamos a la separación del data provider, desde hace unos tres años aprovecho los “providers” para abstraer la implementación del repository, y desde hace un año cuento con mi propio ORM para el acceso a datos.

    A mi punto de vista, hemos avanzado hacia nuevas tendencias, pero son patrones para resolver las diferentes capas.

    • http://www.cprieto.com cprieto

      Espera el segundo post… Necesito sacar tiempo… :)

  • http://www.as-la.org Ignacio

    Increiblemente bien explicado, la verdad que hacia rato que no veia una posición tan clara respecto a esto!

  • Jose Luis Chavez del Cid

    No coincido en esto pues la separación de capas la tendrás siempre cuando separas tus “concerns”, si tu capa de acceso a datos es NHybernate, te da la separación del motor de RDBMS, al definir como se conectan aplicaciones externos a tu business layer, tenes los servicios de aplicación, tus servicios de dominio son tu business layer.

    Si NHybernate es tu capa de acceso a datos, te permite hacer una separación ideal de tu lógica de negocio de como se persiste, si usas MVC es la capa de presentación es una separación ideal, si a tus componentes de lógica de negocio, le creas servicios de aplicación para exponerlo a sistemas externos, ahí tenes otra capa, que pertenece al DDD pero tiene un lugar en tu arquitectura de capas.

    En lo que difiero del diagrama es consumir los servicios desde la capa de acceso a datos, eso debe ser consumible desde el business layer, y corresponde a los servicios de infraestructura que se consumen desde el modelo.

    No es que el concepto de capas este mal, si no la mayoría lo usan como la regla de que debe haber una clase para cada capa que haga todo, cuando en realidad son áreas donde debemos aplicar un patrón que satisfaga las necesidades especificas a esa capa.

    Antes de que se creara el Enterprise Library, por allá por el 2003, yo ya usaba los building blocks y en VS 2003 Architect contábamos con “policies” que reforzaban la separación de las clases en distintas DLLs, claro que limitaba a la creatividad y solución de casos específicos, por que no se podían agregar referencias al acceso a datos en presentación, pero es una buena medida a mi criterio. Al migrar a EL 1.1, entonces avanzamos a la separación del data provider, desde hace unos tres años aprovecho los “providers” para abstraer la implementación del repository, y desde hace un año cuento con mi propio ORM para el acceso a datos.

    A mi punto de vista, hemos avanzado hacia nuevas tendencias, pero son patrones para resolver las diferentes capas.

  • Armando

    Con todo respeto, inicie leyendo el tema esperando que me dieran razones para no usarla y ver que esta forma de programar en capa era perjudicial o tenia debilidades y existian otras opciones, pero solo llegue a la conclusión que a ti no te gusta el modelo en capas. Y lo mas extraño es que en los post de abajo te apoyan.

  • Armando

    Con todo respeto, inicie leyendo el tema esperando que me dieran razones para no usarla y ver que esta forma de programar en capa era perjudicial o tenia debilidades y existian otras opciones, pero solo llegue a la conclusión que a ti no te gusta el modelo en capas. Y lo mas extraño es que en los post de abajo te apoyan.

    • http://www.cprieto.com cprieto

      Gracias por tu comentario Armando,

      Realmente si hay razones por las cuales el modelo por “capas” es marcado como obsoleto, claro, además de ser impráctico cuando hablamos de aplicaciones con fuerte énfasis en comportamiento y lógica de negocio. ¿La explicación? bueno, la tenía pensada para una segunda parte de este post, el cual al parecer tendré que terminar explicando.

      Saludos, y nuevamente gracias!

  • Armando

    Con todo respeto, inicie leyendo el tema esperando que me dieran razones para no usarla y ver que esta forma de programar en capa era perjudicial o tenia debilidades y existian otras opciones, pero solo llegue a la conclusión que a ti no te gusta el modelo en capas. Y lo mas extraño es que en los post de abajo te apoyan.

  • http://www.cprieto.com cprieto

    Espera el segundo post… Necesito sacar tiempo… :)

  • http://www.cprieto.com cprieto

    Gracias por tu comentario Armando,

    Realmente si hay razones por las cuales el modelo por “capas” es marcado como obsoleto, claro, además de ser impráctico cuando hablamos de aplicaciones con fuerte énfasis en comportamiento y lógica de negocio. ¿La explicación? bueno, la tenía pensada para una segunda parte de este post, el cual al parecer tendré que terminar explicando.

    Saludos, y nuevamente gracias!

  • http://www.cprieto.com cprieto

    Gracias por tu comentario Armando,

    Realmente si hay razones por las cuales el modelo por “capas” es marcado como obsoleto, claro, además de ser impráctico cuando hablamos de aplicaciones con fuerte énfasis en comportamiento y lógica de negocio. ¿La explicación? bueno, la tenía pensada para una segunda parte de este post, el cual al parecer tendré que terminar explicando.

    Saludos, y nuevamente gracias!

  • http://www.cprieto.com cprieto

    Espera el segundo post… Necesito sacar tiempo… :)

  • Estuardo

    Buen dia,
    Comparto el hecho que la programacion en capas es anticuado y laborioso. Pero como dices, es necesario que escribas el desenalce de este post para digerirlo completamente y asi poder entenderlo.

  • Estuardo

    Buen dia,
    Comparto el hecho que la programacion en capas es anticuado y laborioso. Pero como dices, es necesario que escribas el desenalce de este post para digerirlo completamente y asi poder entenderlo.

  • Estuardo

    Buen dia,
    Comparto el hecho que la programacion en capas es anticuado y laborioso. Pero como dices, es necesario que escribas el desenalce de este post para digerirlo completamente y asi poder entenderlo.

  • Ricardo

    …Bueno me quede con la duda de en que terminaba este post, pero no has escrito la continuación verdad? Lo que si es cierto es que el developer que tiene en mente separar los conceptos de UI, Logic, Entities y Data hay que darle ya un merito… distinto al otro que todo lo mete en todo el query lo crea en la UI, ahi valida y por supuesto que no hay Entitie pero si un heavy weigth DataSet, pero haber como termina el post…

  • Ricardo

    …Bueno me quede con la duda de en que terminaba este post, pero no has escrito la continuación verdad? Lo que si es cierto es que el developer que tiene en mente separar los conceptos de UI, Logic, Entities y Data hay que darle ya un merito… distinto al otro que todo lo mete en todo el query lo crea en la UI, ahi valida y por supuesto que no hay Entitie pero si un heavy weigth DataSet, pero haber como termina el post…

  • Ricardo

    …Bueno me quede con la duda de en que terminaba este post, pero no has escrito la continuación verdad? Lo que si es cierto es que el developer que tiene en mente separar los conceptos de UI, Logic, Entities y Data hay que darle ya un merito… distinto al otro que todo lo mete en todo el query lo crea en la UI, ahi valida y por supuesto que no hay Entitie pero si un heavy weigth DataSet, pero haber como termina el post…

  • Pingback: El espejismo de la separacion por capas, toma dos | IDisposable Thoughts