#Este é um post fechado Este post está disponível para assinantes da Java Magazine DIGITAL ou para quem possui Créditos DevMedia. Clique aqui para saber mais sobre como abrir este post!
Artigo Java Magazine 76 - Baixo Acoplamento
No artigo, abordaremos os diversos tipos de acoplamento de forma tanto conceitual quanto aplicada (com exemplos concretos).
Estatísticas:
Visualizações:
1741
Favoritado:
0 vez(es)
Serviços:

Java Magazine 76
[Artigo já está disponível no Leitor Digital DevMedia®. Clique aqui para acessá-lo]
> Clique aqui para ler todos os artigos da Java Magazine 76
[Artigo já está disponível no Leitor Digital DevMedia®. Clique aqui para acessá-lo]
> Clique aqui para ler todos os artigos da Java Magazine 76
Baixo Acoplamento
Todos os aspectos de uma boa prática muito citada, mas pouco entendida
Software de qualidade deve ter “baixo acoplamento” (loose coupling), mas o que isso significa? Muita coisa
Este artigo é dedicado a explorar o conceito de baixo acoplamento. O termo em sido muito ulgado, principalmente desde o aparecimento das tecnologias de web services e SOA, mas seu significado é bem mais amplo e atinge todos os aspectos do desenvolvimento de software, da análise até a programação. Podemos chamar o baixo acoplamento de um “meta-paradigma”, uma boa-prática de grande alcance que pode ser integrada como princípio fundamental de qualquer metodologia ou ferramenta de desenvolvimento.
Tentaremos explicar a importância do baixo acoplamento, mostrar como este conceito se aplica de forma concreta em ersos artefatos de um projeto de software, e oferecer diretrizes para incorporar esta boa prática ao seu trabalho.
O que é Acoplamento
A definição formal é simples: Acoplamento é o grau de dependência entre dois artefatos. Esta dependência é uma medida da quantidade de informações que um artefato deve possuir sobre o outro para que as colaborações necessárias entre ambos possam ocorrer. “Artefato” pode ser praticamente qualquer coisa que faz parte do projeto – uma classe, método, componente, pacote, tabela, protocolo de comunicação, sistema externo, ator (inclusive humano), documento, etc.
Para definições mais detalhadas, minha fonte favorita é esta wiki, que trata dos conceitos afins de acoplamento e coesão: c2.com/cgi/wiki?CouplingAndCohesion.
Exemplo: Acoplamento de APIs
Começando por um exemplo concreto de acoplamento de código, vou recorrer a um dos exemplos didáticos mais manjados, um sistema bancário. Temos um cliente web ou móvel, que deseja conectar-se ao banco e obter um extrato dos últimos 30 dias de movimento para uma conta. Isso pode ser implementado de várias formas, de acordo com a interface remota do sistema bancário.
Banco banco = ... // Algum tipo de lookup: JNDI, web service, etc.
Map<Integer, Agencia> agencias = banco.getAgencias();
Agencia ag = agencias.get(1234);
Map<Integer, Conta> contas = ag.getContas();
Conta conta = contas.get(999999);
List<Lancamento> = conta.getUltimosLancamentos(30);
Utilizei variáveis intermediárias (como agencias) apenas para expor a interface das classes utilizadas. Algumas variáveis poderiam ser eliminadas, por exemplo Agencia ag = banco.getAgencias().get(1234), mas isso não teria qualquer impacto sobre a discussão de acoplamento.
Este primeiro exemplo ilustra um nível de acoplamento alto entre o programa cliente e o sistema bancário, pois a API deste sistema expõe muitos detalhes internos: a existência de vários objetos (Banco, Agencia e Conta); os relacionamentos entre eles (“1 Banco tem N Agencias”), e mesmo as estruturas de dados usadas para manipular estes relacionamentos (como um Set<Integer, Agencia>). Cada elemento inidual da interface do sistema bancário está destacado em negrito; isso oferece uma visão simples (ainda que grosseira) da quantidade de acoplamento.
Compare isso com um design de baixo acoplamento para o mesmo problema:
Banco banco = ... // Algum tipo de lookup: JNDI, web service, etc.
List<Lancamento> = banco.getUltimosLancamentos(1234, 999999, 30);
Nesta segunda versão, Banco implementa o design pattern Facade, expondo de forma direta todos os métodos úteis para clientes externos, como getUltimosLancamentos(). Cada método desses recebe todos os parâmetros necessários para o contexto da operação, como no caso, os códigos da agência e da conta – assim, não precisamos expor os objetos Agencia e Conta, nem seus relacionamentos.
A importância do Acoplamento Fraco
Devemos procurar reduzir o acoplamento entre artefatos do sistema, pelo motivo bem conhecido de facilitar a evolução independente de cada um destes artefatos. No exemplo, se mudarmos alguma coisa nos relacionamentos Banco/Agencia/Conta, a primeira versão do nosso código de consulta de extrato poderá precisar de alterações, mas a segunda versão não precisará. (O leitor poderá argumentar que isso é um benefício do design pattern Facade, mas a redução de acoplamento é um dos objetivos deste pattern, bem como vários outros.)
Acoplamento de Código
Vamos nos estender um pouco mais sobre o acoplamento de código, que é um dos tipos de acoplamento ma >">
ATENÇÃO! A EXIBIÇÃO DESTE ARTIGO FOI INTERROMPIDA.
#Este é um post fechado
Este post está disponível para assinantes da Java Magazine DIGITAL ou para quem possui Créditos DevMedia. Clique aqui para saber mais sobre como abrir este post!
Todos os aspectos de uma boa prática muito citada, mas pouco entendida
Software de qualidade deve ter “baixo acoplamento” (loose coupling), mas o que isso significa? Muita coisa
Este artigo é dedicado a explorar o conceito de baixo acoplamento. O termo em sido muito ulgado, principalmente desde o aparecimento das tecnologias de web services e SOA, mas seu significado é bem mais amplo e atinge todos os aspectos do desenvolvimento de software, da análise até a programação. Podemos chamar o baixo acoplamento de um “meta-paradigma”, uma boa-prática de grande alcance que pode ser integrada como princípio fundamental de qualquer metodologia ou ferramenta de desenvolvimento.
Tentaremos explicar a importância do baixo acoplamento, mostrar como este conceito se aplica de forma concreta em ersos artefatos de um projeto de software, e oferecer diretrizes para incorporar esta boa prática ao seu trabalho.
O que é Acoplamento
A definição formal é simples: Acoplamento é o grau de dependência entre dois artefatos. Esta dependência é uma medida da quantidade de informações que um artefato deve possuir sobre o outro para que as colaborações necessárias entre ambos possam ocorrer. “Artefato” pode ser praticamente qualquer coisa que faz parte do projeto – uma classe, método, componente, pacote, tabela, protocolo de comunicação, sistema externo, ator (inclusive humano), documento, etc.
Para definições mais detalhadas, minha fonte favorita é esta wiki, que trata dos conceitos afins de acoplamento e coesão: c2.com/cgi/wiki?CouplingAndCohesion.
Exemplo: Acoplamento de APIs
Começando por um exemplo concreto de acoplamento de código, vou recorrer a um dos exemplos didáticos mais manjados, um sistema bancário. Temos um cliente web ou móvel, que deseja conectar-se ao banco e obter um extrato dos últimos 30 dias de movimento para uma conta. Isso pode ser implementado de várias formas, de acordo com a interface remota do sistema bancário.
Banco banco = ... // Algum tipo de lookup: JNDI, web service, etc.
Map<Integer, Agencia> agencias = banco.getAgencias();
Agencia ag = agencias.get(1234);
Map<Integer, Conta> contas = ag.getContas();
Conta conta = contas.get(999999);
List<Lancamento> = conta.getUltimosLancamentos(30);
Utilizei variáveis intermediárias (como agencias) apenas para expor a interface das classes utilizadas. Algumas variáveis poderiam ser eliminadas, por exemplo Agencia ag = banco.getAgencias().get(1234), mas isso não teria qualquer impacto sobre a discussão de acoplamento.
Este primeiro exemplo ilustra um nível de acoplamento alto entre o programa cliente e o sistema bancário, pois a API deste sistema expõe muitos detalhes internos: a existência de vários objetos (Banco, Agencia e Conta); os relacionamentos entre eles (“1 Banco tem N Agencias”), e mesmo as estruturas de dados usadas para manipular estes relacionamentos (como um Set<Integer, Agencia>). Cada elemento inidual da interface do sistema bancário está destacado em negrito; isso oferece uma visão simples (ainda que grosseira) da quantidade de acoplamento.
Compare isso com um design de baixo acoplamento para o mesmo problema:
Banco banco = ... // Algum tipo de lookup: JNDI, web service, etc.
List<Lancamento> = banco.getUltimosLancamentos(1234, 999999, 30);
Nesta segunda versão, Banco implementa o design pattern Facade, expondo de forma direta todos os métodos úteis para clientes externos, como getUltimosLancamentos(). Cada método desses recebe todos os parâmetros necessários para o contexto da operação, como no caso, os códigos da agência e da conta – assim, não precisamos expor os objetos Agencia e Conta, nem seus relacionamentos.
A importância do Acoplamento Fraco
Devemos procurar reduzir o acoplamento entre artefatos do sistema, pelo motivo bem conhecido de facilitar a evolução independente de cada um destes artefatos. No exemplo, se mudarmos alguma coisa nos relacionamentos Banco/Agencia/Conta, a primeira versão do nosso código de consulta de extrato poderá precisar de alterações, mas a segunda versão não precisará. (O leitor poderá argumentar que isso é um benefício do design pattern Facade, mas a redução de acoplamento é um dos objetivos deste pattern, bem como vários outros.)
Acoplamento de Código
Vamos nos estender um pouco mais sobre o acoplamento de código, que é um dos tipos de acoplamento ma >">
ATENÇÃO! A EXIBIÇÃO DESTE ARTIGO FOI INTERROMPIDA.
#Este é um post fechado Este post está disponível para assinantes da Java Magazine DIGITAL ou para quem possui Créditos DevMedia. Clique aqui para saber mais sobre como abrir este post!



