Just Java 2011 – Baixo Acoplamento e Alta Coesão

maio 18, 2011 às 12:56 am | Publicado em apresentações, Desenvolvimento, Java | 2 Comentários

Este ano eu participei do Just Java  com uma palestra sobre o seguinte tema:

Desenvolvendo em java visando o baixo acoplamento.

A apresentação foi bem legal e creio que consegui passar a mensagem para o pessoal. Por falar nisso, agradeço a todos que pararam alguns minutos pra me escutar.

Abaixo segue os slides da apresentação. O código fonte utilizado durante a apresentação está aqui.

Anúncios

Linguagens dinâmicas

junho 19, 2009 às 10:52 pm | Publicado em Desenvolvimento, Outros, ruby | 3 Comentários

Linguagem dinâmica, também conhecida como linguagem de scripting, ainda é algo obscuro para a grande maioria dos desenvolvedores. Entender e aplicar seus conceitos é algo que pode causar espanto e muitas dúvidas. Porém, é importante conhecer as vantagens e destantagens deste tipo de linguagem, saber quando é válido ou não a sua utilização no desenvolvimento de sistemas.

Estas linguagens são linguagens de alto nível, a grande maioria com tipagem dinâmica e com um Protocolo de Meta-Objeto (Meta-Object Protocol), ou MOP. Estas duas características proporcionam muitas facilidades e um enorme poder no desenvolvimento. Porém, quando não usadas com cuidado, podem causar grandes problemas.

Tipagem dinâmica é muito criticada pela comunidade de desenvolvedores, principalmente porque “escondem” alguns erros em tempo de desenvolvimento (compilação). Linguagens dinâmicas não são compiladas, portanto tipagem dinâmica faz todo sentido. Porém, existe algumas linguagens dinâmicas que utilizam de tipagem estática, como Groovy, para utilizar de técnicas como overloading de métodos e de construtor.

Meta-Object Protocol sem dúvida é a grande vantagem das linguagens dinâmicas. Em linguagens de programação como java, os objetos armazenam seus métodos e seus atributos. Com MOP, cada objeto tem um meta objeto associado e é no meta objeto que ficam os métodos. O objeto é responsável por armazenar seu estado. A grande vantagem é a possibilidade de alterar o meta objeto em tempo de execução e adicionar novas funcionalidades nos objetos.

Com o surgimento do Ruby e do framework Ruby on Rails, as linguagens dinâmicas vem ganhando força. Muitas empresas que utilizam metodologias agéis, estão aderindo a este tipo de linguagem, principalmente ao Ruby on Rails. Portanto, é visível que as linguagens dinâmicas e principalmente a linguagem Ruby poderá ser o próximo “boom” no desenvolvimento de software.

Baixo Acoplamento

fevereiro 10, 2009 às 1:19 pm | Publicado em Desenvolvimento, Java | 3 Comentários

Programar é uma tarefa ardua e programar um código que siga os bons princípios é mais ainda. Na correria do dia a dia, acaba-se esquecendo das boas práticas e o resultado é um código “macarrônico” totalmente sem padrão. Um colega sempre dizia “Programar bem é uma arte!!!”.

Neste post será abordado um princípio muito importante para sistemas orientados a objeto, o desacoplamento do código. Todo o artigo será baseado no estudo de caso de uma pequena API para envio de malas diretas.

Abaixo segue a modelagem do problema:

Modelagem

A classe mala direta é responsável por enviar uma mensagem a um grupo de destinatários. Para isso, ela utiliza do componente “EnviadorEmail”. Segue a implementação da mesma:

 

Código

O exemplo acima demonstra um exemplo de código altamente acoplado. Isto se caracteriza pela utilização direta de uma classe concreta (new EnviadorEmail()), acarretando em um problema muito grave: Torna-se impossível trocar a forma de envio da mala direta em tempo de execução pois o código está altamente acoplado com o componente EnviadorEmail.

Desacoplando o código:

Desacoplar um código consiste em montar um design que o deixe mais fléxivel a mudanças. Programar um código desacoplado garante uma maior qualidade e facilita futuras mudanças.

