Aulas: 13 e 14 - Evoluido os métodos de Empréstimo e Devolução

Melhorando os métodos de Empréstimo e Devolução
A essa altura, poderíamos pensar que o nosso método de Empréstimo, está pronto.
Mas será que está mesmo? Alguém lembra que existe um limite de Livros que uma Pessoa pode pegar emprestado?
Na Classe Pessoa, nós havíamos criado o campo maxLivros, com a finalidade de limitar o número de Livros que uma Pessoa pode pegar emprestado simultaneamente.
No entanto, nós não tratamos disso no método de empréstimo nem nos seus respectivos testes.
Lembrou? Então vamos cuidar disso. Mais uma vez, usando TDD, vamos começar pelos testes.
Vamos incluir mais alguns testes no método testMovimentaLivro da Classe BibliotecaTest.
Desta forma:
O primeiro teste com assertTrue, garante que eu devo conseguir emprestar o Livro "l2" para a Pessoa "p1".
Já o segundo teste com assertFalse, garante que eu não devo conseguir emprestar o Livro "l1" para a mesma Pessoa "p1", pois o seu limite de Livros emprestados (1 no caso) foi atingido.
Se neste momento, executarmos os testes, eles devem falhar, pois nós não alteramos o método de Empréstimo para levar em consideração o limite de Livros. Vamos confirmar isso (Alt + Shift + X + T):
Realmente, como era de se esperar, os testes falham. E é emitida a mensagem de Empréstimo indevido, pois como nós ainda não implementamos um tratamento para o limite de Livros, o método conseguiu emprestar mais um Livro para a mesma Pessoa mesmo com o limite sendo excedido.
Agora, para que possamos testar se o número máximo de Livros que uma Pessoa pode pegar emprestado foi atingido, precisamos antes de mais nada saber, quantos livros aquela Pessoa já havia pego emprestado.
Fica clara a necessidade de um método getLivrosPorPessoa. Tendo este método, seria bastante simples obter a quantidade de Livros, desta forma:
        quantidade = b1.getLivrosPorPessoa(p1).size();
      
Mas vamos manter o padrão, e começar pelos testes:
Agora reparem naquelas 4 linhas do método testMovimentaLivro, nós já as havíamos usado mais acima, e vamos precisar usar novamente neste novo método.
Isso é chamado de: redundância de código. Para evitar esse tipo de situação, assim que uma repetição de um determinado trecho de código é detectada, devemos procurar transformar o conteúdo deste trecho, num método à parte.
É mais um caso de Refatoração de Código, como vimos no item 12, aula 08.
Nesses casos, mais uma vez, os facilitadores do Eclipse nos ajudam.
Com as linhas que nos interessam selecionadas, na barra de menus, selecionar: Refactor » Extract Method..., ou usar o atalho: Alt + Shift + M.
Na Janela que se abre, especificar o nome desejado para o método, assim:
Isso faz com que todas as ocorrências daquelas linhas sejam substituídas pela chamada do novo método que foi automaticamente criado pelo Eclipse. Desta forma:
Agora, com o método addItems criado, podemos fazer uso dele no nosso novo método de teste:
Prosseguindo na implementação, vamos fazer os testes, na seguinte sequência:
  • Garantir que no início, a Pessoa "p1" não tenha pego nenhum Livro.
  • Emprestar o Livro "l1" para a Pessoa "p1".
  • Verificar se o tamanho da Lista de Livros da Pessoa "p1", é o esperado.
  • Verificar se o índice do Livro "l1" na Lista de Livros é o esperado.
  • Emprestar o Livro "l2" para a Pessoa "p1".
  • Verificar se o tamanho da Lista de Livros da Pessoa "p1", é o esperado.
  • Verificar se o índice do Livro "l2" na Lista de Livros é o esperado.
O que vai nos levar ao seguinte:
Aqui, usamos mais uma vez o recurso de Lista (ArrayList).
Prosseguindo, vamos usar novamente o Quick Fix do Eclipse para criar o método.

