ASP.NET MVC y otras Yerbas – Parte 4

Sin más que decir volvamos a la acción:

Para una mejor calidad también podemos verlo en HD.

A continuación tenemos una explicación de algunas de las cosas que hemos visto:

  • ¿Cuál es la estructura de un test? Un Test tiene comúnmente la siguiente estructura:
    • Arrange: Creamos todas las precondiciones y entradas necesarias.
    • Act: Realizamos la acción en el objeto que estamos probando.
    • Assert: Verificamos que los resultados que esperamos se han producido.

  • ¿Qué es lo primero que hacemos para agregar alguna funcionalidad? Sin duda alguna, lo primero es realizar el Test.

  • ¿Cómo nombramos al Test? Tener un estándar para los nombres de los test resulta importante ya que nos brinda un descripción entendible por propios y extraños sobre lo que realiza el test. Recuerden los Test son Documentación. La convención de nombre Método_Escenario_ComportamientoEsperado nos ayuda bastante a lograr lo anteriormente mencionado.

  • ¿Qué es lo que probamos primero? De todas las opciones que tenemos, probamos la más simple, pero que cree funcionalidad real o valor.

    Se acuerdan del Kata de Números Primos, la primera prueba que realizamos fue verificar que el número 1 nos devolvía una lista vacía. No comenzamos probando que el número 9 nos devolviera 2 primos, ni tampoco que un número menor a uno 1 arrojara una excepción.

    Pero, ¿porqué comenzamos con la más simple?… Imaginen que hubiéramos comenzado probando cuales son los números primos de 9, la cantidad de código escrito habría sido mucho mayor en relación a una prueba de los números primos de 1 y por lo tanto habría transcurrido mucho más tiempo en completarse el ciclo de TDD ( Red – Green – Refactor) y en obtener el feedback que nos aporta el mismo.

    Espérate un momento!, en el video no todas las pruebas han comenzado con la opción más simple….Tomemos como ejemplo un método que suma 2 números (x, y), entonces según lo dicho anteriormente el camino más simple sería crear un test que verifique 0+0=0 y en el código de producción retornamos 0, nuestro siguiente test podría ser que 1+0=1 y en el código de producción retornamos x, por ultimo probar que 2+1=3 y en el código retornamos x+y. (este camino se parece bastante a nuestro Kata verdad). Pero creo que todos sabemos que la implementación a un método de suma es x+y. Entonces en estos casos donde la implementación es un poco obvia, no tenemos que pedir permiso a varios test para poder escribir el código de producción.

    Algo parecido sucede en nuestro ejemplo, ya que de alguna manera se tiene una noción de como los servicios y repositorios interactúan juntos; de igual manera, tampoco nos preocupamos de temas más complejos como validaciones ni reglas de negocios. Por lo tanto nos sentimos con cierto nivel de confianza para dar pasos ligeramente más grandes pero de manera muy rápida.

    Como sabemos que podemos optar por esto, una pista muy simple la encontramos al escribir el test, si en ese momento nos ponemos a pensar mucho en los detalles (nombre, entradas, salidas) es una señal de que la implementación no es tan simple como parece. Asimismo si nos sentimos seguros de dar pasos más grandes y observamos que los test se rompen muy seguido, quizás debamos hacer pasos más pequeños.

  • ¿Qué es lo primero que escribimos en el test? De abajo para arriba, lo primero es el Assert. Esta es una práctica que he encontrado muy útil, ya que al realizar el test, nuestro cerebro  se pone a pensar muchas cosas al mismo tiempo: ¿cómo nombramos los elementos?, ¿cómo lo voy a verificar?, ¿qué me sugieren hacer los otros test?, etc.

    Entonces al realizar el Assert primero, aislamos uno de los problemas del resto: ¿cómo lo voy a verificar?, y en base a esto construimos el resto del test:

    • ¿Cómo lo voy a verificar? Probando que se llame al método Agregar del Repositorio.
    • ¿Dónde se llama al método Agregar? Desde el método Registrar de la clase AdministrarEmpresa.
    • ¿Qué se requiere para llamar al método Registrar? Pasarle un objeto Empresa.

    Está práctica junto con la anterior convención de nombres son una combinación muy buena. Asimismo te permite aprovechar bastante las herramientas que te otorga el entorno de desarrollo (Resharper Rulz!).


  • Volvamos por un momento al post anterior, ahí hemos observado el uso de tests para construir una clase que no depende internamente de ninguna otra.

    image 

    Pero en la cruel realidad no todo es tan bonito y simple. Las clases dentro de nuestras aplicaciones tienen dependencias para poder funcionar (bases de datos, web services, etc)

    image

    Y esto se pone peor, ya que esas dependencias tienen también sus dependencias, y estas dependencias tienen más dependencias y así sucesivamente. Entonces crear un test puede parecer que se vuelve en una tarea complejísima y posiblemente imposible.

    ¿Cuál es la solución? Eliminar esas dependencias, pero sin esas dependencias nuestra clase no va a funcionar, reemplacemos esas dependencias por algo más simple; y como hacemos para que la clase utilice esas nuevas dependencias, hagamos que el test sea quien controle esas dependencias:

    image

    Aquí es donde entran los famosos Test Doubles (“Generic term for any kind of pretend object used in place of a real object for testing purposes” – Martin Fowler ).

    En nuestro ejemplo hemos usado 2 Test Doubles (Other Simple Class), esto debido a que necesitamos probar nuestras clases RegistrarEmpresa (Class Under Test) y ReclutarPersonal (Class Under Test), y ambas clases dependen de un implementación de IEmpresaRepository (Other Class) para persistir la información.

    Estos Test Doubles los podemos identificar fácilmente ya que son los objetos que tienen los nombres más raros de todo el ejemplo: mockEmpresaRepository y stubEmpresaRepository.

    Pero, ¿porqué uno se llama mock y el otro stub ? Para darnos cuenta entre la diferencia que tienen, podríamos definirlos de manera muy simple:

    • Mock: Es el Test Double sobre el cuál realizamos un Assert. Ejm:
      mockEmpresaRepository.AssertWasCalled(x => x.Agregar(empresa));
      Estamos verificamos que el método Agregar del IEmpresaRepository se ha llamado dentro del método que estamos probando.

    • Stub: Es el Test Double que nos permite poder realizar el test. Ejm:
      stubEmpresaRepository.Expect(x => x.Obtener(idEmpresa)).Return(empresa);
      Estamos indicando que cuando se llame el método Obtener del IEmpresaRepository nos devuelva una empresa cualquiera y así la prueba del método pueda continuar.