Java 7: Linguagem - Java Magazine 82

JavaFX 1.3 - Java Magazine 81

Introdução à JMS com Java EE 6 - Java Magazine 80

Devorando Dados em Java - Java Magazine 79

Artigo Java Magazine 78 - Java à Moda do Freguês

Artigo Java Magazine 77 - NetBeans 6.8 e JavaFX Composer

Artigo Java Magazine 76 - Baixo Acoplamento

Artigo Java Magazine 75 - Gerenciando Memória e Recursos

Artigo Java Magazine 74 - JVM Language Summit

Artigo Java Magazine 73 - Introdução ao Terracotta

Artigo Java Magazine 72 - Uma “Aplicação Comum” com JavaFX


JavaFX 1.3 - Java Magazine 81

Introdução à JMS com Java EE 6 - Java Magazine 80

Devorando Dados em Java - Java Magazine 79

Artigo Java Magazine 78 - Java à Moda do Freguês

Artigo Java Magazine 77 - NetBeans 6.8 e JavaFX Composer

Artigo Java Magazine 76 - Baixo Acoplamento

Artigo Java Magazine 75 - Gerenciando Memória e Recursos

Artigo Java Magazine 74 - JVM Language Summit

Artigo Java Magazine 73 - Introdução ao Terracotta

