Capítulo 9. Adicionando funcionalidade

    A primeira coisa que necessita em sua aplicação é de alguns campos para armazenar os dados, os totais e as médias:

  1. No painel "Projects" (esquerda superior), expanda a árvore até que possa ver seu "MileageMidlet" (se já não estiver expandido). Deverá ver quatro nós: "Fields", "Constructors", "Method" e "Bean Patterns".
  2. Adicionará propriedades através do nó "Bean Patterns" (caminho mais rápido de adicionar propriedades).
  3. Primeiramente, clique no botão direito "Bean Patterns" e selecione "Add Property".
  4. Digite para o nome "startingMileageVal", o tipo é "long", e a modalidade é "Read/Write". Deixe todos os ajustes restantes como "default" e clique "OK"."
  5. Repita para as propriedades longas "currentMileageVal", "totalMileageVal", "totalFuelVal", "totalCostVal", "avgMpgVal" e "avgCostVal".
    Note que todos os campos são adicionados como "long", não "float".  Isto é porque em CLDC 1.0, o ponto flutuante não faz parte da especificação. Usará a aritmética  de ponto fixo para 2DP de exatidão para este exemplo.  Poderá usar CLDC 1.1 em sua especificação de projeto, que incluem a sustentação do ponto flutuante, mas certifique-se do suporte ao dispositivo ( não para série 40 Nokia).

    A solução que usa a aritmética de ponto fixo deve fazer algumas suposições simplificadas.  Por exemplo, tratará somente das milhas inteiras para a milhagem  (esta,    nivelará para fora o tempo excedente porque incorporará a milhagem atual do veículo, não a diferença desde último  reabastecimento.  Segundo, assumirá que os galões     e o custo estão incorporados usando centésimo de galões (com nenhum ponto decimal) e em  centavos.  Ou seja, em vez de incorporar 12,43 galões,  incorporará 1243; 
e em vez de 20,98,  incorporará 2098.  Isto facilmente o fará   digitar usando o "keypad" do telefone, e mantem também coisas agradáveis e fáceis de manipular em inteiros.  Quando calcular os sumários para a tela  sumária, usará a divisão do inteiro e o módulo mostrará os galões formatados com exatidão de dois lugares decimais.

    A arte de escrever aplicações Java ME envolve uma quantidade justa de compromisso.  As alternativas deveriam permitir que um "string" seja entrada nos campos        numéricos, e então analisar gramaticalmente para fora da informação do inteiro, ou usar CLDC 1.1 e ir para o ponto flutuante cheio (tomar o cuidado de que  exatamente terá que suportar o alvo de seus dispositivos).  De uma forma ou de outra, isto é deixado como exercício para o leitor por breve.

    Assim, terá agora seus campos.  Poderá adicionar alguma funcionalidade para usá-los:

  1. Na tela "Flow Design", dê um duplo clique no formulário "Add Details" para carregar o dispositivo de tela.
  2. Verá a tela, mas também verá dois comandos atribuídos à direita dela.  Este é o lugar onde poderá unir a funcionalidade.
  3. No comando "OK" (provavelmente nomeado "okCommand2"), clique em "edit link".
  4. Existem duas áreas editáveis:  código de usuário "pre-action" e código de usuário "post-action".  Não se surpreenda, estes poderão conter o código que acontece com outra prioridade de ação para comutar a um outro formulário, ou depois dele.  Deverá colocará alguma funcionalidade na "Pre-Action" da seção do código do usuário.
  5. Existem duas maneiras de fazer isto:  poderá pôr todo o código que quer na seção editável, mas se fizer assim, não conseguirá ajuda do "Intellisense", assim prefira a outra opção.  Criará um método novo chamado "this.updateDetails()" e chamará de "pre-action".  Assim, na área de texto, simplesmente digite "this.updateDetails()" e clique "OK".
  6. A seguir, terá que fornecer o código para o método "updateDetails()".
  7. No painel de projetos, clique no botão direito em nó "Methods" para o "MileageMidlet" e selecione "Add Method".
  8. Nome do método (naturalmente) "updateDetails".  Deixe "return type void"  e os parâmetros vazios.
  9. Isto criará o método;   dê um duplo clique no novo método no painel "Projects" para editar o corpo.

    Nota: 

    Alternativamente acima, se preferir, poderia simplesmente ir direto para o fonte e criar o novo método digitando lá dentro. Poderá ser mais rápido

  10. Adicione o seguinte código ao corpo do método "updateDetails":

    this.currentMileageVal = Long.parseLong(this.currentMileage.getString());
    int currentGallons = Integer.parseInt(this.gallons.getString());
    int currentCost = Integer.parseInt(this.cost.getString());

    // mostre os totais novos
    this.totalMileageVal = this.currentMileageVal - this.startingMileageVal;
    this.totalCostVal += currentCost;
    this.totalFuelVal += currentGallons;
    this.recalcAveragesAndUpdateSummary();

  11. Necessitará também definir o método "recalcAveragesAndUpdateSummary()". Repita o procedimento da definição do método acima do painel Projects, ou adicione apenas o método na janela do editor. O método deve ser:
    public void recalcAveragesAndUpdateSummary() {

    // aritmética de ponto fixo - conserve tudo multiplicado
    // por um fator 100
    // Necessidade de proteger contra a divisão por 0
    if(this.totalMileageVal == 0) {
    this.avgCostVal = 0;
    } else {
    this.avgCostVal = this.totalCostVal
    / this.totalMileageVal;
    }
    if(this.totalFuelVal == 0) {
    this.avgMpgVal = 0;
    }
    else {
    // Nota: o multiplicador 10000 deve fazer exame no combustível do cliente
    // multiplicador 100 e uns outros 100 para adicionar DP 2 à média
    this.avgMpgVal = (this.totalMileageVal * 10000)
    / this.totalFuelVal;
    }
    // Carregar "String" para valores formatados
    String tempFormat = null;

    // atribuir exatamente a milhagem corrente para conversão "String"
    this.totalMileage.setText(Long.toString(
    this.currentMileageVal));

    // Para "avg cost" - formatar como 23 centavos
    tempFormat = Long.toString(this.avgCostVal) + " cents";
    this.avgCostPerMile.setText(tempFormat);

    // e ponto fixo tambem para "MPG"
    tempFormat = Long.toString(this.avgMpgVal / 100) + "." + Long.toString(this.avgMpgVal % 100);
    this.avgMpg.setText(tempFormat);
    }

     Em seguida,  necessitará preencher o código "Initialization".  Isto é completamente simples agora que você fêz o trabalho acima:

  1. Do "Flow Design",  dê um duplo clique em "InitializeForm" e então edite o comando "OK".
  2. No código do usuário "Pre-Action", incorpore "this.initializeTotalsAndAverages();".
  3. Clique “OK”.
  4. Crie um novo método:

    public void initializeTotalsAndAverages() {
    this.startingMileageVal = Long.parseLong(this.startingMileage.getString());
    this.currentMileageVal = this.startingMileageVal;
    this.totalMileageVal = 0;
    this.totalCostVal = 0;
    this.totalFuelVal = 0;
    this.recalcAveragesAndUpdateSummary();
    }

  5. Salve tudo e reconstrua.

     Esta é a funcionalidade no lugar,  tão simples quanto ela é. Poderá  agora eliminar os erros da aplicação outra vez. Inicialize-o com uma milhagem começando e então  adicione alguns detalhes. Pretende-se ter cheio depois 300 milhas ou algo assim. Deverá ver os detalhes sumários atualizados quando detalhes novos der "OK". Não esqueça de incorporar os galões multiplicados por um fator de 100 (1243 para 12,43 galões) e pelo custo em centavos (2065 para $20,65).

    Existe, entretanto, uma última parte faltante. Quando finalizar agora a direita da aplicação, todos os dados são perdidos. Necessitará de um caminho para persistir.        Felizmente, o mecanismo de persistencia fornecido em Java ME é absolutamente simples.