Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Reflexões sobre Coesão e Acoplamento de Software

Reflexões sobre Coesão e Acoplamento de Software

A palestra traz uma reflexão prática e profunda sobre coesão e acoplamento, destacando sua importância na arquitetura de software. Ele também aborda os tipos de coesão (como funcional e acidental) e de acoplamento (implementação, temporal, aferente e eferente), além de boas práticas como injeção de dependência e o princípio da inversão de dependência, essenciais para evitar códigos frágeis e difíceis de evoluir. A palestra também contempla os temas como módulos, microsserviços e monolitos modulares, reforçando a importância desses conceitos tanto no nível de código quanto de arquitetura.

Avatar for Marcel dos Santos

Marcel dos Santos

January 27, 2026
Tweet

More Decks by Marcel dos Santos

Other Decks in Programming

Transcript

  1. Interaja nas mídias sociais! - fale sobre o evento, palestrantes

    e conteúdo - tire fotos do evento e publique - interaja com outros participantes do evento - tire dúvidas ou dê feedbacks para os palestrantes
  2. 1. seguir @marcelgsantos no LinkedIn 2. fazer publicação com as

    hashtags #coesao, #acoplamento e #devparana 3. me marcar na publicação 4. marcar o Dev Paraná 5. não vale publicação em branco Concorra a um livro da Casa do Código! 🤩 LinkedIn
  3. A coesão é uma medida que indica o grau de

    relação entre membros de um módulo.
  4. "Cohesi on ref er s to h ow s tron

    gly the int er nal elements of a module ar e related to each oth e . High cohesi on within modules is a hallm ar k of g oo d design." - L arr y C on stantine
  5. A baixa coesão é quando o grau de relação entre

    os membros de um módulo é baixo.
  6. A alta coesão é quando o grau de relação entre

    os membros de um módulo é alto.
  7. class Cart { private array $items; public function _ _

    construct() { $this - > items = []; } public function numberOfItems() : int { return count($this - > items); } public function calculateDeliveryPrice() : float { / / calcula o valor da entrega } }
  8. "A s tr uct ur e is stable if cohesi

    on is high, and c ou pling is l o ." - L arr y C on stantine
  9. A medida de coesão também pode ser observada em serviços,

    sejam eles módulos ou microsserviços.
  10. Todos os elementos de um serviço (seja um módulo ou

    um microsserviço) deveriam colaborar para o mesmo objetivo de negócio.
  11. Um serviço deve ser responsável por um único contexto de

    negócio alinhado a um contexto delimitado.
  12. "A coesão não é apenas um a tr ibuto de

    classes ou funções. Em sistemas mod er nos, ela é fundamental no nível de módulos e mi cr oss er viços."
  13. Alta coesão 1. nome claro e especí fi co 2.

    responsabilidade única 3. poucos motivos para mudança 4. métodos e atributos relacionados 5. facilidade para explicar
  14. Baixa coesão 1. nome genérico ou confuso 2. múltiplas responsabilidades

    3. muitos motivos para mudança 4. métodos e atributos não relacionados 5. di fi culdade para explicar
  15. A LCOM, lack of cohesion of methods ou falta de

    coesão dos métodos é uma métrica conhecida para medir a coesão de classes.
  16. O acoplamento ocorre quando o código de um módulo utiliza

    código de outro módulo, seja ao chamar uma função ou acessar algum dado.
  17. class Car { private Engine $engine; public function _ _

    construct() { $this - > engine = new Engine(); } public function start() : void { $this - > engine - > start(); } } $car = new Car(); $car - > start(); / / Liga o motor do carro
  18. "O ac op lamento diz respeito a uma alt er

    ação em um local ex ig ir uma mudança em outr o." - Sam Newman
  19. O acoplamento é uma medida inter- componentes, isto é, é

    uma medida entre componentes de um conjunto.
  20. Exemplo 1 Se um serviço de pedidos e um serviço

    de faturamento usam uma mesma tabela de pedidos, tem-se um acoplamento de dados.
  21. Acoplamento temporal É quando um serviço depende que o outro

    serviço esteja disponível no mesmo momento para funcionar.
  22. Exemplo 2 Se um serviço estiver fora do ar, o

    outro não consegue funcionar. Isso pode ser reduzido com a comunicação assíncrona.
  23. O acoplamento estático é aquele que pode ser identi fi

    cado a partir de análise estática.
  24. Exemplo 1 Se o componente A referencia os componen- tes

    B e C, diz-se que o componente A possui acoplamento eferente de 2.
  25. Exemplo 2 Se o componente B é referenciado pelo componente

    A, diz-se que o componente B possui acoplamento aferente de 1.
  26. Um componente com acoplamento aferente alto é um potencial ponto

    de falha crítico pois se ele quebrar, todas as suas dependências quebram.
  27. Os componentes com baixo acoplamento ou acoplamento fraco são considerados

    mais independentes ou menos acoplados que outros componentes.
  28. Os componentes com alto acoplamento ou acoplamento forte são considerados

    mais dependentes ou mais acoplados a outros componentes.
  29. O conceito de information hiding diz que um módulo deve

    "guardar para si" as informa- ções que o interessa com o objetivo de minimizar o conhecimento compartilhado.
  30. A injeção de dependência é uma técnica que permite reduzir

    o acoplamento entre classes ou módulos…
  31. / / Injeção de dependência via construtor class Car {

    private Engine $engine; public function _ _ construct(Engine $engine) { $this - > engine = $engine; } public function start() : void { $this - > engine - > start(); } }
  32. / / Injeta uma dependência de Engine em Car $engine

    = new Engine(); $car = new Car($engine); $car - > start(); / / Inicia o motor
  33. Utilizar injeção de dependências auxilia nos testes unitários pois tornam

    os módulos fracamente acoplados, altamente coesos e facilita o mocking de objetos.
  34. O princípio de inversão de dependência diz: 1. módulos de

    alto nível não devem depender de módulos de baixo nível 2. módulos de alto nível devem depender de abstrações e não de implementações 3. módulos de baixo nível também devem depender de abstrações
  35. / / Implementação concreta para obter as coordenadas a /

    / partir do endereço no Google Maps e OpenStreetMap. class GoogleMaps { public function getCoordinatesFromAddress(string $address) : Coordinate { / / Chama o serviço do GoogleMaps. } } class OpenStreetMap { public function getCoordinatesFromAddress(string $address) : Coordinate { / / Chama o serviço da OpenStreetMap. } }
  36. / / A classe StoreService depende de uma implementação /

    / concreta do serviço de geolocalização do GoogleMaps. class StoreService { public function getStoreCoordinates(Store $store) : Coordinate { $geolocation = new GoogleMaps(); return $geolocation - > getCoordinatesFromAddress($store - > getAddress()); } }
  37. / / Abstração do serviço de geolocalização (contrato). / /

    Toda implementação concreta deve obedecer este contrato. interface GeolocationService { public function getCoordinatesFromAddress(string $address) : Coordinate; }
  38. / / A implementação concreta deve obedecer o contrato. class

    GoogleMaps implements GeolocationService { public function getCoordinatesFromAddress(string $address) : Coordinate { / / Chama o serviço do GoogleMaps. } } class OpenStreetMap implements GeolocationService { public function getCoordinatesFromAddress(string $address) : Coordinate { / / Chama o serviço do OpenStreetMap. } }
  39. / / A classe deve depender da abstração (GeolocationService). class

    StoreService { private GeolocationService $geolocationService; public function _ _ construct(GeolocationService $geolocationService) { $this - > geolocationService = $geolocationService; } public function getStoreCoordinates(Store $store) : Coordinate { return $this - > geolocationService - > getCoordinatesFromAddress($store - > getAddress()); } }
  40. O acoplamento está em todos os lugares e é através

    dele que sistemas são organizados.
  41. Em vez de lutarmos contra o acoplamento, devemos usá-lo como

    uma ferramenta para projetar sistemas de software modulares.
  42. "Uma es tr ut ur a s er á estável

    se a coesão f or alta e o ac op lamento f or ba ix o." - L arr y C on stantine
  43. "A coesão e o ac op lamento são preocupações associadas

    a um softw ar e modul a ." - Sam Newman