Feed Artigos Comentários

Arquivo de Setembro de 2006



Desenvolvimento de Software Hildebrando em 27 Set 2006

Boas maneiras na manutenção em sistemas de terceiros.

Como se comportar quando cai no seu colo um sistema que não foi você quem desenvolveu?

Antes de mais nada quero explicar o porque da escolha de ‘Boas maneiras’ ao invés de ‘Boas práticas’. Boas maneiras esta ligada a boas práticas porém com a adição de ética e postura. Quando mexemos em um software desenvolvido por outra pessoa, precisamos lembrar que foi um companheiro de profissão que fez o trabalho. Falar mal, questionar e duvidar do Software em questão deve ser feito com muito cuidado e ética.

O cénario de mexer em um sistema de terceiro é muito comum, inclusive alguns sistemas acabam se tornando verdadeiros desafios. Só o fato de você ter de entender a arquitetura utilizada (quando tem) além da regra de negócio pode te comsumir muito mais horas do que o esperado. Para evitar noites sem dormir preparei uma cartilha que pode ajuda-lo nestas tarefas:

1 - Diretorios e arquivos do projeto

Faça um levantamento de todos os diretorios do projeto. Crie um documento texto com a lista de todos os diretorios e pacotes com um indicativo de qual a funçao do respectivo diretorio/arquivo no projeto.

Este levantamento vai te ajudar muito com uma visão de alto nível sobre as diferentes entidades envolvidas no projeto. É nesse momento que podemos identificar as camadas, as boas práticas e as convenções de nomenclatura.

Após entender a estrutura do sistema faça uma segunda análise com o objetivo de identificar os frameworks envolvidos e os arquivos de configuração (.properties e .xml)

Comportamento:
Mudanças na estrutura ou nomenclatura de pacotes só são aceitos em situações de Refactoring (alterar o codigo sem alterar funcionalidade). As vezes encontramos fulgas de padrões que realmente nos incomodam. Diretorios em português e inglês, nome de pacotes em maiusculo, etc. e mesmo assim devemos nos controlar e eveitar qualquer mudança. Lembre-se estamos na fase de Analise ainda.

2 - Depuração

Execute a aplicação em modo DEBUG. Realize operações simples e siga o fluxo de mensagens. Identifique entidades com papéis essencias como ServiceLocator, DAO, Factory, BusinessDelegate, Façade.

Neste momento você esta entendendo como funciona a arquitetura. A utilização de uma ferramenta de engenharia reversa para gerar um diagrama de sequencia e um diagrama de classe pode te ajudar muito.

Os modelos nesta situação servem para uma identificação mais detalhistas. Porém não se atenha somente aos modelos. Execute o programa. Veja as mensagens.

Comportamento:
Perca um tempo nesta etapa. Faça pesquisas, cadastrados e relatórios. Identifique a maioria das funcionalidades. Lembrando mais uma vez, ainda estamos na etapa de Analise. Não faça modificações.
Nesta etapa inclusive surgem as primeiras críticas ao software. Porque dessa classe vai para essa? O cara usou o DAO diferente dos projetos que eu estou acostumado? Poderiamos criar uma interface aqui ou ali.

3 - Começe pelo fácil

Na lista de novas funcionalidades a serem aplicadas no sistema, com certeza existem aquelas fáceis. Alinhamento de campo, formatação, validação. Comece por estas. Com isto você estará se familiarizando com a arquitetura, com a organização de arquivos e diretórios. Na comece pelas difíceis pois estas exigem um conhecimento de regra de negócio, que talvez você ainda não tenha.

Comportamento:
Ao fazer uma alteração, inclusão ou exlusão de código faça comentários. Mesmo que seja a inclusão de um atributo. Para os comentários utilize um identificar ligado a nova funcionalidade. Algo como

//NF0600505:Hildebrando Furlan Neto:Inclusao de if para validacao

O significado de NF é ‘New Feature’. Isto nao é um padrão, porém serve como controle para uma possível estatística de mudança. Adote o seu padrão. Converse com os outros envolvidos no projeto para seguirem este padrão.

4 - Testes unitários

Agora sim você consegue entender o porque da utilização de testes unitários é tão importante. Se ainda nao existe metodos de teste, crie-os. Isso ajuda inclusive para entender o algoritmo executado. Uma modificação em algo que esta funcionando deve ser feita com cautela. Com testes unitarios você tera um maior controle se o que você esta fazendo pode estar impactando em outras partes do Software.

Comportamento.
Siga o mesmo modelo de testes. Se for proprietário utilize o mesmo padrão. Caso nao possua, utilize um framework de testes como o JUnit e começe documentando alguns métodos de consistencia. Esclareça suas duvidas com o Analista responsavel para definir dados de entrada e as saidas. Se não existir ninguém simule testes na aplicação e utilize os dados de saida.

5 - Mão-na-massa