Bueno, hasta aquí hemos visto algunos temas del video, pero aún nos falta otros que dejaremos para un siguiente post. Espero les sirva de algo mi pequeño granito de arena. Y les prometo mejorar mi redacción.

No se olviden de ver el resto de las serie ASP.NET MVC y otras Yerbas.
Saludos.

ASP.NET MVC y otras Yerbas – Parte 3

Después de buscar un programa decente para grabar diferente a Camtasia (al final terminé con Camtasia), descubrir que mi tarjeta de video no graba sonidos, 4 intentos para grabar el KATA, varias decenas de intentos tratando de subir del video a Viddler con buena calidad, al fin esta listo xD.

Antes que nada ¿Qué es un KATA?....

Como lo explica el gran Robert Martín (Uncle Bob) en un extracto de su artículo:

The idea was simple: Professionals practice.

This thought might not have occurred to you before; but it’s self-evidently true. Professional musicians practice. Professional dancers practice. Doctors practice. Soldiers practice. Indeed, any kind of professional craftsman or artisan must practice their adopted trade in order to execute it well when it counts.

Dave’s point was that professional programmers need to practice like any other professional. He set forth a number of simple exercises and problems that programmers could solve during their practice time. He also suggested that practice time needs to be scheduled and protected as part of the normal routine of a software developer.

