quinta-feira, 11 de dezembro de 2008

Padrões de Projeto - Adapter

quinta-feira, 11 de dezembro de 2008
Prezados, no artigo anterior da série, falei sobre o padrão singleton e como o mesmo pode ser usado. Agora veremos sobre outro padrão de projeto chamado Adapter.

Adapter é um padrão que é usando quando se deseja adaptar sua classe para ser usada por outro objeto.

Exemplo:

Sua tomada em casa é de 2 pinos, mas o computador é de 3 pinos então usa-se um adaptador para ligar na tomada (beijamin).

O mesmo em Software:

tenho o seguinte problema:

Preciso comparar uma array de bytes com regex. só que regex somente aceita objetos do tipo CharSequence.
byte[] sca = "helo carlos".getBytes();   

Pattern p = Pattern.compile("^(?i)(helo) .+");   
Matcher m = p.matcher(sca);   
return m.matches();  


O código acima vai da erro, mas eu preciso usar array de bytes. o que fazer?

use um adaptador (Adapter) que adapta a array para ser usada como uma CharSequence,

veja a interface da charSequence:

public interface CharSequence {
int length();
char charAt(int index);
CharSequence subSequence(int start, int end);
public String toString();
}

Aqui está o adaptador:
public class CharSequenceByteArray implements CharSequence {

private byte[] buffer;

public CharSequenceByteArray(byte[] buffer) {
this.buffer = buffer;
}

public int length() {
return buffer.length;
}

public char charAt(int index) {
return (char) buffer[index];
}

public CharSequence subSequence(int start, int end) {
return new CharSequenceByteArray(Arrays.copyOfRange(buffer, start, end));
}
}

agora eu faço assim uso o adaptador:
byte[] sca = "helo carlos".getBytes();

Pattern p = Pattern.compile("^(?i)(helo) .+");
Matcher m = p.matcher(new CharSequenceByteArray(sca));
return m.matches();


Este código não da erro, porque eu adaptei uma interface em outra.

Isto é o padrão adapter.

Att. Carlos


Nenhum comentário :

Gerenciador de Projetos

quinta-feira, 11 de dezembro de 2008
Prezados,

Recentemente em minhas pesquisas pela net encontrei o trac, realmente achei muito bom a ferramenta mas ao pesquisar mais a fundo encontrei o RedMine um trac perfeito...

O Redmine é um gerenciador de projetos de TI, com ele você consegue saber como anda o seu projeto e controlar o desenvolvimento.

Tem ótimo suporte com sistemas de controle de Versão (CVS, SubVersion,GIT) e é multi-projeto.

Acessem a página do Redmine e confiram.

www.redmine.org


Nenhum comentário :

segunda-feira, 8 de dezembro de 2008

Piadas

segunda-feira, 8 de dezembro de 2008
... Arquivo não encontrado, falsifico? (S/N) ...


Nenhum comentário :

Padrões de projeto - Singleton

segunda-feira, 8 de dezembro de 2008
Quando estava iniciando o desenvolvimento orientado a objetos, sempre me perguntava, "para que serve um método estático?", "polimorfismo em que raios de situação usaria isto?", "há interfaces servem apenas para duplicar artefatos.".

E quanto mais passava o tempo mais as minhas pesquisas me mostravam que a orientação a objetos era algo de outro mundo, também para quem desenvolvia em Clipper e via muitas autoridades em programação falarem sobre a morte da orientação a objetos, que a orientação a objetos é ruim, que adiciona complexidade.

Hoje olhando para traz vejo que na verdade o que muitos destes tinham era medo da mudança, e de descobrir, tentar algo novo, o que me ajudou a ver a utilidade da orientação a objetos foi os padrões de projeto.

Quando estava iniciando o meu desenvolvimento em Java, acabei caindo em uma página que falava sobre padrões de projeto J2EE, mais especificamente o DAO. Agora sim me fazia sentido o uso de interfaces e outras coisas. Pude ver a utilidade de uma Factory, Interface, sobrecarga de métodos, etc. Afinal agora a coisa toda estava fazendo sentido.

Você também deve estar curioso, em ENTENDER o que é um padrão de projeto e como utilizá-lo. Pois bem, lá vai.

O que é um padrão de Projeto:

O modelo de programação orientado a objetos é um grande avanço visto que você pode componentizar e melhor organizar o seu sistema. Assim sendo podemos construir programas criando um conjunto de objetos e fazendo os mesmos conversarem entre sí para podermos obter um sistema. Um padrão de projeto é como uma receita de como construir os seus objetos e arranjá-los de forma que você consiga fazer o sistema ser fácil de manter. Vias de passagem manter um sistema não é uma tarefa fácil.

Portanto organizar o sistema de forma que o mesmo mude mais facilmente é muito desejável.

Os padrões de projeto se dividem em 3 partes, sendo que cada parte demonstra um padrão para uma área específica do sistema.
A divisão está entre padrões comportamentais, que mostram formas de os objetos interagirem entre si (comportamento), criacionais, mostrando a forma de criar objetos, e estruturais, no que tange as estruturas de seus objetos.

Nesta série de artigos veremos como os padrões podem nos ajudar, ao invés de apenas apresentar conceitos, veremos em que situações reais eles podem ser usados.

O primeiro padrão a ser apresentado será o Sigleton, este é um dos padrões mais simples de ser usado. E dependendo da situação ele pode ser realmente útil.

Até a próxima.


Nenhum comentário :