Finalizando os métodos de Empréstimo e Devolução
O método getLivrosPorPessoa, será implementado da seguinte forma:
A qual, merece algumas explicações. Vamos ver linha a linha:
  1. Define o ArrayList resultado que vai armazenar a Lista que o método deve retornar.
  2. Um laço do tipo "foreach", que vai percorrer a lista de Livros.
  3. O "if" que define as condições que vão eleger um elemento para a nossa Lista.
    • O Livro deve estar emprestado a uma Pessoa.
    • O nome da Pessoa a qual o Livro foi emprestado
      deve ser igual ao da Pessoa passada como parâmetro
  4. O elemento eleito é adicionado na Lista.
  5. O ArrayList "resultado" é retornado.
Como funciona o laço "foreach"?
  1. Coloca o primeiro Livro da lista "this.getLivros" em "umLivro"
  2. Executa o bloco de código
  3. Coloca o próximo Livro em "umLivro"
  4. Executa o bloco de código
  5. Repete até o final da Lista
O laço do tipo "foreach" é o mais indicado para processar Listas.
Observem também, que o "if" da linha 66 possui duas condições interligadas. Neste caso, foi usado o operador &&, que é o "E lógico", ou seja, para que a condição como um todo seja satisfeita, cada uma de suas partes deve ser satisfeita.
É muito importante notar que usamos o método ".equals()" para comparar o String nome da Pessoa. Esta é a forma correta de se comparar Objetos em Java. O operador "==", só deve ser usado para comparar tipos primitivos (int, boolean, char, double, etc.).
Depois disso tudo, é hora de executarmos os testes novamente. Vamos mais uma vez, selecionar a Classe de Teste BibliotecaTest e usar o atalho já conhecido: Alt + Shift + X + T:
Podemos ver que apesar de o teste do método "movimentaLivro" ter falhado, o teste do método "getLivrosPorPessoa", passou! Isso está correto, pois nós ainda não terminamos o método "movimentaLivro".
Neste ponto, alguém pode perguntar: É mesmo necessária a primeira condição do if, verificando se o objeto Pessoa associado ao Livro não está nulo? Vamos alterar o código desta forma:
E testar novamente, selecionando a Classe de Teste BibliotecaTest e usando o atalho: Alt + Shift + X + T:
Desta forma ocorreu um erro de compilação, gerando a mensagem "NullPointer Exception".
Esta é uma das mensagens de erro mais comuns no ambiente Java. E o motivo é sempre o mesmo: A tentativa de manipular um Objeto inexistente (null).
No nosso caso, com a retirada do teste, os Livros que não tinham sido atribuídos a nenhuma Pessoa, passaram a ser considerados, e no primeiro Livro da nossa Lista que não tinha Pessoa atribuída, onde tentamos obter o nome da Pessoa com "umLivro.getPessoa().getNome()" ocorreu o erro.
Tendo aprendido mais um pouco sobre os possíveis erros e necessidade de testes, vamos voltar o código à situação anterior com as duas condições:
Feito isso, podemos voltar ao método de Empréstimo, e implementar a verificação do limite de Livros por Pessoa, assim:
Foram duas as modificações feitas. Vamos ver linha a linha:
  1. Foi criada a variável "livrosEmprestados", que armazena o tamanho da Lista de Livros da Pessoa que foi passada como parâmetro.
  2. Foi inserida uma segunda condição no "if" para verificar se a quantidade de Livros que a Pessoa passada como parâmetro pediu emprestado, ainda é menor que o limite.
Com estas alterações feitas, é hora de testar novamente, selecionando a Classe de Teste BibliotecaTest e usando o atalho: Alt + Shift + X + T:
Agora sim, o teste deve passar.
Uma última verificação deve ser feita.
Como já havíamos incluído a Classe "BibliotecaTest" na nossa Suite de testes "AllTests", basta selecioná-la, e usando o mesmo atalho: Alt + Shift + X + T, executar todos os testes, garantindo que estas últimas alterações não causaram problema em outras partes da aplicação.
E aí está. Todos os testes devem ter passado e a nossa aplicação já evoluiu bastante!

Nenhum comentário:

Postar um comentário