Pesquisar

sexta-feira, 25 de setembro de 2009

Usar sempre a interface mais genérica possível

Se você precisa somente iterar sobre uma coleção de um tipo de objeto...
Faça seuMetodoReceber(Collection colecao); e não uma List ou Set... (ou ainda uma Iterable)


Se você vai trabalhar num nível muito baixo com Stream...
Faça seuMetodoReceber(InputStream is); e não um FileInputStream...


Essa lista segue sem fim...

Porque sempre usar a interface mais genérica possível?

Você pode simplesmente mudar sua coleção que retornava uma List pra retortar uma TreeSet. Mudar o comportamento esperado, mudar o Stream para outro tipo e outras coisas que são comuns, sem sofrer tanto. Se você nunca enfrentou o inferno das manutenções não entenderá completamente a dor.

Se você está pensando em criar uma biblioteca então essa consideração deve ser ter atenção redobrada.

Opte sempre pelo mais GENÉRICO possível.

quarta-feira, 23 de setembro de 2009

Aprendendo com seu IDE

Estou trabalhando em um projeto que utiliza Swing e o Netbeans. Ate aí nenhuma novidade... mas no decorrer da criação e do uso dos JComponents notei que o netbeans cria algumas coisas bizarras e outras legais... Tudo pra deixar o usuário (eu) feliz com as pedras no sapato da JTable. Bem o interessante não é nada disso... vou ao exemplo que facilitará.

Suponha que você tenha uma classe:

public class ClasseA{
public void fazNada(){
System.out.println("nada");
}
}

E uma classe de teste:

public class TestClasseA{
public static void main(String[] args){
ClasseA a = new ClasseA();

a.fazNada();

}

}



O resultado será simples um nada
Bem e se eu quisesse alterar o comportamento do método fazNada... normalmente o que as pessoas fazem é (além de seguir um dos Patterns do GOF... esqueci o nome :S ) criar uma outra classe herdando da ClasseA e sobreescrevendo o comportamento para o método fazNada.

O que notei que o netbeans faz é o seguinte:



public class TestClasseA{
public static void main(String[] args){
ClasseA a = new ClasseA(){
public void fazNada(){
System.out.println("tudo");
}

};

a.fazNada();

}

}

Isso mesmo sobreescrevendo-a na própria "instanciação"... a essa técnica, ou jeito, penso que o nome correto é classe anónima... (já vi vários usos para classes anónimas, mas esse foi novo.)

terça-feira, 15 de setembro de 2009

Ajuda fútil com progress bar ou outro componente que registre o progresso

Suponha que você tenha um progress bar que vai de UM_VALOR_MIN até UM_VALOR_MAX em unidades inteiras. Agora suponha que você tenha uma LISTA_DE_ARQUIVOS e deseja fazer um processamento(com_cada_um_dos_arquivos). E também quer deixar visível ao usuário esse progresso.
Agora veja o algoritmo mais (f)útil pra isso.

ps: esse é mais um daqueles posts que você pode se arrepender, tanto de ler quanto de escrever no futuro.




LISTA_DE_ARQUIVOS = listFilesAt("/home/myuser/myfolder/movies/")
UM_VALOR_MAX = 100
TOTAL_DE_ITENS =
LISTA_DE_ARQUIVOS .tamanho
QTD_POR_ITEM = UM_VALOR_MAX / TOTAL_DE_ITENS
UM_VALOR_MIN = QTD_POR_ITEM

for (String item : LISTA_DE_ARQUIVOS) {
File file = new File(item)
processar(file)
marcarProgresso(round( UM_VALOR_MIN+ 0.059))
UM_VALOR_MIN+= QTD_POR_ITEM
}

quinta-feira, 3 de setembro de 2009

Cache encurtando viagens


Cache é importante?

Me lembro quando comprei meu processador Atlhon XP 2400, na época tinha o maior cache maior da categoria. Tinha um cache L1 para dados e instruções de 64KB (cada) e L2 com 256KB. Hoje um E8400 tem cache L1 de 32KB pra dados e 32KB para instruções e um L2 com 6MB (compartilhado entre os núcleos) indo além disso um Core i7 adiciona mais um nível (LEVEL) o L3. ( ele tem L1 = 32KB pra dados e 32KB pra instruções, L2 = 4 x 256KB e L3 = 8MB compartilhada com todos núcleos). Bem, se os projetistas de hardware já se preocuparam com isso pra que eu vou fazer cache?

O que é um Cache?

O processo de armazenamento temporário de informações recentemente acessadas em um subsistema de memória especial para acesso mais rápido. (Windows Vista Center Help)
É um dispositivo de acesso rápido, interno a um sistema, que serve de intermediário entre um operador de um processo e o dispositivo de armazenamento ao qual esse operador acede. A vantagem principal na utilização de uma cache consiste em evitar o acesso ao dispositivo de armazenamento - que pode ser demorado -, armazenando os dados em meios de acesso mais rápidos. (Wikipedia)

Exemplo (ridículo) do uso de Cache (sun.misc.Cache)

Cache cache = MCache.get(); //singleton, session, jndi, cache distributed server...
if (cache.get("homePageNews")==null){
//busco no banco
//quando busco no banco
//atualizo também o cache.
}else{
//salvei tempo
Set news = (Set)cache.get("homePageNews");
}
Senta que lá vem história, experiência quase-real

Numa consultoria 0800 à um amigo Php-Ense; ele me retratava que apesar de ser um servidor não tão parrudo o sistema estava apresentando lentidão (demora de 0,5 a 1,8 segundos), as telas estavam demorando muito a serem carregadas... Já cheguei pensando que seria uma batalha(tanto pelo pouco conhecimento em PHP, quanto pela descrição do problema). Se tratava de uma aplicação simples com poucos 'Gruds' (cerca de 30). Na demonstração percebi que algumas telas demoravam mais do que outras para carregar , e uma demorava quase 2 segundos (essa que encomodava-o) que era a gestão de clientes, nela havia três combos: países, estados e cidades. Uma outra era a página inicial que carregava : últimas notícias, o perfil de três clientes (randômicos), três serviços prestados (randômicos), um texto sobre a "empresa" e uma mensagem. Tudo isso era carregado do banco a cada requisição, se 100 pessoas abrissem o browser naquele site seriam enviados 100 equisições ao banco (que provavelmente por se tratar do mesmo dado os teria em cache, ôoo o banco também tem cache, todo mundo têm eu também quero... será? ) mesmo que o banco lhe salve um pouco de processamento, você continua enviando e recebendo dados pela rede e isso é danoso. Sugeri a ele usar um framework de Cache ou criar um simples e sincronizá-lo com a base de N minutos a N minutos. Depois que ele seguiu meus conselhos ele disse ter uma melhora bem melhor do que esperava. Isso, claro, não significa que todos os problemas de performance serão sanados com uso de cache, alias o uso indiscriminado de tal recurso pode também afetar a performance negativamente. Agora imagine que uma aplicação esteja distribuída em vários servidores em clustes um único sistema de Cache não irá ajudar muito, para tanto já existem sistemas de Cache distribuidos (acredite que isso é mais simples do que minha mente temerosa de computação distribuída possa imaginar).

terça-feira, 1 de setembro de 2009

Lista de bons programas open-source.

Soa como clichê mas vai ai minha lista:

Media Center - http://www.moovida.com/screenshots/
Playstation 2 - http://code.google.com/p/pcsx2/
Wii / Dolphin Emulator - http://code.google.com/p/dolphin-emu/
JDowloader - http://jdownloader.org/

ps: só citei os que estou usando e aproveitando (muito) ultimamente.