Artigo Java Magazine 72 - Uma “Aplicação Comum” com JavaFX


Introdução a JavaServer Faces

Introdução ao JBoss Seam

(tutorial) Aprenda a persistir dados em suas aplicações Java utilizando Hibernate

Aplicação Completa Utilizando Hibernate

Introdução a Design Patterns

Desvendando o JPA

Introdução ao ASP

Curso Completo MySQL

jQuery – A Biblioteca JavaScript para Webdesigners


Introdução ao JBoss Seam

(tutorial) Aprenda a persistir dados em suas aplicações Java utilizando Hibernate

Aplicação Completa Utilizando Hibernate

Introdução a Design Patterns

Desvendando o JPA

Introdução ao ASP

Curso Completo MySQL

jQuery – A Biblioteca JavaScript para Webdesigners


Artigo Java Magazine 78 - Java à Moda do Freguês

Artigo Java Magazine 77 - NetBeans 6.8 e JavaFX Composer

Artigo Java Magazine 76 - Baixo Acoplamento

Artigo Java Magazine 75 - Gerenciando Memória e Recursos

Artigo Java Magazine 74 - JVM Language Summit

Artigo Java Magazine 73 - Introdução ao Terracotta

Artigo Java Magazine 72 - Uma “Aplicação Comum” com JavaFX