El siguiente video es un KATA para encontrar los primos de un número cualquiera, sin más palabras que decir ahí les va el video:

Para una mejor calidad, míralo en HD aquí.

En el siguiente post tendremos TDD pero sobre nuestra aplicación de ejemplo, mientras tanto seguiré intentando subir el próximo video T_T. Nos vemos.

No se olviden de ver el resto de las serie ASP.NET MVC y otras Yerbas.
Saludos.

Presentación Principios Ágiles y Scrum

Después de un largo tiempo dando soporte a un cliente, regreso un mañana a la empresa y recibo la sorpresa de que tenía que realizar una breve exposición por la tarde sobre Metodologías Ágiles. Al final terminé dándole un enfoque ligeramente diferente. Ahí les va los slides:

ASP.NET MVC y otras Yerbas – Parte 2

En esta segunda parte vamos a ver el diseño e implementación del modelo de negocio, con lo cual seguiremos viendo conceptos de DDD; pero también agregaremos uno nuevo a nuestra creciente lista de términos raros, este es el “revolucionario” TDD (Test Driven Development).

Primero tendremos una pequeña introducción para entender cuales fueron los fundamentos que impulsaron la creación y expansión de TDD, y luego pasaremos a dar unas pequeñas definiciones.

El Problema

Los errores (bugs) que se producen dentro de una aplicación se podrían clasificar en 3 tipos:

  • Lógicos: A lejos son los errores más comunes y típicos, estos se encuentran dentro de los “if”s, “for”s y código similar dentro de la aplicación.
  • Funcionales: Estos se producen debido a una interacción incorrecta entre dos o más objetos, dicho de otra manera cuando el resultado de un objeto no es el esperado como entrada para un segundo objeto.
  • Gráficos: Cuando los datos mostrados sobre una interfaz gráfica no son los correctos: texto cortado, datos incompletos o inclusive cuando no se ve bien ( ¿Cómo es verse bien?).

Cuando hablamos de estos 3 tipos de errores es importante tomar en cuenta la frecuencia en la que se encuentran dentro de nuestras aplicaciones:

Frecuencia Aparición de los Errores

Pero no solo su frecuencia, sino también el costo que tiene encontrarlos y corregirlos:

Tabla Comparativa Errores

Los errores lógicos son claramente los más difíciles de encontrar, debido a que estos se presentan como consecuencia de un correcto número de entradas y condiciones, y encontrar ese mágico número de entradas hace que esta tarea sea difícil; asimismo para dar un solución se necesita entender todo el código que rodea el problema y que esta a su vez no cause errores en otras partes de la aplicación.

En este punto nos damos cuenta la verdadera importancia que tiene contar con medios que minimicen la frecuencia en la que se producen estos errores, no solo los lógicos sino también los funcionales y gráficos, y que estos medios también permitan encontrar y solucionar los errores de una manera efectiva.

Por otro lado, muchas veces se entiende que el proceso sobre el cual se implementa una aplicación involucra dos tareas bien definidas: desarrollar la aplicación por los ingenieros de software y realizar las pruebas manuales por las personas de QA.

Lo que normalmente se produce durante el desarrollo de estas tareas es que al encontrar un error durante las pruebas, se devuelve la aplicación a las personas de desarrollo para que corrijan los errores, para luego pasarla nuevamente a las personas de QA, para que revisen nuevamente de forma manual toda la aplicación ya que funcionalidad existente se ha podido ver afectada por los cambios realizados.