Erich Gamma, o criador do Eclipse, JUnit e co-autor do famoso livro “Padrões de Projeto” disse em uma entrevista: “Program to an interface, not an implementation”.

Programar para interface deixa o código mais flexível, permitindo trocar a implementação de um componente em tempo de execução. Refatorando o nosso design para utilizar interfaces:

Modelagem

Refatorando o código da MalaDireta:

Código

Quando um código depende de uma interface, pode-se decidir em tempo de execução qual a implementação será utilizada. Um exemplo pode ser verificado na imagem abaixo:

Código

Porém ainda existe um pequeno acoplamento no método enviar. O método ainda precisa dar o new em uma implementação, o que o torna fortemente acoplado a ela. O ideal é que outro componente tome a decisão de qual implementação criar. A função da MalaDireta é enviar sua mensagem. Não é sua responsabilidade saber de qual forma.

Factory

O design pattern Factory tem como função separar a lógica de criação de objetos em um outro componente (fábrica). No exemplo acima, pode-se ter o EnviadorFactory. Uma forma de implementação do factory pode ser visto abaixo:

Código

Refatorando a classe MalaDireta para utilizar a fábrica:

Código

Utilizando a fábrica foi possível separar a lógica de criação da forma de envio das malas diretas, porém o método agora ficou acoplado com a fábrica. Utilizar fábricas solucionou apenas parte do problema, como desacoplar totalmente o código da MalaDireta???

Inversão de Controle

Martin Fowler escreveu em seu site um artigo muito interessante sobre Inversão de Controle (IoC). O artigo levanta uma interessante discussão: Qual controle da aplicação está sendo invertido???

A inversão de controle consiste em uma mudança na forma como são criadas as dependências dos objetos. No exemplo utilizando fábricas, o método “pede” para a fábrica uma dependência. Na visão da IoC, não é mais o código que pede por uma dependência, ele apenas declara que precisa de determinado componente e ele é disponibilizado.

Seguindo este princípio, Martin Fowler questiona se o nome correto para a Inversão de Controle não seria Injeção de Dependência. Segundo ele, a mudança afeta a forma como são gerenciadas as dependêcnias que agora são injetadas nos objetos, eliminando assim o uso da palavra new no código:

Código

A classe acima declara em seu construtor que precisa de uma implementação de IEnviador. Ou seja, alguém irá “injetar” esta dependência. O método enviar não sabe pra onde está enviando sua mensagem. O código está totalmente desacoplado!!!!

Exemplo de um código que utiliza a MalaDireta:

Código

 

Com um código totalmente desacoplado, fica fácil criar testes unitários e consequentemente aumenta a qualidade do código.

Infelizmente não são todos os desenvolvedores que possuem esta preocupação. Mas espero que este pequeno artigo tenha gerado uma grande reflexão sobre como construir componentes de verdade.

Sempre que for codificar, lembre-se da frase: “Programe para interfaces e não para implementações!”.

Linguagem fortemente tipada (Strong typing)

fevereiro 28, 2008 às 2:19 am | Publicado em Desenvolvimento, Java, JavaScript, ruby | 28 Comentários

Em uma conversa com uma professora da faculdade, surgiu uma pequena discussão.
O que é uma linguagem fortemente tipada?

Segundo a professora, linguagem fortemente tipada é aquela onde você precisa declarar o tipo da variável, por exemplo:

// código java
private String nome;

Na minha opinião, ela está enganada.
A principal característica de uma linguagem fortemente tipada (Strong typing), é que cada variável do programa representa um objeto de um tipo bem definido.

// codigo java
int x = 12.1; // erro, tipos incompatíveis
int j = (int) 12.1 // funciona, mas você perde as casas decimais 🙂

Java é uma linguagem formente tipada. Não é possível atribuir um double para um int.
Para executar tal operação, você terá que forçar a tranformação para o tipo definido pela variável. Chamamos isso de cast. Java também é uma linguagem com tipagem estática, ou seja, você precisa declarar qual o tipo de objeto a variável irá referenciar.

Vejamos um exemplo em Ruby.