Artigo Java Magazine 71 - Releases da JavaOne:

Artigo Java Magazine 70 - Galileo: Eclipse 3.5 e WTP 3.1

Artigo Java Magazine 70 - Editorial

Artigo Java Magazine 69 - JavaFX Script

Artigo Java Magazine 69 - Editorial

Artigo Java Magazine 68 - JavaFX: Tutorial

Artigo Java Magazine 68 - Editorial

Artigo Java Magazine 67 - JavaFX: RIA a todo vapor

Artigo Java Magazine 67 - Editorial

Artigo Java Magazine 66 - Bytecode: Escondendo e Revelando

Artigo Java Magazine 66 - Editorial

Artigo Java Magazine 65 - Java: Uma perspectiva

Artigo Java Magazine 65 - Editorial

Artigo Java Magazine 64 - Testes de Carga com o JMeter e NetBeans

Artigo Java Magazine 64 - Editorial

Artigo Java Magazine 63 - A Guerra do RIA

Artigo Java Magazine 63 - Editorial

Artigo Java Magazine 62 - Integração Contínua com o Hudson

Artigo Java Magazine 62 - Editorial

Artigo Java Magazine 61 - WTP 3.0

Artigo Java Magazine 61 - Editorial

Artigo Java Magazine 21 - Gerenciamento em Java

Artigo Java Magazine 40 - Caminhos do Java

Artigo Java Magazine 40 - Java Open Source!

Artigo Java Magazine 40 - Tira-Dúvidas

Artigo Java Magazine 60 - A memória do Java

Artigo Java Magazine 60 - Editorial

Artigo Java Magazine 59 - Eclipse 3.4 Ganymede

Artigo Java Magazine 59 - Quick Update: A Crise dos Threads

Artigo Java Magazine 59 - Editorial

Artigo Java Magazine 41 - Java EE 5 na Prática

Artigo Java Magazine 28 - Migrando para o Java 5

Artigo Java Magazine 28 - Tira-Dúvidas

Artigo Java Magazine 31 - Novas Fronteiras do Java

Artigo Java Magazine 01 - J2EE Fundamental

Artigo Java Magazine 23 - O Projeto Eclipse

Artigo Java Magazine 22 - XML Turbinado com Java

Artigo Java Magazine 46 - Programação Java EE: Parte 3

Artigo Java Magazine 27 - Migrando para o Java 5

Artigo Java Magazine 17 - Anotações no J2SE 5.0

Artigo Java Magazine 16 - Genéricos no J2SE 5.0

Artigo Java Magazine 26 - Persistência Turbinada II

Artigo Java Magazine 13 - Raio x do Tiger

Artigo Java Magazine 55 - Editorial

Artigo Java Magazine 58 - EclipseCon 2008: Destaques

Artigo Java Magazine 57 - Programando com Pools

Artigo Java Magazine 57 - editorial

Artigo Java Magazine 11 - Concorrência e a JVM

Artigo Java Magazine 25 - Persistência Turbinada

Artigo Java Magazine 24 - JVMs Alternativas

Artigo Java Magazine 24 - EclipseCon 2005

Artigo Java Magazine 32 - Groovy: Java Através de Scripts

Artigo Java Magazine 36 - Qualidade Aplicada

Artigo Java Magazine 35 - Otimizando Código Java

Artigo Java Magazine 37 - 10 Mais do Eclipse 3.2

Artigo Java Magazine 38 - Relatórios e Gráficos com Eclipse

Artigo Java Magazine 34 - Entendendo Web Services

Artigo Java Magazine 19 - Byte Code

Artigo Java Magazine 19 - Cafeína

Artigo Java Magazine 20 - Byte Code

Artigo Java Magazine 14 - A dinâmica de Java

Artigo Java Magazine 15 - Programação com Regras

Artigo Java Magazine 33 - Prepare-se para o Mustang

Artigo Java Magazine 30 - Mais Performance com Java

Artigo Java Magazine 29 - Examinando o Mustang

Artigo Java Magazine 29 - Demonstrando o Apache Derby

Artigo Java Magazine 18 - Coleções de ponta a ponta

Artigo Java Magazine 39 - Java EE 5

Artigo Java Magazine 42 - Dados e Mapeamento: uma Visão Total