Los problemas que normalmente encontramos durante este ciclo son:

  • Se pierde mucho tiempo en buscar y corregir errores en las etapas finales de un proyecto.
  • Realizar pruebas manuales de toda la aplicación aumenta aún más el tiempo de búsqueda de errores; esta tarea se puede realizar múltiples veces durante el proyecto, por lo que se vuelve en algo tedioso, aburrido y se deja muchas veces de lado, lo cual contribuye a pasar errores a producción.
  • Por la necesidad de disminuir el tiempo y el trabajo se intenta automatizar las pruebas mediante algún tipo de herramienta casi “mágica”, ya que el diseño de la aplicación podría no estar preparado para una automatización, lo cuál lleva en muchos casos a una tarea casi imposible, con problemas y sin beneficios reales.

Para solucionar estos problemas necesitamos contar con un medio que nos permita encontrar errores desde etapas tempranas del proyecto, asimismo debe poderse realizar de manera rápida y repetitiva.

La Solución

Creo que se imaginan cual es la solución que el post pretende mostrar, pero en realidad son 3 soluciones: Unit Testing, TDD and Refactoring. Los tres significan cosas diferentes, tienen beneficios diferentes y problemas diferentes que pretenden resolver. A estas alturas puede ser todavía un poco confuso pero vamos a ver las diferencias entre estos:

Unit Testing

“A unit test is a piece of a code (usually a method) that invokes another piece of code and checks the correctness of some assumptions afterward. If the assumptions turn out to be wrong, the unit test has failed.” (Roy Osherove – The Art of Unit Testing with Examples in .NET)

Ejm:

public bool UsuarioValido(string usuario,string password)
{
        if(usuario=="juan" && password=="1234")
              return true;
         else
              return false;
}

Imaginemos que tenemos el código anterior en nuestra aplicación, entonces por lo menos se necesitaría 2 pruebas lógicas para verificar que el método es válido ( una prueba donde se ingresen los datos correctos verificando que nos devuelva verdadero y otra con los datos incorrectos verificando que nos devuelva falso).

Algunas de las características de un buen unit test son:

  • Son automatizados: cualquier tarea en la cual se tenga que realizar alguna configuración o un proceso tedioso, es muy probable que se deje de hacer; es por esto la necesidad de tener test automatizados, para que estos se puedan realizar de manera repetitiva por todos los miembros del equipo.
  • Se pueden realizar en cualquier momento del tiempo: esto permite observar que cualquier modificación que se realice al código, durante o mucho después de su desarrollo, devuelve los resultados correctos y a la vez indica si no se ha alterado algo ya existente. Con esto podemos mejorar constantemente el código y agregar nueva funcionalidad sin ninguna clase de miedo.
  • Se ejecutan en pocos segundos: los test unitarios buscan probar pequeñas partes lógicas de código y no el funcionamiento de recursos externos como base de datos u otros, por lo tanto estos devuelven resultados rápidamente lo que facilita su ejecución constante.
  • Son entendibles: cuando nos entregan una gran documentación y un apéndice con ejemplos, ¿Qué es lo que primero vemos?, los ejemplos por supuesto. Los unit test son exactamente eso: “documentación” ya que nos permiten observar que es lo que hace realmente la aplicación y como son código es lo que prefieren ver los ingenieros de software para conocer el sistema.
  • Son fáciles de desarrollar: hace algún tiempo un jefe de proyecto, con cara de preocupación, me dijo: “Entonces se escribe el doble de código!!”….Pues SI, como vimos anteriormente para un simple método que valida un usuario se necesitan 2 pruebas lógicas, esto  hace que el código total(producción+pruebas) aumente considerablemente. Pero lo que el JP no sabía es que existen diferencias claras entre el tiempo y dificultad que toma hacer un test y el que toma realizar el código de producción, esta diferencia es muy grande, en relación 1:10 como lo muestra el siguiente artículo
    De todas formas igual existe un pequeño tiempo adicional, pero consideremos este tiempo como una inversión a corto y largo plazo, ya que ahorraremos mucho tiempo al no levantar toda la aplicación y probar manualmente, disminuiremos el tiempo de uso del debug, menos tiempo al corregir y encontrar errores, menos tiempo al realizar pruebas de regresión, etc.

