Método de gerenciamento Swift Package Manager Series 07|SPM em projetos iOS de médio porte
O que os projetos de médio porte realmente temem é que existam módulos, mas não tenham direções de dependência e limites de responsabilidade estáveis.
Se eu fosse usar o SPM para gerenciar um projeto iOS de médio porte, minha primeira preocupação não seria “quantos pacotes remover”, mas estas três questões:
- Quais habilidades são realmente dignas de independência?
- Como manter a direção estável das dependências do módulo
- O que deve ser retido no projeto anfitrião e o que não deve ser retido?
Porque os projetos de médio porte têm maior probabilidade de cair em uma armadilha: Parece que a modularização começou, mas na verdade é apenas uma redistribuição da complexidade do projeto principal original para vários pacotes.
Então, o que quero falar neste artigo é como julgo módulos, hierarquias e gráficos de dependência.
1. Não buscarei “mais módulos” desde o início, mas primeiro buscarei “níveis claros”
A complexidade dos projetos de médio porte geralmente não é grande o suficiente para exigir subdivisões extremas, mas é suficiente para que “tudo no projeto principal” comece a se tornar perigoso.
O mais importante neste momento é remover primeiro as camadas.
Normalmente vejo primeiro se as seguintes categorias de coisas podem ser separadas de forma estável no projeto:
- Camada de habilidade básica
- Camada de capacidade de domínio
- Camada de reutilização da UI
- Camada do projeto host
Uma vez misturados esses quatro tipos de coisas, é fácil para o projeto sair do controle assim que a escala aumenta. Mas se a hierarquia for estabelecida primeiro, o número de módulos será um detalhe posterior.
2. Primeiro dividirei os módulos principais em três categorias.
1. Módulo de habilidade básica
Por exemplo:
- rede
- Registro
- cache
- Leitura de configuração
- Ferramentas básicas
As características desse tipo de módulo são que ele fica distante do negócio, tem forte capacidade de reutilização e a direção de dependência deve ser fechada o máximo possível.
2. Módulo de capacidade de domínio
Por exemplo:
-Conta
- Usuário
- Conteúdo
- Pedido
Esses módulos são centros de capacidade de negócios. Eles devem hospedar modelos de domínio, armazéns e casos de uso, em vez de implementações de páginas específicas.
3. Módulo de reutilização da UI
Por exemplo:
- Sistema de projeto
- Componentes comuns
- Recipiente de lista universal
Terei muito cuidado aqui para evitar dividir acidentalmente a página comercial em módulos de UI. Os módulos de reutilização da UI são mais adequados para transportar recursos de componentes estáveis, universais e de páginas cruzadas.
3. O que deve ser mantido no projeto hospedeiro?
Este é um problema que muitas equipes tendem a ignorar.
Depois que você começa a fazer SPM, é fácil ter uma tendência: “Como são todos modulares, é melhor que o projeto hospedeiro seja o mais fino possível.”
Esta afirmação é apenas parcialmente verdadeira.
O projeto host realmente não deve conter muitos recursos reutilizáveis, mas ainda deve reter algumas coisas que pertencem naturalmente ao host, como:
- Orquestração do ciclo de vida do aplicativo
- Montagem de roteamento
- Injeção de configuração de ambiente
- Montagem do módulo
- Códigos relativos à forma do produto final
Em outras palavras, o projeto anfitrião deve se concentrar na montagem e na colaboração em nível de produto, em vez de carregar um monte de capacidades que poderiam ter sido perdidas.
4. Não vou desmontá-lo muito bem no início.
Isso é algo em que insisto muito.
Uma das armadilhas em que os projetos de médio porte têm maior probabilidade de cair é a “modularização pela modularidade”, que acaba destruindo demais o sistema.
Quando o módulo estiver muito fragmentado, os problemas aparecerão imediatamente:
- Gráfico de dependência complexo
- O caminho de depuração fica mais longo
- Saltos frequentes entre módulos durante a revisão
- Uma pequena mudança envolve múltiplas ligações de pacotes
Isso pode rapidamente levar as equipes a duvidar da própria modularidade.
Então eu prefiro:
- Primeiro desmonte alguns módulos grandes com responsabilidades claras
- observe várias iterações
- Decida se deseja refinar
A escolha muito precisa do sistema na primeira vez geralmente é feita às pressas.
5. A direção da dependência é mais importante que o número de módulos
Se me pedissem para escolher entre “remover mais módulos” e “corrigir as dependências”, eu definitivamente escolheria a última opção.
Porque mais módulos não significam automaticamente uma estrutura melhor. O que realmente determina se o sistema pode evoluir de forma estável a longo prazo é se a direcção da dependência é clara.
Por exemplo, me preocupo mais se esses relacionamentos se mantêm:
-A camada base não depende da camada de negócios
- A camada de domínio não depende da camada host ao contrário
- A camada de reutilização da UI não rouba a semântica comercial da página
- A camada host é responsável pela montagem, ao invés de manter toda a implementação interna em suas mãos
Enquanto as direções de dependência estiverem confusas e não importa quantos módulos existam, o sistema será apenas um “acoplamento aninhado multicamadas”.
6. Serei muito cauteloso com “módulos públicos universais”
Este é um antipadrão que aparece frequentemente em projetos de médio porte.
Quando um projeto é modularizado no início, muitas vezes surgirá uma pergunta chamada:
-Common
-Shared
-Core
-Base
Super módulos como este.
Se este módulo possuir recursos básicos claros, não haverá problema. Mas os “módulos públicos” em muitos projetos acabarão por se tornar:
- Pode ser confiável em qualquer lugar
- Coloque tudo lá
- Existem funções de ferramentas, modelos de negócios e componentes de UI
O resultado é que ele se torna o novo ponto central de acoplamento.
Então prefiro dividi-lo em pequenos módulos básicos com responsabilidades claras, em vez de construir um grande módulo público que cubra tudo.
7. O mais importante para a modularização de projetos de médio porte é a cognição consistente da equipe.
Isto é muito realista.
Em projetos de médio porte, muitos problemas estruturais são causados pelo fato de a equipe não ter uma compreensão consistente dos limites. Por exemplo, algumas pessoas pensam:
- Tudo relacionado à página é considerado um módulo
Algumas pessoas pensam:
- Os modelos de domínio devem ser desmontados separadamente
Algumas pessoas pensam:
- Componentes públicos devem ser colocados juntos com módulos de negócios para maior comodidade
Se essas cognições não forem unificadas por um longo período, o sistema continuará a aumentar os conflitos de limites mesmo com o SPM.
Portanto, em projetos de médio porte, darei grande importância a:
- A nomenclatura das responsabilidades do módulo é consistente?
- Existe um consenso sobre a direção da dependência?
- Ao adicionar um novo código, você consegue dizer em qual camada ele deve ser colocado?
Isto é muito mais importante do que simplesmente “quantos pacotes foram abertos”.
8. Conclusão: O cerne do uso do SPM para gerenciar projetos de médio porte não é a quantidade, mas a estabilidade de longo prazo do gráfico de dependência.
Para resumir, eu diria:
Ao usar o SPM para gerenciar um projeto iOS de médio porte, o mais importante é formar uma direção de dependência estável de longo prazo entre recursos básicos, recursos de domínio, reutilização de UI e montagem de host.
Ao fazer isso, o número de módulos encontrará naturalmente o tamanho certo. Se você não puder fazer isso, não importa o quanto você divida, isso apenas reduzirá a complexidade.
What to read next
Want more posts about Swift Package Manager?
Posts in the same category are usually the best next step for reading more on this topic.
View same categoryWant to keep following #iOS?
Tags are useful for related tools, specific problems, and similar troubleshooting notes.
View same tagWant to explore another direction?
If you are not sure what to read next, return to the homepage and start from categories, topics, or latest updates.
Back home