Artigo Java Magazine 12 - Tiger: A Evolução de Java

Artigo Java Magazine 43 - Oracle para Desenvolvedores Java

Artigo Java Magazine 44 - A Plataforma Java ME

Artigo Java Magazine 45 - Mini-curso: programação Java ME

Artigo Java Magazine 47 - Eclipse 3.3

Artigo Java Magazine 47 - Programação Java ME

Artigo Java Magazine 48 - Programação Java ME

Artigo Java Magazine 55 - Dicas para Qualidade

Artigo Java Magazine 55 - Expressões Regulares em Java

Artigo Java Magazine 54 - Editorial

artigo java magazine 53 - Eclipse x NetBeans

artigo java magazine 53 - Perspectivas para um Mundo Paralelo

Artigo Java Magazine 52 - GlassFish v2: O Novo Desafiante

Artigo Java Magazine 56 - Programação Funcional (ou quase) em Java

artigo java magazine 51 - JAVA EE NO ECLIPSE COM WTP 2.0

Artigo Java Magazine 56 - Opinião: Android versus Java ME

Artigo Java Magazine 50 - Programação à prova de balas

Artigo java magazine 49 - Mini-curso de java ME: Parte 6

Artigo Java Magazine 05 - Memória e desempenho

Artigo Java Magazine 03 - Performance em Java


Artigo Java Magazine 77 - NetBeans 6.8 e JavaFX Composer

Artigo Java Magazine 76 - Baixo Acoplamento

Artigo Java Magazine 75 - Gerenciando Memória e Recursos

Artigo Java Magazine 74 - JVM Language Summit

Artigo Java Magazine 73 - Introdução ao Terracotta

Artigo Java Magazine 72 - Uma “Aplicação Comum” com JavaFX

Artigo Java Magazine 71 - Releases da JavaOne:

Artigo Java Magazine 70 - Galileo: Eclipse 3.5 e WTP 3.1

Artigo Java Magazine 70 - Editorial

Artigo Java Magazine 69 - JavaFX Script

Artigo Java Magazine 69 - Editorial

Artigo Java Magazine 68 - JavaFX: Tutorial

Artigo Java Magazine 68 - Editorial

Artigo Java Magazine 67 - JavaFX: RIA a todo vapor

Artigo Java Magazine 67 - Editorial

Artigo Java Magazine 66 - Bytecode: Escondendo e Revelando

Artigo Java Magazine 66 - Editorial

Artigo Java Magazine 65 - Java: Uma perspectiva

Artigo Java Magazine 65 - Editorial

Artigo Java Magazine 64 - Testes de Carga com o JMeter e NetBeans

Artigo Java Magazine 64 - Editorial

Artigo Java Magazine 63 - A Guerra do RIA

Artigo Java Magazine 63 - Editorial

Artigo Java Magazine 62 - Integração Contínua com o Hudson

Artigo Java Magazine 62 - Editorial

Artigo Java Magazine 61 - WTP 3.0

Artigo Java Magazine 61 - Editorial

Artigo Java Magazine 21 - Gerenciamento em Java

Artigo Java Magazine 40 - Caminhos do Java

Artigo Java Magazine 40 - Java Open Source!

Artigo Java Magazine 40 - Tira-Dúvidas

Artigo Java Magazine 60 - A memória do Java

Artigo Java Magazine 60 - Editorial

Artigo Java Magazine 59 - Eclipse 3.4 Ganymede

Artigo Java Magazine 59 - Quick Update: A Crise dos Threads

Artigo Java Magazine 59 - Editorial

Artigo Java Magazine 41 - Java EE 5 na Prática

Artigo Java Magazine 28 - Migrando para o Java 5

Artigo Java Magazine 28 - Tira-Dúvidas

Artigo Java Magazine 31 - Novas Fronteiras do Java

Artigo Java Magazine 01 - J2EE Fundamental

Artigo Java Magazine 23 - O Projeto Eclipse

Artigo Java Magazine 22 - XML Turbinado com Java

Artigo Java Magazine 46 - Programação Java EE: Parte 3

Artigo Java Magazine 27 - Migrando para o Java 5

Artigo Java Magazine 17 - Anotações no J2SE 5.0

Artigo Java Magazine 16 - Genéricos no J2SE 5.0

