Desarrollar aplicaciones de foro web basadas en el marco ASP.NET MVC
1. Introducción
En esta publicación de blog, primero presentaré los objetivos generales de la aplicación del foro desde una perspectiva global. En esta publicación de blog, hablaré sobre la importancia de evitar códigos incorrectos y también discutiré cómo aprovechar los principios y patrones de diseño de software para ayudarlo a escribir código que sea resistente a cambios futuros. Finalmente, en esta serie de artículos también demostraré por qué elegí utilizar un enfoque de desarrollo basado en pruebas para crear la aplicación del foro.
2. ¿Qué es un buen software?
No quiero crear una aplicación de foro al azar. Mi objetivo es crear la mejor aplicación de foro posible.
Este objetivo plantea inmediatamente la pregunta: ¿Qué caracteriza a un buen software? ¿Qué hace que una aplicación sea mejor o peor que otra? No puedo afirmar haber creado una aplicación de foro perfecta sin una definición previa de "buen software".
Esta es mi definición de "buen software".
3. Un buen software es un software diseñado para ser fácil de modificar
Hay muchas razones por las que es posible que necesites realizar cambios
1) Es posible que debas modificar un software existente Agregar nuevas funciones
2) Es posible que deba corregir errores en el software existente
3) Es posible que deba optimizar el software existente
4) Es posible que necesites mejorar el diseño del software existente
En general, el software mal diseñado es difícil de cambiar. Algunos programas están tan mal diseñados que nadie se atreve a tocarlos. Todos hemos utilizado software mal diseñado en algún momento. Cuando algo sale mal con el software, desea que desaparezca; es posible que incluso desee reescribir el software desde cero si tiene la oportunidad.
4. Evite el mal sabor del código
Robert y Micah Martin describen partes del mal software como mal sabor del código. Los siguientes tipos de códigos incorrectos significan que el software está mal escrito:
1) Rigidez: el software rígido es software que requiere una serie de cambios en el sistema cuando se realiza un cambio en alguna parte.
2) Fragilidad: el software de fragilidad se refiere al software que cuando realiza cambios en una ubicación, interrumpe el funcionamiento normal de muchas otras ubicaciones.
3) Complejidad innecesaria: el software de complejidad innecesaria se refiere al software que está sobrediseñado para hacer frente a cualquier posible cambio.
4) Duplicación innecesaria: la duplicación innecesaria de software contiene una gran cantidad de código repetido.
5) Oscuro: el software oscuro es software difícil de entender.
Tenga en cuenta que estos fallos de código se describen detalladamente en el famoso libro Principios, patrones y prácticas ágiles en C# de Micah y Robert Martin. Recomendamos encarecidamente a los lectores que lean el libro aquí.
Tenga en cuenta que cada uno de los tipos de código anteriores está asociado con todos los cambios de código. Cada tipo de código bloquea los cambios de código.
5. Principios de diseño de software
Seguir buenos principios de diseño de software ayudará a escribir software que pueda adaptarse fácilmente a cambios futuros. Existen muchos principios de diseño de software y todos difieren. Por ejemplo, Cunningham and Cunningham Wiki describe 11 principios de diseño orientado a objetos:
Los primeros cinco principios de diseño orientado a objetos mencionados allí son consistentes con el libro Principios, patrones y principios ágiles descritos en Prácticas en C# son similares. Además, Robert Martin analiza estos principios. Además, Robert Martin analiza estos principios en el blog Object Mentor:
Además, encontré otros dos libros que proporcionan información extremadamente útil sobre los principios de diseño de software.
El primero es "Head First Design Patterns", del que son coautores Eric Freeman, Elisabeth Freeman, Kathy Sierra y Bert Bates; el segundo es "Head First Object-Oriented Analysis and Analysis", del que son coautores Brett McLaughlin, Gary Pollice y David West; . Jefe primero de análisis y diseño orientado a objetos por Brett McLaughlin, Gary Pollice y David West. Si bien los principios discutidos en estos libros no son exactamente los mismos que los mencionados por Robert Martin, son muy similares.
Sin embargo, todos estos recursos que analizan los principios de diseño de software se originan en el trabajo de Robert Martin. La siguiente es una lista de estos principios de diseño de software:
SRP: principio de responsabilidad única
OCP: principio fuera de control
LSP: sustitución de Liskov Principio
ISP--Principio de separación de interfaz
DIP--Principio de inversión de dependencia
El conjunto de principios anterior corresponde a la abreviatura SOLID.
La siguiente lista de principios de diseño de software proviene del libro "Head First Design Patterns":
Encapsular cambios
Usar más composición, menos herencia
Programación basada en interfaz en lugar de basada en implementación
Esforzarse por lograr un acoplamiento flexible entre objetos que interactúan
Las clases deben estar abiertas a la extensión, pero cerradas a la modificación
Confía en abstracciones, no en clases concretas
Habla solo con amigos
¡No me llames, nosotros te llamamos!
Una clase debe tener solo una razón para cambiar
Por supuesto, hay mucha superposición entre los principios anteriores. Por ejemplo, el principio de "responsabilidad única" es coherente con el principio posterior de "una clase debe tener sólo una razón para cambiar". Sin embargo, el enfoque es diferente. No se proporcionan más detalles aquí.
La verdadera motivación detrás de todos estos principios de diseño es un intento de crear software que pueda adaptarse al cambio. Cada uno de estos principios aborda un principio diferente, pero el objetivo final es crear software que resista la prueba del tiempo.
6. Patrones de diseño de software
Los patrones de diseño de software describen una estrategia para aplicar los principios de diseño de software. En otras palabras, los principios de diseño de software son una buena idea y los patrones de diseño de software son las herramientas que se utilizan para implementar esa buena idea.
El concepto de patrones de diseño de software se originó originalmente en el libro "Patrones de diseño: elementos de software orientado a objetos reutilizables". Fue este libro el que inspiró muchos otros libros que describen patrones de diseño de software.
Por ejemplo, otro libro, "The Head First Design Pattern", presenta los patrones de diseño introducidos en el libro GOF (es decir, los "Patrones de diseño: elementos de software reutilizable orientado a objetos" mencionados anteriormente) Introduciendo patrones de diseño. Patrones de diseño: Patrones de diseño: Elementos de software reutilizable orientado a objetos"). Este libro cubre un total de los siguientes 14 patrones de diseño de software:
Estrategia
Servidor
Decorador
Fábrica
p >"Funda"
Comando
Adaptador<
Fa?
Plantilla
Dispositivo de iteración
Composite
Estado
Agente
Composite
Otro libro influyente sobre patrones de diseño de software El libro más poderoso es "Patrones de arquitectura de aplicaciones empresariales" de Martin Fowler. El libro también tiene un sitio web de la empresa que enumera los patrones presentados en el libro.
La URL del sitio web es
Los patrones de diseño de software le brindan la capacidad de estructurar su código de manera modelada, haciéndolo más resistente a futuras modificaciones. Por ejemplo, al crear la aplicación del foro de este artículo, utilizamos un patrón de diseño de software llamado Repositorio para diseñarla. En su libro Domain-Driven Design, Eric Evans describe el patrón Repositorio de esta manera:
REPOSITORIO describe todos los objetos de un determinado tipo, que se describen como una colección de conceptos (normalmente burlados). Se comporta como una colección pero admite consultas más detalladas. Por lo tanto, se pueden agregar o eliminar objetos que coincidan con el tipo correspondiente, y el sistema detrás de este REPOSITORIO puede agregar o eliminar estos objetos de la base de datos.
Según Evans, una ventaja clave del patrón Repository es que le ayuda a desacoplar "el diseño de aplicaciones y dominios de las tecnologías de almacenamiento, múltiples estrategias de bases de datos e incluso múltiples fuentes de datos". En otras palabras, el patrón Repositorio protege su aplicación de tener que volver a cambiarla según cómo acceda a la base de datos.
Para que nuestra aplicación de foro sea independiente de tecnologías de almacenamiento específicas, introduciremos el patrón de repositorio mencionado anteriormente en el sistema. Por lo tanto, el diseño final de esta aplicación de foro podrá permitirnos cambiar entre diferentes tecnologías de acceso a datos como LINQ to SQL, Entity Framework o NHibernate.
7. Desarrollo basado en pruebas
En este artículo planeo utilizar principios de desarrollo basado en pruebas para crear la aplicación del foro MVC. Más específicamente, antes de escribir cualquier código de aplicación, primero escribiría pruebas unitarias para el código de la aplicación.
El desarrollo basado en pruebas le proporcionará un código de mayor calidad por los siguientes motivos:
(1) Escribir pruebas para su código le proporcionará una red de seguridad para adaptarse al futuro. Sujeto a cambios.
(2) Escribir pruebas para tu código te obliga a escribir código débilmente acoplado.
(3) Escribir pruebas para tu código antes de escribirlo te obligará a mirar el código que estás escribiendo desde la perspectiva del usuario.
Analicemos en detalle las ventajas de cada una de estas funciones.
En primer lugar, las pruebas unitarias le brindan una red de seguridad para adaptarse a los cambios que puedan ocurrir en el futuro. Este es un punto que Michael Feathers enfatiza repetidamente en su libro Effective Working with Legacy Code. De hecho, define el código heredado como "codificación simple sin pruebas".
Cuando el código de su aplicación está cubierto por pruebas unitarias, puede realizar cambios en el código sin preocuparse de que los cambios afecten la funcionalidad existente del código. Las pruebas unitarias ayudan a refactorizar el código de forma más segura. Si puede refactorizar, puede utilizar patrones de diseño de software para modificar su código de modo que el código resultante se adapte mejor a cambios futuros.
En segundo lugar, seguir un desarrollo basado en pruebas te obligará a escribir código de una manera específica. El código comprobable a menudo conduce a un código débilmente acoplado. Las pruebas unitarias permiten la ejecución de pruebas en unidades de código independientes. Para crear una aplicación comprobable, debe utilizar un enfoque de componentes aislables para crear su aplicación.
El acoplamiento flexible de una clase a otra significa que no tienes que cambiar otra clase cuando cambias la primera. El desarrollo basado en pruebas a menudo lo obliga a escribir código débilmente acoplado porque el código débilmente acoplado no se modifica fácilmente.
Finalmente, escribir código primero como prueba te obliga a ver el código que escribes desde la perspectiva del usuario. Al escribir su código primero mediante pruebas, se pone en el lugar de futuros desarrolladores que podrían usar su código. Dado que escribir pruebas te obliga a considerar cómo otro desarrollador (quizás tú mismo) podría usar tu código, el código que termines escribiendo debería estar mejor diseñado.
8. Piense a largo plazo en lugar de consideraciones inmediatas
La creación de software utilizando principios de desarrollo basados en pruebas requiere que los desarrolladores se esfuercen más en las primeras etapas del proceso de desarrollo. Si bien escribir pruebas lleva tiempo, la idea es que el esfuerzo inicial requerido para crear pruebas unitarias dará buenos resultados en el futuro.
Hay dos formas de convertirse en desarrollador.
Puedes convertirte en un vaquero o convertirte en un artesano. Los vaqueros pueden empezar a codificar inmediatamente. Es decir, Cowboy puede crear una aplicación de software muy rápidamente. Sin embargo, el problema de ser vaquero es que el software requiere un mantenimiento a largo plazo.
Los artesanos son muy pacientes. Los artesanos siempre desarrollan software con mucho cuidado. Craftsman tiene mucho cuidado al crear pruebas unitarias para que cubran todo el código de la aplicación. Por lo tanto, a los artesanos les lleva más tiempo crear una aplicación exitosa. Pero una vez que crea una aplicación, resulta más fácil mantenerla en el futuro: es más fácil corregir errores y agregar nuevas funciones a la aplicación.
9. Conclusión
En resumen, nuestro objetivo final es crear una aplicación de foro MVC que pueda resistir las pruebas a lo largo del tiempo. No sólo debería funcionar bien ahora, sino que debería seguir funcionando en el futuro, incluso si alguien necesita realizar cambios en la aplicación.
Quiero desarrollar esta aplicación de foro utilizando el marco Microsoft MVC. La razón de esto es que el marco me facilita escribir código de prueba para mi programa. Por otro lado, el propio marco MVC está diseñado para proporcionar el soporte más fiel para el desarrollo basado en pruebas.