Ferramentas a mão e vamos codificar. Siga sempre a estrutura de pacotes e nomenclaturas (classes e identificadores). Abuse dos comentários. Adicione para que serve cada variavel, da onde veio e para onde vai. Mesma coisa com os metodos. Para que serve cada parametro. O que o metodo faz. Outro ponto é conhecer a Arquitetura utilizada. Se for proprietaria entenda seu processo e como as coisas funcionam. Interfaces que você deve implementar, VOs, DTOs, Tiles, Struts.

6 - Cuidado com os prazos

Somente após voce entender a estrutura completa do sistema (exemplo JSP -> Form -> Action) você conseguira dar uma prazo mais preciso. No entanto conheço a realidade brasileira e normalmente voce é questionado pelas horas antes mesmo do item 1. Os passos anteriores demoram cerca de 1 a 3 dias. Variando pelo numero de Frameworks e bibliotecas e seus conhecimentos em relação a eles.

Java Hildebrando em 20 Set 2006

Hibernate do começo ao fim - Diálogo do Sr. com o Jr.

Diálogo entre o pessoal de Desenvolvimento.

Sr. : Entao, neste projeto utilizaremos Hibernate?
Jr. : É mesmo? Ja ouvi falar, mas é bom mesmo? Me parece que voce não precisa mais fazer Query? Parece meio utópico isso ein.
Sr. : É bem interessante. Com o lance do mapeamente O/R da para ter uma produtividade muito grande. Facilita muito. Faz o seguinte, da uma olhada no tutorial do guj http://www.guj.com.br/java.tutorial.artigo.174.1.guj que da para você entender bem.
Jr. : Beleza, mas como funciona esse mapeamento? É com XML?
Sr. : Isso, da uma olhada no tutorial que vc vai entender bem.
// Alguns Exemplos, POJO e Hbm depois
Jr. : Estou tendo um problema que é o seguinte. Tem um tal de Lazy Loading que nao ta dando certo. Quando eu quero acessar um objeto de dentro de outro objeto ta dando pau. Parece que a sessao esta fechada.
Sr. : O lance é conceitual. Aqui no seu DAO, voce esta fazendo o seguinte. Pegar o session, executar a query e fechar o session. Quando o JSP for ser renderizado é neste momento que sera feito o acesso aos atributos Lazy (Lazy que dizer preguiçoso, ou seja, so sera feito a busca deste objeto quando for necessário). O que acontece é que você não pode fechar a sessão.
Jr. : Mas dai vou deixar a sessao aberta?
Sr. : Negativo. O que vc vai fazer é abrir e fechar em outro momento. Utilizando um filtro para esse controle é uma boa. Da uma olhada nesse link http://www.hibernate.org/43.html
Jr. : Mas utilizar um filtro? Nao vou estar misturando as camadas (Hibernate na view)?
Sr. : Da forma como esta implementada o artigo não. Da uma olhada no artigo.
//Depois de implementado o Filter
Jr. : Poxa, mas nao ta salvando. Que #?*&% esse Hibernate.
Sr. : Calma. Voce lembra do artigo? Para operações de insert/update/remove voce tem que abrir uma transação. Senão nao rola.
Jr. : Ah tá. Beleza.
//Transação com begin no filtro e comit no filtro também.
Jr. : Poxa, ta dando um outro erro. Se da problema no Servlet o filtro nao esta retornando para a tela de retorno do servlet. Poxa, estragou tudo. Preciso arrumar uma forma de passar a pagina de retorno do Servlet para o filtro para ele poder fazer o dispatcher disso. Como vou fazer? $%¨&# Hibernate.
Sr. : Calma. O lance é conceitual de novo. Você não pode abrir uma transação no filtro, pois o Hibernate só da flush das querys no commit. Assim o seu servlet ‘pensa’ que esta tudo ok, porém quando for feito o commit, la no filtro, vai dar pau. A parte de transação é uma funcionalidade de Negocio, portanto deve ser feita na camada de negócio. Da uma olhada em outro tutorial do guj.http://www.guj.com.br/java.tutorial.artigo.182.1.guj
//Transacao com Hibernate implementada.
Jr. : Nooooooooooosa. Show de bola ein. Poxa, sem comentarios, quando for um metodo transacional é só colocar o Annotation la. Elegancia.
Sr. : Pois é. Este é so o começo. Depois você da uma estudada em ferramentas de mapeamento, para gerar os HBM de acordo com suas tabelas, também tem toda a parte de cache, muito legal,porém o tipo de aplicação é influenciada diretamente nisso, também tem a parte da utilização do DataSource do Servidor, mapeamento de coleções, mapeamentos avançados como timestamp, version, herança, etc. Mas entendendo esses conceitos principais de mapeamento, session e transação, o resto é só correr atras.

Esse diálogo representa os pontos importantes da utilização do framework Hibernate. O caminho é meio arduo porém como tem mais carga conceitual do que decoração de API. Boa Sorte

Dicas Hildebrando em 07 Set 2006

Preenchimento de combo com AJAX

