DEV Community

<deMGoncalves />
<deMGoncalves />

Posted on

Princípios de Acoplamento e Configurações de Paths no TypeScript: Exemplos de Uso e Problemas Decorrentes da Não Utilização

No desenvolvimento de software, é fundamental garantir a estrutura correta do código, facilitando a manutenção, reutilização e extensibilidade. Os princípios de acoplamento são diretrizes importantes nesse contexto, e, ao utilizar o TypeScript, podemos aproveitar as configurações do arquivo tsconfig.json para promover esses princípios. Neste artigo, vamos explorar como os princípios das Dependências Acíclicas (ADP), Dependências Estáveis (SDP) e Abstrações Estáveis (SEIVA) se relacionam com as configurações de paths no TypeScript, apresentando exemplos de uso e discutindo os problemas decorrentes da não utilização dessas boas práticas.

Princípio das Dependências Acíclicas (ADP)

O Princípio das Dependências Acíclicas estabelece que o grafo de dependência dos pacotes não deve ter ciclos. Ao configurar os paths no arquivo tsconfig.json, podemos garantir que as importações sejam feitas de forma clara e linear, evitando a criação de ciclos indesejados. Isso promove um código mais coeso e evita problemas de dependências circulares.

Exemplo de configuração no arquivo tsconfig.json:

{
  "compilerOptions": {
    "baseUrl": "./src",
    "paths": {
      "@utils/*": ["utils/*"],
      "@services/*": ["services/*"],
      "@components/*": ["components/*"],
      ...
    }
  }
}
Enter fullscreen mode Exit fullscreen mode

Nesse exemplo, configuramos caminhos paths personalizados para facilitar as importações. Utilizando o prefixo "@utils/*", por exemplo, podemos importar os utilitários de forma mais concisa, sem a necessidade de especificar o caminho completo. Essa abordagem promove a clareza das dependências, evitando acoplamentos circulares indesejados.

Princípio das Dependências Estáveis (SDP)

O Princípio das Dependências Estáveis sugere que devemos depender na direção da estabilidade. Ao utilizar os paths no tsconfig.json, podemos configurar a estrutura dos nossos pacotes de forma a refletir a estabilidade dos mesmos. Isso evita que mudanças frequentes nos módulos menos estáveis afetem negativamente os módulos estáveis.

Exemplo de uso dos paths com base na estabilidade:

{
  "compilerOptions": {
    "baseUrl": "./src",
    "paths": {
      "@core/*": ["core/*"],
      "@experimental/*": ["experimental/*"],
      ...
    }
  }
}
Enter fullscreen mode Exit fullscreen mode
// Importação de módulos estáveis
import { stableModule } from "@core/stableModule";
import { stableModule2 } from "@core/stableModule2";

// Importação de módulos menos estáveis
import { unstableModule } from "@experimental/unstableModule";
Enter fullscreen mode Exit fullscreen mode

Nesse exemplo, configuramos caminhos personalizados para os módulos estáveis e menos estáveis. Utilizando os prefixes "@core/" e "@experimental/", podemos importar os módulos de forma clara e refletir a direção das dependências, onde os módulos estáveis são dependidos pelos módulos menos estáveis.

Princípio das Abstrações Estáveis (SEIVA)

O Princípio das Abstrações Estáveis defende que a abstração de um módulo aumenta com a sua estabilidade. Ao configurar os paths no arquivo tsconfig.json, podemos refletir esse princípio ao estruturar os pacotes de forma a aumentar a abstração com a estabilidade.

Exemplo de uso dos paths com abstrações estáveis:

// No arquivo tsconfig.json
{
  "compilerOptions": {
    "baseUrl": "./src",
    "paths": {
      "@utils/*": ["utils/*"],
      "@types/*": ["types/*"],
      ...
    }
  }
}
Enter fullscreen mode Exit fullscreen mode
// Importação de um utilitário
import { utilityFunction } from "@utils/utility";

// Importação de uma abstração estável
import { StableType } from "@types/stableType";
Enter fullscreen mode Exit fullscreen mode

Nesse exemplo, configuramos caminhos personalizados para os utilitários e as abstrações estáveis. Utilizando os prefixes "@utils/" e "@types/", podemos importar esses recursos de forma mais concisa e refletir a direção do aumento da abstração com a estabilidade.

Problemas decorrentes da não utilização das boas práticas

  • Acoplamento excessivo: Sem a configuração adequada dos paths, é comum que os desenvolvedores utilizem caminhos absolutos ou relativos longos para importar módulos. Isso pode levar a um acoplamento excessivo entre os diferentes módulos do sistema, tornando-o mais difícil de entender e manter.
  • Dificuldade na reutilização de código: Sem caminhos personalizados definidos no tsconfig.json, a reutilização de módulos e abstrações se torna mais complexa. Cada importação requer a especificação do caminho completo, o que aumenta a probabilidade de erros e dificulta a portabilidade do código.
  • Instabilidade de pacotes: Sem uma estrutura adequada baseada na estabilidade dos pacotes, mudanças frequentes em módulos menos estáveis podem causar impactos indesejados em módulos mais estáveis. Isso pode resultar em código quebrado e tornar a manutenção mais difícil.

Exemplo de mau uso:

import { utilityFunction } from "../../../utils/utility";
import { StableType } from "../../types/stableType";
Enter fullscreen mode Exit fullscreen mode

Nesse mau exemplo, as importações utilizam caminhos relativos longos, o que dificulta a leitura e entendimento do código. Além disso, não há uma estrutura definida para refletir a estabilidade dos módulos, tornando a dependência entre eles menos clara e aumentando o risco de problemas de acoplamento.

Conclusão

As configurações de paths no arquivo tsconfig.json do TypeScript permitem que apliquemos os princípios de acoplamento no desenvolvimento de software. Ao evitar dependências acíclicas, depender na direção da estabilidade e aumentar a abstração com a estabilidade, podemos criar sistemas mais coesos, reutilizáveis e fáceis de manter.

A não utilização dessas boas práticas pode levar a problemas de acoplamento excessivo, dificuldades na reutilização de código e instabilidade dos pacotes. Ao adotar essas práticas, podemos promover um código mais limpo, modular e resiliente ao longo do tempo.

Top comments (0)