TDD

Se le atribuyen muchas definiciones a TDD: hacer las pruebas primero, tener muchas pruebas, crear una aplicación en base a pruebas desde cero (sin arquitectura previa ni ningún otro diseño anterior);  pero la mejor definición de TDD es una combinación de las anteriores “TDD es escribir las pruebas primero y dejar que estas guíen o modifiquen el diseño, sin necesariamente comenzar desde cero”.

Para dejar bien en claro la definición: “TDD is not about testing, it´s about design

Pero por que se dice que TDD ayuda al diseño: esto se debe a que la presencia de los test nos obligan a pensar que la aplicación ya no es la única que va a utilizar el código sino este también va a ser utilizado por lo test, lo que nos lleva a tener que desacoplar debidamente las clases, separar sus responsabilidades, usar patrones, etc, en general mejorar el diseño. Una frase que resume esto es “Listen the Test”, ya que si el código es difícil o no se puede probar probablemente signifique que no existe un buen diseño.

En la siguiente imagen podemos observar cuales son los pasos en el ciclo de TDD:

TDD Process

Mas fácil todavía: Escribir la prueba –> Escribir el código que cumpla la prueba –> Limpiar el código (refactorizar)

Asimismo se siguen 3 reglas bien simples:

  1. No esta permitido escribir código de producción, al menos que sea para hacer pasar un test unitario fallido.
  2. No esta permitido escribir más código en el test, que el suficiente que haga fallar el código de producción.
  3. No esta permitido escribir más código de producción, que el suficiente para hacer pasar un test fallido.

Nos olvidamos de un aspecto muy importante, ¿Porqué realizar el test primero? , en realidad son muchas razones por las cuales se recomienda hacer los test antes y no después:

  • Permite separar el qué es lo que necesita la aplicación del como es que esto se implementará, esto ayuda a no escribir más funcionalidad de la necesaria y permite entregar un producto que representa las necesidades reales del cliente y no cosas que nunca va a utilizar.
  • Permite que nos concentremos y pongamos nuestra toda nuestra atención en solo una pequeña pieza de funcionalidad lo que nos ayuda a realizarla de una manera más rápida.
  • Definitivamente es más difícil encontrar algún error en 50 líneas de un método terminado que en 3 líneas de un método que esta creciendo de manera incremental.
  • Te brinda más información y de manera constante en comparación a una prueba realizada al final, lo que permite que el código pueda mejorarse de manera más rápida. Posiblemente no se tenga ganas de mejorar el código si es que la prueba se realiza al final y aún peor, posiblemente ni se realice la prueba (si escribes las pruebas al inicio te aseguras de que las pruebas realmente se hagan)
  • Escribir buenas pruebas sobre código existente es más difícil que hacerlas de forma inicial.
  • Es más divertido escribir las pruebas al inicio =).
Refactoring

“Refactoring: a change made to the internal structure of software to make it easier to understand and cheaper to modify without changing its observable behavior.” (Martin Fowler -Refactoring: Improving the Design of Existing Code)

Mientras que TDD se encarga de informar sobre nuestras decisiones de diseño, refactorizar se encarga de la adecuada modificación a dichas decisiones de diseño y para realizar esto se necesitan ciertas habilidades y conocimientos en patrones y principios de diseño.

Haciendo un resumen violento:

Unit Testing => como hacer buenos test.
TDD => realizar las pruebas primero y
Refactoring => como modificar adecuadamente tu diseño.

Palabras Finales

Palabras Finales!!!!!!!!!!!! O.o ¿Y el código?…… lo se, lo se, sin querer el post terminó siendo más largo de lo que pensaba, pero ojala esta pequeña introducción haya servido para comprender un poco más sobre lo que es realmente TDD y que beneficios nos aporta.