Independente do framework ou biblioteca para utilização de AJAX nos seus sistemas, é importante destacar a interação do resultado das chamadas assíncronas com os elementos da tela.

O exemplo abaixo foi aplicado na alteração dos valores de um combo na tela


//O primeiro parametro eh um codigo se ja existe item selecionado ou nao
//200|1|item1|2|item2|3|item3
function callbackPreencherCombo(responseAJAX){
var response = responseAJAX.split('|');
var combo = document.getElementById('produtoItemData');
combo.disabled = false;
combo.options.length = 0;
if(response[0] == '200'){
var contador = 0;
for(i = 1 ; i < response.length ; i += 2 ){
combo.options[contador++] = new Option(response[i+1],response[i]);
}
}else if(response[0] == '201'){
var contador = 0;
for(i = 2 ; i < response.length ; i += 2 ){
combo.options[contador++] = new Option(response[i+1],response[i]);
}
for(i = 0; i < combo.options.length; i++ ){
if(combo.options[i].value == response[1]){
combo.options[i].selected = true;
}else{
combo.options[i].selected = false;
}
}
}
}

Tutorias Hildebrando em 02 Set 2006

Javascript para quem ja conhece Java

Não importa se você é um Jedi em linguagens de programação de alto nível como Java e C++. Quando o assunto é desenvolvimento para Web infelizmente precisamos conhecer Javascript.

Por que do infelizmente?

Porque utilizamos Javascript justamente para criarmos uma dinâmica maior do lado do cliente, e assim acabamos chamando funções do ambiente do Navegador, algo como pesquisar um campo, alterar um label de botão ou abrir uma nova janela. Algumas destas funções são particulares de cada Navegador, e isto levou muita gente a duplicar metodos pois os mesmos teriam que possuir um ‘if’ para o navegador IE e o ‘else’ para outros. Isso quando não tinha os ‘else if’.

Hoje muita coisa evoluiu porém eu gostaria de dar algumas dicas para o pessoal que anda batendo cabeça com Javascript.

Tipos

Javascript faz a tipagem em tempo de execução, ou seja, não existem declarações de tipo no seu codigo.


var i = 10;
var j = "Javascript";

Assim nas declarações de métodos tambem nao existe os tipos de retorno.


function mostrarData(){
return "28/06/1979";
}

Gostou ? Eu não gosto muito pois estou acostumado a forte tipagem do Java, que é um recurso interessante inclusive para a parte de manutenção de código.

Varargs

Para quem conhece Java 5.0 vai entender fácil. Existe aquele termo conhecido como sobrecarga de metodo que é voce declarar varios metodos com o mesmo nome, variando sua lista de argumentos. No Javascript o mais utilizado não é a sobrecarga e sim a declaração do método com a passagem de parametro definida em tempo de execução.


function somarNumeros(a,b,c){
var soma = 0;
if(a){
soma += a;
}
if(b){
soma += b;
}
if(c){
soma += c;
}
}

somarNumeros(2);
somarNumeros(2,5);
somarNumeros(2,8,9);

Interessante não? De fato facilita no desenvolvimento, no entanto é um recurso que deve ser utilizado com muito cuidado pois não existe a obrigatoriedade de nenhum parametro, o que pode comprometer o algoritmo do metodo.

AJAX

Existem inumeros tutoriais de AJAX na internet. Quero apenas destacar neste item que sem Javascript você nao vai conseguir aproveitar desta nova onda (a nao ser com a utilização de algum framework). Segue um exemplo.


function AJAXInteraction(url, callback, returnParam) {

var req = init();
req.onreadystatechange = processRequest;

function init() {
try {
return new XMLHttpRequest();
} catch (trymicrosoft) {
try {
return new ActiveXObject("Msxml2.XMLHTTP");
} catch (othermicrosoft) {
try {
return new ActiveXObject("Microsoft.XMLHTTP");
} catch (failed) {
alert("Error initializing XMLHttpRequest!");
}
}
}
}

function processRequest () {
// readyState of 4 signifies request is complete
if (req.readyState == 4) {
// status of 200 signifies sucessful HTTP call
if (req.status == 200) {
if (callback){
callback(req.responseText);
}
}
}
}

this.doGet = function() {
// make a HTTP GET request to the URL asynchronously
req.open("GET", url, true);
req.send(null);
}
}

function buscarClientes() {
var url = "/servlet/ajaxPedido?method=buscarClientesPorRazaoSocial&clienteRazaoSocial=A";
var ajax = new AJAXInteraction(url, callbackBuscarClientes);
ajax.doGet();
}
function callbackBuscarClientes(responseAJAX){
//Fazer o tratamento da resposta.
}

Olha que interessante. Em Javascript você também pode utilizar Objetos. A declaração é um pouco diferente inclusive existe um recurso de Prototipação que ajuda bastante também.

Estas são algumas dicas para a utilização de Javascript. O resto que você precisa conhecer são as diversas operações dos componentes. Esse é um estudo como de outra linguagem qualquer envolvendo a leitura das especificações e a construção de exemplos.