Como evitar o pesadelo da cadeia de dependência de módulo causado por dependências transitivas?


9

Muitas pessoas (a maioria?) Do AngularJS parecem defender a quebra dos aplicativos AngularJS em vários módulos.

Brian Ford, em seu blog, já afirma que empacotar por camada (controlador, serviço etc.) é uma noção "boba", então nem vou lá. (Consulte http://briantford.com/blog/huuuuuge-angular-apps .)

Mas vamos supor que você modularize um aplicativo por recurso. Talvez você tenha um módulo de usuários e um módulo de mensagens , juntamente com o módulo de aplicativo padrão para carregar esses módulos de recursos. Você coloca cuidadosamente as rotas relacionadas à funcionalidade do usuário no módulo de usuários e as rotas relacionadas à mensagem no módulo de mensagens . Agora, na minha opinião, você criou uma dependência em CADA módulo de recurso no ngRoute . Então, cada módulo deve listar "ngRoute" em sua matriz de dependências, certo?

Infelizmente, o AngularJS facilita demais tudo isso. Se o seu módulo de aplicativo carrega usuários e mensagens , mas apenas os usuários listam "ngRoute" como uma dependência, não importa em tempo de execução: $ routeProvider ainda será injetado na sua função de configuração nas mensagens , tendo sido essencialmente resolvido através do módulo de usuários dependência do ngRoute .

Meu problema pode estar no padrão comum de um módulo "aplicativo" carregando / fazendo referência a vários módulos de recursos. O padrão faz sentido para mim, assim como as dependências transitivas. O que é problemático é que a implementação específica do Angular pode mascarar casos em que um módulo não faz referência indireta às dependências do módulo. O módulo pode funcionar no contexto de um aplicativo específico (porque o módulo é referenciado por outro módulo "aplicativo" que também faz referência direta ou indireta a suas dependências), mas se você copiasse o módulo em outro aplicativo, ele falharia. devido à falta de dependências.

Tenho a impressão de que a maioria das pessoas não consideraria muito o fato de que o módulo de usuários agora é essencialmente uma dependência do módulo de mensagens . No entanto, é um problema que tenho problemas para olhar para o passado. Para mim, se estamos criando essas dependências confusas entre os módulos de recursos, isso realmente diminui o benefício líquido da modularização, e eu prefiro ter apenas um único módulo de aplicativo que encapsule todos os componentes para todos os recursos do aplicativo.


Por outro lado, dependências transitivas não são artefatos estranhos introduzidos por uma implementação estranha, existem realmente dependências e são transitivas. Eles também são comuns na programação. Não sei por que é confuso ou um pesadelo. Talvez você possa explicar por que isso é algo para se preocupar?
psr

Respostas:


1

Eu não defenderia muitos módulos pequenos, seu ganho é muito pequeno. O módulo angular não é realmente um sistema de módulos. Eles não fornecem espaço de nome real, também não são rigorosos; se algum outro módulo ativo 'importar' sua dependência, ele normalmente funcionará (como você mencionou) etc.) Por causa disso, ele não ajudará a 'documentar' suas dependências por módulo. ficará incompleto.

Basta manter módulos muito grossos / grandes. Aprendi a vê-los principalmente como uma configuração de contêiner de injeção de dependência, não como um meio de 'componente'. Todos esses 'módulos' geralmente violam o YAGNI de qualquer maneira, como se você nunca tivesse executado o aplicativo. As considerações de reutilização são principalmente uma promessa que raramente cumpre.

Atualmente, uso os módulos do TypeScript para particionar meu código. Dependências de módulos angulares Eu reservo amplamente para coisas verdadeiras de terceiros.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.