¿Cómo evitar la pesadilla de la cadena de dependencia del módulo causada por dependencias transitivas?


9

Muchas personas (¿la mayoría?) De AngularJS parecen abogar por dividir las aplicaciones de AngularJS en muchos módulos.

Brian Ford en su blog ya afirma que empaquetar por capa (controlador, servicio, etc.) es una noción "tonta", por lo que ni siquiera iré allí. (Ver http://briantford.com/blog/huuuuuge-angular-apps .)

Pero supongamos que modulariza una aplicación por característica. Quizás tenga un módulo de usuarios y un módulo de mensajes , junto con el módulo de aplicación estándar para cargar estos módulos de funciones. Coloca cuidadosamente las rutas relacionadas con la funcionalidad del usuario en el módulo de usuarios , y las rutas relacionadas con los mensajes en el módulo de mensajes . Ahora, en mi opinión, ha creado una dependencia en CADA módulo de características en ngRoute . Entonces, cada módulo debe incluir "ngRoute" en su conjunto de dependencias, ¿verdad?

Desafortunadamente, AngularJS hace que sea demasiado fácil arruinarlo. Si su módulo de aplicación carga tanto usuarios como mensajes , pero solo los usuarios enumeran "ngRoute" como una dependencia, no importa en el tiempo de ejecución: $ routeProvider aún se inyectará en su función de configuración en los mensajes , ya que esencialmente se resolvió a través del módulo de usuarios dependencia de ngRoute .

Mi problema puede ser con el patrón común de un módulo de "aplicación" que carga / hace referencia a varios módulos de funciones. El patrón tiene sentido para mí, al igual que las dependencias transitivas. Lo problemático es que la implementación particular de Angular puede enmascarar casos en los que un módulo no hace referencia a sus dependencias de módulo, incluso indirectamente. El módulo puede funcionar en el contexto de una aplicación en particular (porque el módulo está referenciado por otro módulo de "aplicación" que también hace referencia a sus dependencias directa o indirectamente), pero si copiara el módulo en otra aplicación, fallaría debido a la falta de dependencias.

Tengo la impresión de que la mayoría de la gente no consideraría mucho el hecho de que el módulo de usuarios ahora es esencialmente una dependencia del módulo de mensajes . Sin embargo, es un problema que tengo problemas para mirar más allá. Para mí, si es probable que estemos creando estas dependencias confusas entre módulos de características, realmente disminuye el beneficio neto de la modularización, y preferiría tener un solo módulo de aplicación que encapsule todos los componentes para todas las características de la aplicación.


Por otro lado, las dependencias transitivas no son un artefacto extraño introducido por una implementación extraña, realmente hay dependencias y realmente son transitivas. También son comunes en la programación. No estoy seguro de por qué es confuso o una pesadilla. ¿Quizás podría explicar por qué esto es algo de lo que preocuparse?
psr

Respuestas:


1

No recomendaría muchos módulos pequeños, su ganancia es demasiado pequeña. El módulo angular no es realmente un sistema de módulos. No proporcionan espacios de nombres reales, tampoco son estrictos, si algún otro módulo activo 'importa' su dependencia, generalmente funcionará (como usted mencionó), etc. Debido a esto, no lo ayudará a 'documentar' sus dependencias por módulo, Estará incompleto.

Solo adhiérase a módulos muy gruesos / grandes. Aprendí a mirarlos principalmente como una configuración de contenedor de inyección de dependencia, no como un medio para 'componenteizar'. Todos estos 'módulos' generalmente violan YAGNI de todos modos, como si alguna vez hubieras ejecutado la aplicación sin ella. Las consideraciones de reutilización son principalmente una promesa que rara vez se cumple.

Hoy en día uso los módulos de TypeScript para particionar mi código. Dependencias de módulos angulares que reservo en gran medida para cosas verdaderas de terceros.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.