Archive for March, 2006

Tate te Faz Atravessar Fronteiras

Wednesday, March 8th, 2006

Bruce Tate, autor do comentadíssimo livro Beyond Java, acaba de lançar no developerWorks da IBM uma série chamada Crossing Borders.

Na série o também autor de Better, Faster, Lighter Java (ótimo livro) fala sobre os motivos que um programador (programador Java no caso mas se aplica a qualquer um) teria para aprender novas linguagens e teconologias. Ele cita:

  • Java não é a linguagem perfeita para qualquer problema.
  • Você pode utilizar as idéias que aprender em Java.
  • Outras tecnologias estão mudando o modo como as próprias tecnologias Java são criadas.

E eu concordo completamente.

No primeiro artigo ele fala de ActiveRecord do Rails, boa leitura.

Comentários…

Monday, March 6th, 2006

Acabei de descobrir que o plugin não estava deixando passar comentários, se o seu comentário não foi aprovado me avise. Ah, e foi só desabilitar a droga do plugin que o spam começou :(

Comentários…

Monday, March 6th, 2006

Acabei de descobrir que o plugin não estava deixando passar comentários, se o seu comentário não foi aprovado me avise. Ah, e foi só desabilitar a droga do plugin que o spam começou :(

Iniciando uma Nova Categoria: LISP

Monday, March 6th, 2006

Como alguns já sabem iniciei meus estudos de LISP há pouco. Estou lendo o Practical Common LISP e me divertindo muito com uma linguagem totalmente diferente de tudo que já vi (o mais próximo que cheguei disso foi Python, Ruby e Smalltalk).

PCL

Este ano eu decidi que vou aprender uma linguagem de programação a cada, pelo menos, 3 meses. Ainda que não consiga fazer nada real para meus projetos ‘de verdade’ (i.e. aquilo que você faz fora do quarto e duranto o horário comercial) em LISP, aprender uma linguagem diferente te ensina cosias que você pode aplicar em várias tarefas do seu dia-a-dia. Foi assim com Ruby por exemplo, programar em Ruby me faz pensar em soluções idferentes quando programo em Java, que por enquanto é a linguagem de aplicações que eu uso durante a maior parte do dia (com intervalos de Python, Ruby, C e PERL).

Aliás, este também é um dos conselhos do My Job Went to india ;)

Nota: é interessante que eu sempre tô atrasado com relação ao TaQ :D

Booch define design…

Sunday, March 5th, 2006

Ainda naquele papo de arquitetura, Grady Booch escreve em seu blog suas definições pessoais de design:

As a noun, design is the named (although sometimes unnamable) structure or behavior of an system whose presence resolves or contributes to the resolution of a force or forces on that system. A design thus represents one point in a potential decision space. A design may be singular (representing a leaf decision) or it may be collective (representing a set of other decisions).

As a verb, design is the activity of making such decisions. Given a large set of forces, a relatively malleable set of materials, and a large landscape upon which to play, the resulting decision space may be large and complex. As such, there is a science associated with design (empirical analysis can point us to optimal regions or exact points in this design space) as well as an art (within the degrees of freedom that range beyond an empirical decision; there are opportunities for elegance, beauty, simplicity, novelty, and cleverness).

Resumindo drasticamente e traduzindo livremente: O Design de um sistema seria o conjunto de decisões tomadas sobre a estrutura do sistema. Fazer design é o processo de tomar estas decisões.

Este trecho também é interessante:

All architecture is design but not all design is architecture. Architecture represents the significant design decisions that shape a system, where significant is measured by cost of change.

Booch afirma, então, que a arquitetura de um sistema é a parte do design que são mais caras de serem alteradas. Decisões como o uso de um ActideRecord ou DataMapper para persistência, ou se usar um framework baseado em Commands ou em Façades, se distribuir EJBs por servidores ou manter tudo num nó apenas enqaunto possível…

Fowler e Getters

Saturday, March 4th, 2006

Martin Fowler escreveu um belo artigo em seu Bliki sobre getters e encapsulamento. Em Getter Erradication Fowler começa falando sobre como a prática de evitar getters a todo custo confunde o sentido real de encapsulamento e termina dando uma ‘rule of thumb‘ (uma regrinha rápida para ser aplicada por padrão) para identificar se uma classe possui seu encapsulamento violado.

Acho que Martin vai direto no ponto quando fala de encapsulamento não é simplesmente quebrado pelo uso de getters, apesar de ser uma boa prática não oferecer métodos get/set (ou seu equivalente em outra linguagem de programação) se você não precisa deles.

O termo ‘Information Hiding’ é usado como se os dados de um sistema fossem privados à um objeto só, como se apenas apra aquele objeto esta informação fosse importante.

Por mais que faça sentido evitar que objetos “saibam demais”, este não é o real objetivo do encapsulamento. O sistema é feito para manipular dados, que foram inseridos pelo usuário, estes dados geralmente não são nada secretos nem deveriam ser. O ponto em encapsular um objeto é apenas evitar que sua implementação fique exposta e esconder dados de acesso externo é apenas uma consequência disso.

Como este é um assunto recorrente em fóruns e listas, vamos a um pequeno exemplo para ajudar a entender melhor…


class Telefone{
private String ddi;
private String ddd;
private String numero;
private String ramal;

public String getNumero(){
String t = "";

if(ddi!=null) t = t + "+"+ddi;
if(ddd!=null) t = t + "("+ddd+")";
t= t + numero;
if(ramal !=null) t = t + " RAMAL " +ramal;
return t;
}

}

Se você olhar bem, o método getNumero() retorna todos os dados privados. O objetivo de fazê-los privados aqui não é esconder esta informação, o objetivo é esconder que quem implementou a classe quis separar cada componente do número de telefone por algum motivo. Pode ser que outro subsistema precise apenas de todos os DDDs registrados.

Não haveria problema real em expôr os atributos como públicos exceto pelo fato que cada um que os consulte iria precisar montar a String, e que se essa decisão de design tiver que mudar (por exemplo, eliminando o ramal) você vai ter alterar todos os objetos que a utilizam.

Recentemente eu vivi uma situação que ilustra este tipo de coisa na prática. Eu tinha um objeto ‘Recurso’ num sistema de gerenciamento de tarefas. este objeto recebia tarefas e as listava.

Acontece que quanto mais tarefas forem assignadas, mais a lista crescia. Para a maioria das funcionalidades eu só precisava das tarefas que ainda não haviam sido completadas mas estas estavam na mesma lista que as completadas. Essa decisão manteve o design simples enquanto foi possível ser mantida. Neste cenário eu poderia simplesmente liberar o acesso à minha lista de tarefas, afinal nada ali era ’secreto’.

Acontece que quando o objeto fosse salvo e carregado do banco de dados o consumo de memória ia ser absurdamente alto pela lista de tarefas que o Recurso carregava. A solução óbvia foi mantêr mais de uma lista de tarefas, na verdade foi dividido em três: tarefas concluídas, tarefas em execução e tarefas futuras.

Por mil motivos, havia um método getTarefas() que retornava uma lista ordenada com odas as tarefas do Recurso, compeltas ou não. Se ao invés deste método houvesse acesso direto á lista de tarefas (vazando o fato de que eu usava uma lista para as tarefas) eu estaria em maus lençóis. Como o encapsulamento ajuda foi muito fácil transformar o método para que, ao invés de retornar a lista, retornasse uma concatenação das três listas (não que isso tenha uma performance boa…).

Ao não expôr minha decisão de ter uma lsita de tarefas eu não precisei expôr o fato que eu mudei este design. Para as classes que a utilizam, a classe continua com a mesma cara de sempre.

E se você está cansado de ver classes que só têm um bando de get/set dê uma olhada neste artigo.

Problemas, Carnaval, Inatividade e Mudanças

Saturday, March 4th, 2006

Os visitantes frequentes têm notado (e me avisado) que o site está tendo problemas. Eu até agora estava culpando o host mas pelo visto o wordpress está gerando links errados, acabando com o CSS da página.

Eu estava utilizando um plugin para tentar diminuir o número de spam e estou desconfiado dele, acabei desativando, vamos ver como fica.

O Carnaval está acabando (no Rio o carnaval dura quase que o verão todo) e as atividades estão voltando ao normal. Estou escrevendo uns artigos novos sobre design e minha coluna no PortalJava será atualizada semana que vem.

Faz algum tempo eu adquiri uma conta num host americano para hospedar o fragmental, estaremos migrando apra lá em breve e talvez eu mude as engines do blog e do bliki. Ambos são muito legais mas eu rpeferiria algo mais integrado.

Não se espantem com problemas ocasionais no blog (espero que eles acabem..) e eu aviso quando houver a migração.