documentacion docs grails code-smell

docs - Las mejores prácticas a seguir durante el desarrollo de la aplicación Grails



grails documentation 2.4 4 (4)

Al desarrollar una aplicación de Grails, ¿qué considera que son las "mejores prácticas" y por qué? No estoy interesado en un debate sobre las mejores prácticas, pero una o más afirmaciones respaldadas con una justificación y / o una descripción de cuándo se aplican las mejores prácticas y cuándo no. No creo que haya una mejor manera de desarrollar aplicaciones Grails, pero hay una serie de pautas que darán lugar a aplicaciones más sostenibles con menos errores escondidos en ellas.

Mi experiencia con Grails es que ofrece tantas capacidades que existe la tentación de usarlas todas en una sola aplicación, lo que resulta en algunos de los peores códigos de spaghetti que he visto desde que depuré un programa Fortran con declaraciones GOTO dentro y fuera de parte de un bucle DO.

Todos sabemos cómo Grails crea un lugar para clases de dominio, servicios, vistas, controladores, etc. ¿Qué tipo de funciones pertenecen a estos lugares? ¿Qué reglas generales te ayudan a hacer lo correcto? ¿Qué son los códigos del código Grails?


  1. Comprenda las convenciones de Grails. Grails es impulsado por la convención; y las convenciones son cómo Grails puede hacer mucha magia para ti. Las vistas deberían ser vistas. Los controladores solo deberían ser controladores. Los objetos de servicios y modelos deben contener toda la lógica de su aplicación. Esto significa que cuando hace clic en un enlace o invoca un punto final, llama a un Controlador. El controlador invocará un servicio (que a su vez podría invocar otros servicios) y dará una respuesta concisa. El servicio devolverá los objetos o datos del modelo al controlador, lo que simplemente generará una respuesta adecuada. Los servicios son transaccionales, por lo que todo lo que llegue a la base de datos debe ir en un servicio.

  2. Prueba. Prueba. Prueba un poco más Tener pruebas es la mejor manera de asegurarse de que pueda agregar funcionalidad sin romper nuevas funcionalidades, es decir, que su proyecto sea mantenible.

  3. Inyección de dependencia. Debe colocar sus componentes en la carpeta grails-app / correspondiente. Los servicios van a la carpeta de servicios. Los controladores van a la carpeta de controladores. Si tiene un objeto modelo Thing y necesita un controlador y servicio para él, su controlador y servicio se deben llamar ThingController y ThingService. Para poner el ThingService en su ThingController, ponga def thingService en su controlador, y grails lo autoconectará por usted. Si no sigue las convenciones de nomenclatura y las reglas sobre dónde colocar los distintos componentes, el autoenvío puede fallar.

  4. Comprenda las tecnologías subyacentes, a saber, Spring e Hibernate. Se encontrará con problemas al modelar sus objetos de dominio y hacer que trabajen juntos. Grails es realmente un marco de alta productividad, pero si no entiende cómo funciona Hibernate, se perderá fácilmente cuando intente conseguir que su persistencia se comporte de la manera que desee.

  5. Groovy no es Java. Una gran cantidad de conocimiento de Java te servirá bien. Pero Groovy es un lenguaje dinámico y Grails tiene su propio conjunto de errores que se derivan de Groovy. Se encontrará con problemas de tiempo de ejecución al escribir en Grails que evita en gran medida con Java. Las pruebas ayudan con esto.

Estas cosas parecen obvias, pero surgen muchas preguntas sobre estos temas.


  1. Desarrolla partes reutilizables de tu aplicación como complementos de Grails. Estos complementos se pueden probar de forma individual y eliminarán la complejidad de su (s) aplicación (es) principal (es). Considere publicar los complementos en el repositorio de plugins públicos si cree que otros pueden beneficiarse de ellos.

  2. Utilice el complemento de lanzamiento (conocido anteriormente como editor maven ) para implementar complementos internos en su repositorio Maven.

  3. Familiarícese con el complemento de recursos para el manejo de recursos estáticos. Este complemento formará parte de Grails 1.4 y será utilizado por muchos plugins populares.

  4. No tengas miedo de mirar el código fuente de los complementos de terceros que estás usando o Grails en sí mismo para ese asunto (¡esto me ha salvado tantas veces!). Grails y muchos de los complementos más populares alojan su código fuente en GitHub, lo que lo hace muy conveniente para navegar por el código, proyectos fork y contribuir parches.


  1. Evite la tentación de poner mucha lógica en la capa web. Para las vistas, esfuérzalas de la manera más simple posible. Ponga tanto texto estándar en sus diseños. Evita la lógica condicional como la peste. Divida el contenido compartido en plantillas g:render . Crea tu propio taglib para elementos comunes de UI.

  2. Del mismo modo, mantenga sus controladores lo más simple posible. Los desarrolladores inexpertos parecen tener el hábito de tirar todo en el controlador, porque parece más obvio. Algunas sugerencias: las consultas y la lógica de recuperación de objetos pueden ir en objetos de dominio. Si ve con withTransaction() y necesita un comportamiento transaccional, es un buen candidato para un servicio. Si tiene un enlace de datos complejo, divídalo en un objeto de comando.

  3. Para los objetos de dominio, aproveche la posibilidad de anular setters y getters para facilitar el trabajo de las propiedades. Crear consultas cortas con nombre y encadenarlas juntas es una forma excelente de descomponer la lógica de consulta compleja. Todo lo que se aplica a un único objeto de ese tipo con pocas dependencias debe ir en la clase de objeto de dominio. Sin embargo, mantenga la lógica específica para ese objeto. La lógica empresarial más compleja que trata con grupos de objetos pertenece a los servicios.

  4. En caso de duda, puede ir en un servicio. Los servicios deben ser apátridas. Si encuentra que necesita almacenar estado, probablemente necesite un nuevo objeto de dominio.


Lo que puedo pensar ...

  1. Pruebe tanto como pueda con pruebas unitarias, no pruebas de integración. Las pruebas unitarias son formas más rápidas de ejecutar / depurar y reforzar mejor el acoplamiento bajo. Utilice mockDomain() , mockLogging() etc.
  2. Usa la grails console para probar y explorar tu código en la naturaleza. Incruste una consola Groovy en su interfaz de usuario web; es una herramienta invaluable para examinar el interior de una aplicación en ejecución.
  3. Use objetos de dominio para modelar lógica de dominio. Mover la lógica de dominio a Servicios es una resaca de capas de persistencia inconvenientes.
  4. Mantenga los controladores breves. Si una lógica se puede expresar en términos de una clase específica, mueva la lógica allí o cree una nueva clase. Pruébalo después.
  5. Capas separadas Mantenga la lógica del dominio en las clases de dominio. Mantenga la lógica de presentación en controladores / vistas.
  6. transactional servicio transactional no es la única forma de realizar una transacción. Invocar DomainClass.withTransaction{ ...a couple of lines here... } de Controller está bastante bien, siempre y cuando obedezcan al # 4.
  7. Esforzarse por la perfección: a diferencia de Java, es posible: D Conocer la tecnología. Utilice Builders, complementos adecuados, Commands, metaprogramación, lo que sea, para hacer que su código sea más corto, más legible, más groovier.