sexta-feira, 5 de dezembro de 2008

Maven - você deveria usar...

sexta-feira, 5 de dezembro de 2008
O que é o Maven é uma ferramenta indispensável para o desenvolvimento e gerenciamento de projetos, com certeza você como eu já ficamos de cabelo em pé, porque faltava alguma biblioteca no projeto, ou o sistema da erros estranhos simplesmente por falta de bibliotecas...

O Maven resolve isto de forma interessante, ele usa o conceito de dependência transitiva, assim o funcionamento se da através de um arquivo de configuração chamado POM, e um repositório de bibliotecas identificadas onde ao precisar de uma biblioteca por exemplo basta adicionar a sua identificação no arquivo POM que o Maven baixa a biblioteca no repositório local.

Estas são apenas algumas das funcionalidades do Maven.

Você com certeza todos deveriam usar.


Nenhum comentário :

domingo, 17 de agosto de 2008

Piadas de um computeiro: piada #1

domingo, 17 de agosto de 2008
Mouse não encontrado bater no gato?


Nenhum comentário :

Ordenação por mais de um campo

domingo, 17 de agosto de 2008
Algo comum no desenvolvimento java é a necessidade de ordenar objetos, o java com a API collections dele disponibiliza formas de efetuar esta tarefa, você pode fazer isto:
  1. Implementando a interface Comparable no objeto a ser comparado.
  2. Implementando um objeto comparador

Para a 1º situação você deve conforme a interface criar um método chamado compareTo, o retorno deste método deve ser um int (primitivo) onde deve conter o valor -1 se o objeto comparado foi menor do que o objeto atual, 0 se objeto for igual e 1 se o objeto for maior.

Para a situação 2 você deve fazer uma classe que implemente a interface Comparable como na situação 1.

para realizar a ordenação você deve utilizar um método estático da API Collections o SORT, este método sobrecarregado tem 2 implementações a primeira você passa a list que contém os seus objetos e ele coloca em ordem, lembrando que para ele fazer isto você deve implementar Comparable, caso contrário ele disparará uma exception, e a outra forma é passar a lista e o objeto comparador, desta forma você pode ordenar os seus objetos.

Mais ai vem um detalhe importante com a qual esta semana me deparei, precisei colocar não um só campo do objeto em ordem, mas sim 5 campos do objeto, como fazer isto? depois de pesquisar encontrei a solução a Apache tem uma API Common Collections e BeanUtil (veja as dependências) estas bibliotecas contém funções comuns e uma delas advinhem só, faz exatamente isto, segue um código de exemplo de ordenação por mais de um campo:

List sortFields = new ArrayList();

sortFields.add(new BeanComparator("nome"));
sortFields.add(new BeanComparator("sobrenome"));

ComparatorChain multiSort = new ComparatorChain(sortFields);

java.util.Collections.sort(clientes,multiSort);

O código acima faz a ordenação das lista de objetos clientes pelos campos nome e sobrenome, facilitando assim a ordenação de objetos.

espero que gostem da dica.



2 comentários :

Pérolas da Programação

domingo, 17 de agosto de 2008

Pérola 1

Essa é na verdade um par de pérolas.

Boolean.FALSE.toString ().toUpperCase ().equals ( meuObjeto.isControlado() )

Quando vi o código acima, já achei ridículo o fato do programador usar a expressão Boolean.FALSE.toString().toUpperCase() apenas para gerar uma string “FALSE”. Poderia ter sido mais simples escrever "FALSE".equals(meuObjeto.isControlado())
Provavelmente o desenvolvedor queria se prevenir. Vai que false resolve mudar de nome no meio do caminho! E daí eu me perguntei: porque ele está testando string? Daí encontrei a seguinte função:
public String isControlado () {
if ( this.getElementos () != null ) {
if ( this.getElementos ().size () > 0 ) {
return "TRUE";
}
return "FALSE";
}
return "FALSE";
}
Perfeito. Porque usar lógica booleana?

Pérola 2


public List procuraPorExemplo(int arg0, boolean arg1){
return super.procuraPorExemplo(arg0, arg1);
}

Pérola 3

sem comentários


public static boolean verificaAMaiorB(int a, int b) {
boolean resultado = false;
if (a > b) {
resultado = true;
}
return resultado;
}


Pérola 4

if ( objeto != null ) {
lista = procura( objeto );// XXX
} else {
lista = procura ( null );
}

Pérola 5


if ( comandoEscala.equals ( "alterar" ) == Boolean.FALSE ){
....
}

retirado do http://www.log4dev.com/



Nenhum comentário :

sexta-feira, 8 de agosto de 2008

Apache Mina

sexta-feira, 8 de agosto de 2008
Estou desenvolvendo um anti-spam que atualmente esta usando um pool de thread. Em busca de desempenho, estava pesquisando sobre a biblioteca do java a "nio" que o foco em performance, e achei um pouco complicado alguns conceitos até encontrar o "Apache Mina", este framework ajuda no uso do java seguindo o tutorial consegui implementar um servidor de eco muito facilmente, e caso precise de manter a sessão da conexão podemos usar um objeto session do Mina.



Algo que também facilita muito a utilização do Mina é que a ele pode ser integrada a utilização de filtros, estarei postando aqui o código de exemplo realizado por mim juntamente com o Apache Mina.



Um framework que realmente abstrai com facilidade a utilização da Java NIO, postarei posteriormente as minhas experiências com este framework.


Nenhum comentário :