Todas las cosas que hemos visto anteriormente son solo herramientas que nos ayudan a llegar a un fin: “hacer mejor software” y es nuestra decisión utilizarlas o no, tampoco son dogmas que debemos seguir al pie de la letra pero se recomienda seguir ciertos lineamientos para su mejor aplicación.

Yo, al igual que muchos, estoy convencido que estas cosas traen muchos beneficios, pero a costa de un precio: investigación, aprendizaje y práctica, mucha práctica.

Hasta el siguiente post, donde veremos todo este romanticismo pero en la vida real.

Y no se olviden de ver el resto de la serie ASP.NET MVC y otras Yerbas.
Saludos.

ASP.NET MVC y otras Yerbas - Parte 1

Este es la primera parte de una serie de post en la que veremos como crear una aplicación ASP.NET MVC y como se pueden aplicar todos esos términos raros(DDD, IOC, TDD, BDD, ATDD, Test Double……) que existen actualmente dentro del desarrollo de software.

Para esto vamos a tomar como ejemplo el desarrollo de una pequeña aplicación que sirva como “Bolsa de Trabajo” donde las personas puedan llenar sus datos y luego postular a anuncios de trabajo de otras empresas

A continuación tenemos unos  Mockups (Prototipos) para darnos una idea de lo que queremos lograr con la aplicación:

image  image

Estos prototipos han sido creados con una estupenda aplicación llamada Balsamiq Mockups, tiene una opción de trial en el que se puede probar todas sus opciones pero no puedes grabar tu trabajo, de todas maneras siempre podremos hacer un print-screen =).

Ahora toca el turno al diseño de la aplicación, para esto haremos uso de un término muy hablado y usado hoy en día, este es “DDD” (Domain Driven Design), Pero que significa esta cosa, “DDD es un conjunto de patrones, principios y prácticas que nos ayudan a resolver y entender los problemas del negocio (dominio) en el diseño de sistemas orientas a objetos” (Yo), en pocas palabras es:

“OO software done right” Casey Charlton

La definición de DDD no estaría completa sin explicar el “Ubiquitous Language”. Desde los inicios del desarrollo del software surge la necesidad de contar con un lenguaje común que sea entendido de la misma manera por todos los involucrados en el desarrollo del software ( expertos del negocio, analistas, desarrolladores, etc) , este lenguaje no solo debe ser entendido de la misma manera sino también debe estar presente en todas partes (ubiquo) que se hable del software, y esto incluye las clases, métodos, variables, etc dentro del sistema.

Para complementar lo anterior, voy a mostrar una imagen que ha sido extraída y traducida de la presentación de DDD en el VAN (Virtual ALT.NET) realizado por Steve Bohlen.

image

Dentro de los patrones descritos en la imagen, observamos en la parte superior a los patrones de Diseño de la Solución, estos patrones se enfocan en como es que realmente se va a resolver el problema para el cual se esta diseñando e implementado el software, y allí es donde se encuentra DDD, A continuación tenemos algunos recursos para profundizar más en el tema :

- Libro de Eric Evans, principal referencia sobre DDD
- DDD Quickly, resumen del libro de Eric Evans
- Virtual ALT.NET sobre DDD, presentación en video sobre DDD
- DDD Step by Step
- Slides sobre DDD

Luego de aplicar DDD a la arquitectura de nuestra aplicación tendríamos la siguiente estructura dentro de una solución del Visual Studio:

image

Explicando muy brevemente cada uno de los proyectos creados:

- Web: No hay mucho que decir acá, en este proyecto se encontrarán nuestras páginas web (views) con las cuales interactuará el usuario final a través de un navegador.

