Sobes.tech
Middle

O que é coesão e acoplamento na programação?

sobes.tech IA

Resposta da IA

A coesão (Cohesion) é uma medida de quão estreitamente os elementos dentro de um módulo (classe, função) estão relacionados. Uma alta coesão significa que os elementos do módulo estão focados na realização de uma única tarefa ou conceito. Um módulo bem projetado tem alta coesão.

Exemplos de níveis de coesão (de baixa a alta):

  • Casual (Coincidental): Os elementos estão relacionados por acaso, sem ligação lógica.
  • Lógica (Logical): Os elementos realizam um conjunto de ações logicamente relacionadas, mas a seleção é feita por código externo.
  • Temporal (Temporal): Os elementos estão relacionados por serem executados ao mesmo tempo.
  • Procedural (Procedural): Os elementos seguem um procedimento de execução.
  • De comunicação (Communicational): Os elementos trabalham com os mesmos dados.
  • Sequencial (Sequential): A saída de um elemento é a entrada de outro.
  • Funcional (Functional): Todos os elementos contribuem para a realização de uma função claramente definida.

O acoplamento (Coupling) é uma medida de dependência entre diferentes módulos. Um baixo acoplamento significa que os módulos são relativamente independentes entre si. Reduzir o acoplamento torna o sistema mais flexível, manutenível e testável.

Exemplos de níveis de acoplamento (de alto a baixo):

  • Por conteúdo (Content): Um módulo acessa diretamente os dados internos ou a implementação de outro módulo.
  • Comum (Common): Os módulos usam uma área de dados global compartilhada.
  • Por controlo (Control): Um módulo passa uma bandeira de controlo que determina o comportamento de outro módulo.
  • Por estampagem (Stamp): Transferência de dados compostos (objetos, estruturas), mas o módulo usa apenas uma parte deles.
  • Por dados (Data): Transferência de dados simples como parâmetros.
  • Por mensagens (Message): Os módulos trocam mensagens (por exemplo, através de eventos, interfaces). Esta é a forma mais fraca de acoplamento.

O objetivo de um bom design: alta coesão (dentro dos módulos) e baixo acoplamento (entre os módulos).

<?php

// Exemplo de alta coesão (Cohesão Funcional)
// Esta classe está focada apenas no processamento de utilizadores
class UserManager {
    private array $users = [];

    public function addUser(string $name): void {
        $this->users[] = $name;
    }

    public function getUsers(): array {
        return $this->users;
    }

    public function deleteUser(string $name): void {
        $this->users = array_filter($this->users, fn($user) => $user !== $name);
    }
}

// Exemplo de baixo acoplamento (Acoplamento de Dados)
// 'processOrder' depende apenas dos dados passados ($orderId, $amount)
class OrderProcessor {
    public function processOrder(int $orderId, float $amount): bool {
        // Lógica de processamento de pedido...
        // Não depende diretamente da implementação de outras classes,
        // apenas dos dados de entrada.
        echo "Processando pedido ID $orderId com valor $amount\n";
        return true;
    }
}

// Exemplo onde UserManager e OrderProcessor não têm uma dependência forte um do outro.
// Podem ser usados independentemente ou juntos, mas suas mudanças internas
// não afetam muito um ao outro.

?>