Aula 08 - Adicionar Pessoa à Classe Livro

Uso contínuo de TDD
Objetivos desta aula:
  • Neste momento temos as Classes Pessoa e Livro
  • Precisamos mostrar qual Pessoa possui um determinado Livro emprestado com alguém
  • Vamos portanto, criar um relacionamento entre Livro e Pessoa
Vamos continuar a usar a metodologia TDD. Para isso, executaremos os seguintes passos:
  1. Criar um método de teste do relacionamento (testGetPessoa) na Classe de teste da Classe Livro (LivroTest)
  2. Implementar o método de relacionamento (getPessoa) na Classe Livro
  3. Executar o teste
Nós já temos uma Classe Pessoa capaz de tratar as Pessoas para as quais emprestamos Livros. Como já foi explicado, vamos começar na Classe de teste da Classe Livro (LivroTest). Nela, vamos criar o método "testGetPessoa" da maneira com a qual já estamos acostumados (usando os facilitadores do Eclipse), assim:
Neste método, vamos criar um objeto do tipo Livro e outro do tipo Pessoa, assim:
Em seguida, usamos um novo método para definir para quem o Livro vai ser emprestado, e preparamos o teste do mesmo, da seguinte forma:
Reparem nos indicativos de erro em relação ao fato de o método "setPessoa" ainda não existir.
Como estamos lidando com um treinamento aqui, e considerando que comparar objetos em Java é um tanto mais complicado. Ao invés de verificar se o objeto Pessoa retornado pelo método "getPessoa" é igual ao objeto p2 definido anteriormente, vamos comparar apenas os nomes, assumindo que cada Pessoa tem um nome único.
Na sequencia, vamos usar o "Quick Fix" do Eclipse para criar estes métodos, posicionando o mouse sobre o erro e selecionando a opção "Create method":
Obtendo o seguinte resultado:
Seguindo o mesmo procedimento para o método "get" teremos o seguinte:
Salvando todo o trabalho, a nossa Classe de teste não terá mais erros:
Vamos agora completar o conteúdo real dos métodos criados. Primeiro o método set:
Reparem que o Eclipse alerta de que o campo "pessoa" não está definido na Classe Livro.
Mais uma vez, vamos usar o "Quick Fix" do Eclipse para corrigir isso, selecionando a opção "Create field", obtendo o seguinte:
O que indica ter sido criado o campo "pessoa" do tipo (Classe) "Pessoa". A diferença é sutil, apenas uma letra maiúscula ou minúscula distingue o nome de um campo do nome de uma Classe.
Notem também que o Eclipse criou o campo "pessoa" usando a palavra "private" no início de definição.
As palavras "private", assim como "public", neste contexto, são chamados "modificadores de acesso", indicando o escopo de abrangência do objeto sendo definido.
No caso, o nosso campo "pessoa" vai ser "visível" apenas dentro do escopo desta Classe onde ele está sendo criado.

Modificadores de Acesso
Em Java existem 4 modificadores de acesso:
  1. public - o objeto é acessado de qualquer Classe ou Subclasse
  2. private - o objeto é acessado apenas na Classe em que foi criado
  3. sem modificador - o objeto é acessado apenas por Classes dentro do "pacote" em que foi criado
  4. protected - o objeto é acessado de qualquer Classe ou Subclasse dentro do "pacote" em que foi criado
Sabendo disso, e se queremos que estes campos estejam disponíveis para outras Classes deste "pacote" vamos retirar os modificadores de acesso, ficando assim:
Vamos agora completar o método get, retornando o objeto do tipo Pessoa já definido para a Classe Livro:
Salvando tudo que foi feito até aqui, estamos prontos para executar o nosso teste.
Desta vez, podemos experimentar a combinação de teclas de atalho do Eclipse para este fim. Você pode estar com outra Classe aberta na área de edição, contanto que a Classe cujos testes você deseja executar esteja selecionada no "Package Explorer", assim:
Usando a combinação de teclas: Alt + Shift + X, T, os testes de JUnit serão executados sobre a Classe que estiver selecionada no "Package Explorer".
O que neste caso, vai nos dar o seguinte resultado:
Recapitulando o que vimos até agora:
  • As Classes Pessoa e Livro, estão relacionadas
  • A Classe Livro depende da Classe Pessoa
  • Este relacionamento é de "Um para Um" (um livro só pode ter um leitor por vez)

Refatoração
Vamos aproveitar para falar um pouco sobre "refactoring". Pois não podemos esquecer ele, é um dos passos da metodologia TDD que estamos aplicando aqui.
É comum a todo artista durante o desenvolvimento da sua obra, tentar melhorar o resultado final. Reescrever um código que já funciona com o intuito de melhorá-lo faz parte da "arte de programar". Desculpem-me alguns gerentes de projeto, mas prefiro tratar os bons desenvolvedores como "artistas" do que como "operários".
Podemos dar aqui um exemplo bem simples de refatoração. Voltando à nossa Classe LivroTest, reparem no seguinte trecho de código:
Ele possui algumas deficiências tais como: Uso de variáveis desnecessárias e nomes não representativos (quem está com o livro não é necessariamente o seu dono).
Primeiro vamos comentar o código atual que vamos refatorar usando o atalho: CTRL + Shift + C, lembrando que ele é do tipo on/off, ou seja, cada vez que é acionado, comenta ou descomenta o trecho de código selecionado:
Vamos refazer este trecho da seguinte forma:
Salvando tudo e executando os testes novamente, devemos ter o mesmo resultado de sucesso de antes.
E assim sendo, podemos remover o código anterior que foi comentado, ficando assim:
Vamos entender um pouco mais sobre a linha de código que acabamos de implementar:
      String quemPegouLivro = l2.getPessoa().getNome();
      
Nela, estamos atribuindo à variável do tipo String "quemPegouLivro", o nome da Pessoa. Mas como?
  • Primeiro, usamos o método "getPessoa" para obter uma instância do objeto do tipo Pessoa a qual o livro está vinculado.
  • Depois, sobre a pessoa recuperada, aplicamos o método "getNome", para obter o nome da pessoa
Neste momento, nós temos duas Classes de teste: PessoaTest e LivroTest, e vamos criar mais. Seria conveniente ter uma forma de executar todos os testes de uma só vez. Podemos obter isso criando uma nova Classe de teste que agregue as demais.

Suite de testes
Podemos agregar várias Classes de teste, criando uma "Suite" de testes, da seguinte forma:
Botão direito do mouse sobre o nosso pacote de testes » New » Other.
E na janela que se abre, vamos selecionar agora "JUnit Test Suite":
A próxima janela, nos permite especificar as características da nossa Suite de testes. Já são exibidos valores default, e entre eles podemos ver que as Classes de teste já existentes, estão selecionadas. Vamos aceitar estes valores default e finalizar:
Obtendo o seguinte:
Sem entrar em maiores detalhes aqui, fica claro que à medida que novas Classes de teste forem criadas, basta incluir novas linhas relativas a elas na nossa Suite de teste.
Mais uma vez, estando com a Classe da nossa Suite de testes selecionada no "Package Explorer", vamos usar a combinação de teclas: Alt + Shift + X, T.
Obtendo agora o seguinte resultado:
Reparem que agora, executando os testes a partir da nossa Suite de testes, todos os métodos de teste de todas as nossas Classes de teste são executados de uma só vez.

Nenhum comentário:

Postar um comentário