- Controllers: Es una de las partes fundamentales del modelo MVC y que marca la diferencia ante del desarrollo con WebForms. Los controllers son los encargados de manejar el flujo de la aplicación, es decir son ellos los que manejan las peticiones(request) de los usuarios y deciden cual es la vista que se encargará de mostrar la respuesta(response) en la pantalla. Un punto importante que nos podemos dar cuenta en la solución es que los controllers se encuentran en un proyecto separado de las vistas O.o .  En este artículo de Billy McCafferty, el creador de S#arp Architecture, explica porque esta es una buena decisión.

-Domain: Es el corazón de la aplicación y aquí es donde se encontrará representado el “dominio” del negocio y todas sus reglas. Un punto importante a aclarar es que el dominio y en general todo DDD es Persistence Ignorance, esto debido a que DDD se basa en el negocio y no en como se realizará la persistencia ( una u otra base de datos, xml, archivos de texto ,etc).

Pero de alguna manera tenemos que mantener el estado de los objetos de nuestro dominio y es por esto que en DDD se habla de repositorios (repository pattern) ya que estos a diferencia de una capa de datos no tratan de filas o columnas sino de colecciones de objetos. En el dominio tendremos el contrato o la interfaz hacia estos repositorios pero no la implementación real, ya que no le corresponde al dominio sino es una tarea de la infraestructura de la aplicación.

- ApplicationServices: Este proyecto está directamente relacionado con lo propuesto por  DDD, realmente el nombre de este término trae muchas confusiones, una definición es la siguiente:

“An application service layer defines a set of services that act as boundary to the domain layer. Any interaction with the domain layer passes through these application services. The application services interface with domain and infrastructure layers to get the job done. The domain layer also can talk to infrastructure layer” Kaushik

Ahora en terrestre, es la puerta de acceso del mundo exterior a nuestro dominio, en este caso ese mundo exterior se refiere a nuestros controllers pero también se puede referir por ejemplo a otras aplicaciones a las cuales estemos exponiendo lógica de nuestro dominio, ejm: WebService. Pero, ¿es realmente necesario contar con una capa como esta ? , las razones podrían ser las siguientes:

  • Para mantener los controllers limpios o tener thin controllers , este caso se presenta cuando tenemos proyectos grandes o empezamos a poner mucho código en el controller, en caso contrarío podemos quitar del todo esta capa.
  • Si necesitamos reutilizar lógica que se encuentra en un controller y exponerla por cualquier otra interfaz hacia una cliente ejm: WebService, entonces es buena idea mover el código hacía un application service.

-Persistence: Acá tendremos a la implementación real de los repositorios definidos en el dominio y es donde nos comunicaremos con una base de datos para guardar el estado de nuestros objetos.

-Test: Se encontrarán los test unitarios de todas las capas de la aplicación.

A continuación tenemos 2 imágenes que muestran las diferencias de una arquitectura tradicional de 3 capas frente a DDD (Onion Architecture) :

image  image

DDD tiene muchos otros conceptos que aún no hemos visto pero que iremos tocando a medida avancemos la aplicación. Existen algunas aplicaciones libres donde podemos observar la implementación de DDD:

- S#arp Architecture, framework que encapsula la implementación de DDD sobre la arquitectura de una aplicación.
- CodeCampServer, aplicación web que es tomada de ejemplo por Jeffrey Palermo en su libro ASP.NET MVC in Action
- NDDD Sample, aplicación que pone en práctica lo descrito en el libro de Eric Evans.

Bueno con esto terminamos esta primera parte donde definimos un poco el objetivo de la aplicación y su arquitectura. Asimismo hemos visto algo de DDD, y sin considerar DDD aún nos queda muchísimas otras cosas por ver.

No se olviden de ver el resto de las serie ASP.NET MVC y otras Yerbas.
Hasta el siguiente post.

Mi Primer Post

Como todos los que vivimos en el mundo de la informática tenemos la necesidad de aprender y compartir, es por esto que me animé a abrir un blog, para poder escribir lo poco que sé y a la vez esperar sus comentarios y sugerencias para seguir mejorando.

Saludos.
Angel Nuñez Salazar.