Artigo Java Magazine 26 - Persistência Turbinada II

Artigo Java Magazine 13 - Raio x do Tiger

Artigo Java Magazine 55 - Editorial

Artigo Java Magazine 58 - EclipseCon 2008: Destaques

Artigo Java Magazine 57 - Programando com Pools

Artigo Java Magazine 57 - editorial

Artigo Java Magazine 11 - Concorrência e a JVM

Artigo Java Magazine 25 - Persistência Turbinada

Artigo Java Magazine 24 - JVMs Alternativas

Artigo Java Magazine 24 - EclipseCon 2005

Artigo Java Magazine 32 - Groovy: Java Através de Scripts

Artigo Java Magazine 36 - Qualidade Aplicada

Artigo Java Magazine 35 - Otimizando Código Java

Artigo Java Magazine 37 - 10 Mais do Eclipse 3.2

Artigo Java Magazine 38 - Relatórios e Gráficos com Eclipse

Artigo Java Magazine 34 - Entendendo Web Services

Artigo Java Magazine 19 - Byte Code

Artigo Java Magazine 19 - Cafeína

Artigo Java Magazine 20 - Byte Code

Artigo Java Magazine 14 - A dinâmica de Java

Artigo Java Magazine 15 - Programação com Regras

Artigo Java Magazine 33 - Prepare-se para o Mustang

Artigo Java Magazine 30 - Mais Performance com Java

Artigo Java Magazine 29 - Examinando o Mustang

Artigo Java Magazine 29 - Demonstrando o Apache Derby

Artigo Java Magazine 18 - Coleções de ponta a ponta

Artigo Java Magazine 39 - Java EE 5

Artigo Java Magazine 42 - Dados e Mapeamento: uma Visão Total

Artigo Java Magazine 12 - Tiger: A Evolução de Java

Artigo Java Magazine 43 - Oracle para Desenvolvedores Java

Artigo Java Magazine 44 - A Plataforma Java ME

Artigo Java Magazine 45 - Mini-curso: programação Java ME

Artigo Java Magazine 47 - Eclipse 3.3

Artigo Java Magazine 47 - Programação Java ME

Artigo Java Magazine 48 - Programação Java ME

Artigo Java Magazine 55 - Dicas para Qualidade

Artigo Java Magazine 55 - Expressões Regulares em Java

Artigo Java Magazine 54 - Editorial

artigo java magazine 53 - Eclipse x NetBeans

artigo java magazine 53 - Perspectivas para um Mundo Paralelo

Artigo Java Magazine 52 - GlassFish v2: O Novo Desafiante

Artigo Java Magazine 56 - Programação Funcional (ou quase) em Java

artigo java magazine 51 - JAVA EE NO ECLIPSE COM WTP 2.0

Artigo Java Magazine 56 - Opinião: Android versus Java ME

Artigo Java Magazine 50 - Programação à prova de balas

Artigo java magazine 49 - Mini-curso de java ME: Parte 6

Artigo Java Magazine 05 - Memória e desempenho

Artigo Java Magazine 03 - Performance em Java


Configuração no cliente - WCF

Revista Engenharia de Software 28

Reuso de Software utilizando Padrões de Análise - Engenharia de Software 28

Refatoração para Padrões - Engenharia de Software 28

Auditoria de sistemas - Engenharia de Software 28

O Papel Evolutivo do Software - Engenharia de Software 28

Requisitos em SOA – Parte 1 - Engenharia de Software 28

Negociação de Contratos - Engenharia de Software 28

Há um colega chato em seu local de trabalho? - Engenharia de Software 28

Gerando o MD5 a ser impresso no cupom fiscal


Revista Engenharia de Software 28

Reuso de Software utilizando Padrões de Análise - Engenharia de Software 28

Refatoração para Padrões - Engenharia de Software 28

Auditoria de sistemas - Engenharia de Software 28

O Papel Evolutivo do Software - Engenharia de Software 28

Requisitos em SOA – Parte 1 - Engenharia de Software 28

Negociação de Contratos - Engenharia de Software 28

Há um colega chato em seu local de trabalho? - Engenharia de Software 28

Gerando o MD5 a ser impresso no cupom fiscal


Você está em:




Conheça os planos de créditos DevMedia e visualize esse post agora mesmo!