x = ‘Marcelo’
y = 12
puts x + y

A principal diferença que podemos notar é a ausência do tipo da variável. Mas isso não torna ruby uma linguagem fracamente tipada. O que acontecerá se você tentar somar (+) um Fixnum (int) com uma String? Um belo erro no console:
can’t convert Fixnum into String (TypeError)

Ou seja, ruby também é fortemente tipada, porém de forma dinâmica. O interpretador “descobre” em tempo de execução o tipo da variável. Devido a essa característica, em ruby não existe cast. Caso os tipos envolvidos na operação sejam incompatíveis, você terá um belo erro pra se preocupar.

Veja um exemplo em javascript:

var x = “Marcelo”;
var y = 12;
alert(x + y);

JavaScript é fracamente tipada (weak typing), ou seja, este código será executado sem problemas. Você não precisa informar o tipo da variável e o intepretador do javascript sabe realizar algumas operações sobre os objetos dependendo do contexto.

Espero que a professora leia este POST. 🙂

Internacionalização de Mensagens no JavaScript

novembro 5, 2007 às 8:14 am | Publicado em Desenvolvimento, Java, JavaScript | 11 Comentários

O java fornece um excelente suporte para internacionalização de aplicações. Para conhecer mais sobre internacionalização e como implementá-la em Java, indico este excelente artigo da Caelum.

Porém, em aplicações web, o uso de javascript é inevitável, seja para deixar a aplicação mais dinâmica ou para validar o preenchimento de um formulário. Portanto é necessário que as mensagens mostradas pelo javascript também estejam internacionalizadas. Neste artigo vamos demostrar uma forma bem simples e funcional de internacionalizar o javascript.

Veja o exemplo de uma função que faz a validação de um formulário:

valida1.jpg

Este exemplo tem um grande problema: a mensagem de erro está amarrada no código de validação. O legal seria que estas mensagens estivessem internacionalizadas, ou seja, fossem recuperadas de algum arquivo de mensagens, e este é nosso objetivo. 🙂

Depois de analisarmos o problema, vamos para a solução, que basicamente pode ser divida em 3 etapas:

  • ao carregar a pagina, uma requisição AJAX é feita para um servlet.
  • o serlvet recupera as mensagens de acordo com o locale do usuário.
  • as mensagens são retornadas para o cliente e armazenadas em memória pelo javascript.

Veja a implementação do serlvet. Basicamente ele recupera as mensagens de acordo com o locale do usuário, as transformam em um JSON que é retornado como resposta da requisição. (clique na imagem para ampliar).

servlet.jpg

Este servlet foi mapeado para a url “i18n”.

Caso tenha problemas com a acentuação das mensagens, basta alterar o content-type do response: pRes.setContentType(“text/html; charset=ISO-8859-1”);

Agora é preciso implementar o javascript que irá fazer a requisição AJAX para o servlet e tratar sua resposta.

js1.jpg

js2.jpg

Quando este script for carregado pelo browser, a requisição ajax será feita utilizando a função $.get(…) da biblioteca jQuery.

Quando a requisição retornar, o método initialize do bundle é invocado, recebendo como parâmetro o JSON retornado pelo servlet. Seu papel é simples, interpretar o JSON e inserir as mensagens em um array interno do objeto ResouceBundle.

Para recuperar uma mensagem do bundle, basta chamar o método get(key) .

Simples não???

Agora com a solução implementada, vamos modificar o script de validação para que ele pegue a mensagem de erro do bundle.

valida2.jpg

Podemos melhorar a nossa pequena API de internacionalização adicionando métodos para trabalhar com mensagens que esperam parâmetros, por exemplo:

invalidProtocol = O número de procolo {0} é inválido.

Veja o método get() melhorado, agora é possível passar os valores para substituir os parâmetros da mensagem.

getmelhorado.jpg

Após esta modificação, vamos ver como fica a função que valida o formulário:

valida3.jpg

Esta foi uma solução para implementar internacionalização de mensagens no javascript. E você, como é a sua solução???

Próxima Página »

Crie um website ou blog gratuito no WordPress.com.
Entries e comentários feeds.