12 abril 2010

Usando ARRAY em Java para cadastro de clientes

Existem várias possibilidades para o uso de arrays. Elaborei um exemplo para demonstrar a utilização aplicando sobre um cadastro de clientes. Objetivo deste exemplo é mostrar uma maneira de utilizar array com Java.


Para saber o que é um array veja a definição da Wikipédia sobre array. Os principais pontos que devem ser observados para entender o uso de Array em Java na minha opinião são:
  • Um array em Java precisa ser declarado usando os colchetes ( [ ] );
  • O caso mais comum do uso de array requer que este seja inicializado (alocar memória) e neste momento, deve-se informar o seu tamanho; Ex. String[] listaClientes = new String[quantidade];
  • Para acessar os dados do array basta usar os colchetes, seguido por seu índice. Ex. listaClientes[i] = JOptionPane.showInputDialog("Nome do cliente "+(i+1));
  • Quando um array for criado na memória ele será inicializado com valores default do tipo de dados conforme o tipo de sua declaração. Ou seja, um array de tipo String terá valor null em cada elemento disponível até que seja atribuído outro valor String. Se for tipo primitivo int, o valor default é 0 (zero) para cada elemento; float será 0.0 e assim sucessivamente;
  • Para determinar o tamanho do array de forma dinâmica devemos usar o atributo length. Ex. listaClientes.length
  • Para recuperar os valores devemos usar o seu índice. Veja a ilustração acima. Ex. listaClientesTemporario += listaClientes[i] + "\n"
O programa a seguir utiliza um exemplo para cadastrar clientes e recuperar os seus dados cadastrados na memória. Tentei levar em consideração todos os pontos mencionados.




 

import javax.swing.JOptionPane;

/**

* Esse programa visa exemplificar a utilização de array, aplicando sobre um

* cadastro de clientes.

*

* @author Douglas Daniel Del Frari

*/

public class CadastroClientes {

// array de clientes

private static String[] listaClientes;

private static String menu = "CADASTRO CLIENTES\n\n" +

"1 --> Cadastrar clientes\n" +

"2 --> Listar clientes\n" +

"3 --> Sair";

/**

* Método inicial das aplicações Java SE

* @param args argumentos opcionais

*/

public static void main(String[] args) {

// escolha do usuario

String opcao = "";

do {

opcao = JOptionPane.showInputDialog(menu);

if (opcao.equals("1")) {

// cadastrar clientes

cadastrarClientes();

} else if (opcao.equals("2")) {

// listar clientes

listarClientes();

}

} while (!opcao.equals("3")); // comparacao usando String

} // fim do main

/**

* Lista os clientes cadastrados no ARRAY.

*/

private static void listarClientes() {

if (listaClientes!=null) {

// acumula a listagem numa variavel local

String listaClientesTemporario = "Lista de Clientes \n\n";

for (int i = 0; i < listaClientes.length; i++) {

listaClientesTemporario += listaClientes[i] + "\n";

}

// exibe na tela a listagem de clientes

JOptionPane.showMessageDialog(null,listaClientesTemporario);

} else {

// se nao tiver clientes o ARRAY será null, entao pode-se tratar com

// uma mensagem personalizada.

JOptionPane.showMessageDialog(null,

"É necessário realizar cadastro de clientes primeiro");

}

}

/**

* Esse metodo cadastra os usuarios na quantidade

* informada pelo usuario.

*/

private static void cadastrarClientes() {

// utiliza o metodo showInputDialog para perguntar a quantidade e

// converte o valor de String para inteiro e armazena na variavel

// local quantidade.

int quantidade = Integer.parseInt(JOptionPane

.showInputDialog("Quantos clientes deseja cadastrar?"));

// inicializa o ARRAY com tamanho informado pelo usuario

listaClientes = new String[quantidade];

// percorre todo tamanho do ARRAY e cadastra seus elementos

for (int i = 0; i < quantidade; i++) {

listaClientes[i] = JOptionPane.showInputDialog("Nome do cliente "+(i+1));

}

JOptionPane.showMessageDialog(null, "Clientes cadastrados");

}

} // fim da classe



Considerações
Observe que o exemplo propõe utilizar uma variável global (atributo listaClientes) que é um tipo array de String. Isto porque utilizou-se métodos que são utilizados forá do escopo do método principal (main). Além disso, propomos utilizar uma interface gráfica usando a classe JOptionPane e dois dos seus métodos estáticos (showMessageDialog para exibir dados e showInputDialog para fazer a entrada de dados do usuário).

O array foi inicializado somente após o usuário determinar a quantidade de clientes a ser cadastrada. Assim podemos percorrer o cadastro de cada cliente até o fim do array (ver o método cadastrarClientes()). Se o usuário optar pela visualização da listagem de clientes antes de cadastrar algum cliente, optamos por mostrar uma mensagem para alertar que é necessário realizar o cadastro antes de listar (basta verificar se o array não está nulo - if (listaClientes!=null))

Essa solução não leva em consideração possíveis erros do usuário. Por exemplo, se no momento de informar a quantidade de clientes a ser cadastrada ele colocar um valor que não pode ser convertido para inteiro (ex. um caracter qualquer), teremos um erro de lógica e uma exceção será gerada. Neste caso precisaríamos usar um tratamento de exceção (try/catch).

Questões para debate
  1. Por que foi utilizado uma variável do tipo String para pegar a opcão de escolha do usuário durante a exibição da menu principal? Qual a diferença se usássemos o tipo inteiro?
  2. Modularizar o programa em partes menores trás algumas vantagens? Quais?
  3. O que acontece quando acabar o espaço deste tamanho (quantidade)?

29 março 2010

