Desenvolvimento de software e tecnologia em geral
Artigos com o marcador Java
Self-Service Design Patterns
10/09/09
O título desse post realmente é estranho, mas calma, não estou criando um novo catálogo de padrões de projetos baseado na culinária brasileira.
Na verdade é somente um desabafo para que nós (desenvolvedores de software) não utilizemos Design Patterns sem motivo em nossos projetos.
Depois de um bom tempo trabalhando com desenvolvimento de software e de ter passado por inúmeros projetos, vejo que muitas vezes as arquiteturas dos softwares desenvolvidos contém vários Design Patterns que nem sempre são necessários para o bom design do projeto, adicionando camadas (layers) desnecessárias ao projeto e tornando o desenvolvimento e manutenção mais trabalhosa e difícil.
Costumo ver muito arquiteturas do tipo Action->Facade->Service->DAO, que mais parece ser uma receita de bolo. Não que um software desenvolvido nessa arquitetura esteja errado ou certo, mas o meu principal questionamento é a real necessidade de ter implementado estes ou aqueles padrões de projetos.
Conforme descrição no Wikipedia:
Design Patterns, descrevem soluções para problemas recorrentes no desenvolvimento de sistemas de software orientados a objetos. Um padrão de projeto estabelece um nome e define o problema, a solução, quando aplicar esta solução e suas conseqüências.
Na descrição acima vemos que os padrões de projetos existem para resolver certos problemas em uma arquitetura de software orientado a objetos e não para serem utilizados “á vontade” (self-service), mas infelizmente hoje vejo muitos desenvolvedores aplicando Design Patterns nos projetos apenas para poder dizer ( para outros ou para si mesmo ) que usa o Design Pattern XPTO no seu projeto e/ou que já possui experiência com Design Patterns. Com atitudes assim perde-se 2 vezes, uma no conhecimento pois o desenvolvedor está aprendendo de maneira errada a usar determinado padrão de projeto, e outra perde-se também na qualidade do software desenvolvido.
Um dos padrões que sofre com esse problema hoje é o Facade, pois sempre que vejo algo do tipo:
public class XptoFacade{
private XptoService xptoService;
public void insert( Xpto o ) {
xptoService.insert( o );
}
public void update( Xpto o ) {
xptoService.update( o );
}
public void delete( Xpto o ) {
xptoService.delete( o );
}
public void update( Object o ) {
xptoService.update( o );
}
public List<Xpto> list() {
return xptoService.list();
}
}
Me pergunto se este Facade realmente é nessário ja que ele serve apenas para replicar as chamadas de um único Service e sempre me lembro de uma parte do livro Pojos in Action, onde o autor fala um pouco sobre Exposed Domain Model, mostrando os prós e contras de um modelo de domínio exposto e de um que utiliza o padrão Facade.
Então para não prolongar muito o post deixo uma dica que considero muito importante:
Antes de aplicar um Design Pattern no seu projeto, se informe bastante sobre o padrão, veja se o problema que o padrão se propõe a resolver condiz com o problema que você espera solucionar ao aplicá-lo em seu projeto e lembre-se que uma boa arquitetura necessariamente não é aquela que aplica todos os padrões do GoF ou do POEAA.
Criptografia Triple DES em Java
06/07/09
Um dos posts que mais foram acessados e comentados em meu blog foi um escrito sobre Criptografia em Java utilizando Hashs criptográficos.
Depois de receber alguns pedidos resolvi escrever este novo post utilizando no exemplo uma criptografia do tipo Triple DES, com esta criptografia podemos encriptografar e descriptografar informações utilizando Java.
Triple DES é a mais segura versão do algoritmo original Data Encryption Standard (DES) e você pode saber sobre este algoritmo aqui.
Agora vamos a implementação do algoritmo, eu criei uma classe simples que fornece dois métodos de instância para encriptografar e descriptografar uma String.
package br.com.rodrigolazoti;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.security.spec.InvalidKeySpecException;
import java.security.spec.KeySpec;
import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.NoSuchPaddingException;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.DESedeKeySpec;
import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;
/**
* Class that supplies a criptography of triple type DES.
* @author Rodrigo Lazoti
* @since 05/07/2009
*/
public class CryptographyTripleDES {
private Cipher cipher;
private byte[] encryptKey;
private KeySpec keySpec;
private SecretKeyFactory secretKeyFactory;
private SecretKey secretKey;
/**
* Method that create a new instance of class.
* @return
* @throws InvalidKeyException
* @throws UnsupportedEncodingException
* @throws NoSuchAlgorithmException
* @throws NoSuchPaddingException
* @throws InvalidKeySpecException
*/
public static CryptographyTripleDES newInstance() throws InvalidKeyException, UnsupportedEncodingException,
NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeySpecException {
return new CryptographyTripleDES();
}
/**
* Default Constructor.
* @throws UnsupportedEncodingException
* @throws NoSuchAlgorithmException
* @throws NoSuchPaddingException
* @throws InvalidKeyException
* @throws InvalidKeySpecException
*/
private CryptographyTripleDES() throws UnsupportedEncodingException, NoSuchAlgorithmException,
NoSuchPaddingException, InvalidKeyException, InvalidKeySpecException {
String key = "http://www.rodrigolazoti.com.br";
encryptKey = key.getBytes( "UTF-8" );
cipher = Cipher.getInstance( "DESede" );
keySpec = new DESedeKeySpec( encryptKey );
secretKeyFactory = SecretKeyFactory.getInstance( "DESede" );
secretKey = secretKeyFactory.generateSecret( keySpec );
}
/**
* Method that encrypts a value.
* @param value
* @return
* @throws InvalidKeyException
* @throws IllegalBlockSizeException
* @throws BadPaddingException
* @throws UnsupportedEncodingException
*/
public String encrypt( String value ) throws InvalidKeyException, IllegalBlockSizeException, BadPaddingException,
UnsupportedEncodingException {
cipher.init( Cipher.ENCRYPT_MODE, secretKey );
byte[] cipherText = cipher.doFinal( value.getBytes( "UTF-8" ) );
BASE64Encoder encoder = new BASE64Encoder();
return encoder.encode( cipherText );
}
/**
* Methot that decrypts a value.
* @param value
* @return
* @throws InvalidKeyException
* @throws IllegalBlockSizeException
* @throws BadPaddingException
* @throws IOException
*/
public String decrypt( String value ) throws InvalidKeyException, IllegalBlockSizeException, BadPaddingException,
IOException {
cipher.init( Cipher.DECRYPT_MODE, secretKey );
BASE64Decoder dec = new BASE64Decoder();
byte[] decipherText = cipher.doFinal( dec.decodeBuffer( value ) );
return new String( decipherText );
}
}
A seguir criei uma pequena classe para realizar um teste:
package br.com.rodrigolazoti;
import java.io.IOException;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.security.spec.InvalidKeySpecException;
import javax.crypto.BadPaddingException;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.NoSuchPaddingException;
public class TestCryptographyTripleDES {
public static void main( String[] args ) throws InvalidKeyException, NoSuchAlgorithmException,
NoSuchPaddingException, InvalidKeySpecException, IllegalBlockSizeException, BadPaddingException, IOException {
CryptographyTripleDES cryptography = CryptographyTripleDES.newInstance();
String value = "Rodrigo Lazoti";
System.out.println( "Valor utilizado => " + value );
String encryptedValue = cryptography.encrypt( value );
System.out.println( "Valor criptografado => " + encryptedValue );
String decryptedValue = cryptography.decrypt( encryptedValue );
System.out.println( "Valor descriptografado => " + decryptedValue );
}
}
O resultado do teste é:
Valor utilizado => Rodrigo Lazoti Valor criptografado => RgYlMeQBUcyx6419bKlqRw== Valor descriptografado => Rodrigo Lazoti
Com isso já temos uma boa base de como utilizar este tipo de criptografia em aplicações Java.
Falando em Java 2009. Eu Vou!
16/04/09
Desde que foi anunciado o evento Falando em Java 2009 no GUJ, eu venho aguardando o pessoal da Caelum liberar a inscrição para o evento. Felizmente já consegui confirmar minha inscrição para o evento.
O Falando em Java 2009 irá acontecer no dia 24 de maio (Domingo) no Espaço Hakka São Paulo.
Fora os palestrantes da própria Caelum, destacam-se Dr. Jim Webber, Diretor dos serviços profissionais da ThoughtWorks e Bill Burke, autor do livro Enterprise Java Beans da O’Reilly e líder de desenvolvimento do JBoss RESTEasy.
Gostei bastante da programação do evento, pois será bem abrangente e abordará desde Carreira Java até Restful, JavaTV e JavaFX.
Agora é aguardar até o dia 24/05 e conferir as palestras!
Últimos comentários