Depuração no Eclipse (debugger)



[ATUALIZADO com novo post] se chegou até aqui, saiba que tem um vídeo atualizado no post recente aqui.

No contexto de programação como podemos entender o que é a depuração e como fazê-la acontecer na prática? Quase sempre quando trabalho com novas turmas vejo uma grande maioria dos alunos ainda não utilizou esse precioso recurso do programador. O objetivo deste post é dar uma noção básica e mostrar como fazer na prática usando a IDE Eclipse.

O que é depuração?
"Um depurador (em inglês: debugger) é um programa de computador usado para testar outros programas e fazer sua depuração, que consiste em encontrar os defeitos do programa." [fonte Wikipédia]

Do meu ponto de vista, vejo como uma forma de rodar o programa de computador passo a passo, instrução por instrução de código afim de entender a sua sequência de execução em tempo real (run-time). Através deste procedimento o programador terá condições favoráveis para acompanhar o ciclo como um todo, podendo intervir no comportamento do fluxo padrão (mudando o valor de variáveis por exemplo), ou simplesmente, acompanhando o fluxo padrão da execução (observando a sequencia da execução linha a linha dentro do código fonte) para entender a lógica do programa.

Como fazer a depuração em Java?
Existem duas maneiras que considero mais convenientes de fazer isso em Java:
  1. Usar uma IDE: muitos procedimentos são simplificados para o desenvolvedor. As IDEs mais conhecidas para Java são Eclipse e NetBeans. Ambas são boas opções. Embora eu sugira o Eclipse por ser mais flexível e mais leve;
  2. Entender como podemos depurar e como fazer na prática: o Eclipse possui um HELP que explica os passos para poder fazer isso.
Passo a passo no Eclipse:
Antes de dizer como fazer, quero sugerir você procurar no HELP da IDE Eclipse esse procedimento. Acesse "/Help/Help Content". Procure em "Java Development User Guide", o post que se refere ao assunto: "Debugging your programs" (depurando seus programas).

Após uma leitura básica neste material do HELP, vamos perceber que para fazer a depuração precisamos fazer o seguinte:
  • Ter um código fonte dentro de um projeto Java;
  • Marcar uma linha no qual desejamos que a execução inicie a depuração (clique duplo na borda do seu editor de código fonte - junto a linha);
  • Iniciar a execução clicando em "menu Run/Debug As/Java Application";
O Eclipse possui uma perspectiva chamada DEBUG que será sugerida toda vez que uma execução em modo de depuração for invocada. Utilizar essa perspectiva facilitará a visualização da execução em tempo real.

A partir deste ponto você precisa utilizar os botões (Step Into (F5) ou Step Over(F6)), que servem, respectivamente, acessar a próxima instrução tentando entrar no bloco - precisa ter o código fonte; e acessar a próxima instrução não precisando entrar no bloco. Na prática isso permite acessar os códigos dos blocos dos métodos desejados de uma maneira conveniente. Se desejar sair ou continuar de forma normal, basta apertar os comandos (Terminate, Resume) respectivamente.









Conclusão
Por que depurar o código? Podemos acompanhar o ciclo de vida do aplicativo (do início ao fim), procurando verificar o valor de variáveis, de expressões, acessando métodos entre outras possibilidades.

Na minha opinião a principal vantagem é permitir o acompanhamento em tempo real. Já resolvi muitos bugs em menor tempo por utilizar esse recurso. Na prática, percebemos nosso erro de lógica quando podemos entender o que o computador está fazendo em determinada situação. A maioria das vezes o erro é do próprio programador que não previu determinada situação. Ao perceber isso, com ajudada da depuração, temos mais probabilidade de corrigir o bug alterando a lógica do programa.


24 março 2010

Dica Java SE: como remover espaços de um tipo String

De vez em quando eu postarei algumas dicas sobre programação em geral que considero úteis para um desenvolvedor. Vou focar em Java, mas pode-se procurar métodos similares nas outras linguagens de programação.

Uma maneira (não a única) para remover espaços em branco de uma variável de tipo String pode ser percorrida com o comando trim() e replaceAll(...).

 

/**

* Este programa visa exemplificar o uso do método da classe String chamado trim() e

* alguns cenários de uso.

*

* @author Douglas Daniel Del Frari

* @since 24/marco/2010.

*/

public class TesteTrim {

public static void main(String[] args) {

// Como remover os espacos do valor de um tipo String??

String nome = " Douglas Daniel Del Frari ";

System.out.println("nome 1: " + nome + " tamanho: "+nome.length());

// o método trim() permite remover os espacos. Obs.

// So funciona com espacos de inicio e fim do texto

String nome2 = nome.trim();

System.out.println("nome 2: "+ nome2 + " tamanho: "+nome2.length());

// Como remover qualquer espaco da string?

// pode-se usar o método replaceAll(...). Ex.

String nome3 = nome.replaceAll(" ", "");

System.out.println("nome 3: "+nome3 + " tamanho: "+nome3.length());

} // fim do método main

} // fim da classe

SAÍDA NO CONSOLE TEXTUAL:
 

nome 1: Douglas Daniel Del Frari   tamanho: 29
nome 2: Douglas Daniel Del Frari tamanho: 24
nome 3: DouglasDanielDelFrari tamanho: 21

Conclusão
Qualquer valor do tipo String possui vários métodos interessantes (consulte a API). Neste exemplo utilizamos o método trim() para remover os espaços. Entretanto, ele somente remove os espaços da posição que antecede e procede o texto inicial e final, respectivamente. Para contornar, podemos usar o método replaceAll(...), onde especificamos o que será removido e pelo que iremos replicar (removemos todos os espacos " " por "" --> caracteres sem espaço).