Aula 10 - Classe Biblioteca

Library e Biblioteca
A palavra "Library" no mundo Java define um conjunto de pacotes. Poderia haver alguma confusão de nomes se estivéssemos trabalhando em Inglês, pois Classe que vai representar os Livros que temos e as Pessoas que podem pegar os livros emprestados, deveria também se chamar "Library". Mas, como aqui, estamos usando nomes em Português, não há nenhum problema de confusão entre "Library" e "Biblioteca", que vai ser o nome da nossa Classe.
Vamos continuar a usar a metodologia TDD. Portanto:
O nome da nossa Classe de Teste vai ser "BibliotecaTest". E vamos deixar o nome da Classe sendo testada em branco, pois ela ainda não existe.
Obtendo o seguinte:
Vamos primeiramente criar o método de teste do Construtor da Classe. Sempre usando os facilitadores do Eclipse:
Aqui vamos usar um novo tipo de teste. É o "assertTrue". O objetivo aqui, vai ser verificar se a nossa instância da Classe Biblioteca, possui um ArrayList contendo Livros e outro contendo Pessoas. Dessa forma:
Desta forma, sabemos que o nosso método Construtor da Classe Biblioteca, além de criar a instância da nossa Biblioteca, vai precisar também adicionar a ela uma lista de Livros e outra de Pessoas.
Vamos prosseguir usando o "Quick Fix" do Eclipse para nos ajudar a criar a Classe para atender a este Teste. Posicionando o mouse sobre o erro, temos:
Escolhendo a opção de Criação da Classe...
Na janela que se apresenta, precisamos lembrar de alterar o nome da pasta onde a Classe será criada para "src".
Feito isso, teremos o seguinte:
A seguir, ainda usando o "Quick Fix" do Eclipse, vamos criar o Construtor da Classe:
Gerando o seguinte:
Vamos prosseguir usando o "Quick Fix" do Eclipse para solucionar os problemas apontados na nossa Classe de teste, e ao mesmo tempo ir completando a nossa Classe Biblioteca.
Primeiro o campo "nome".
Em seguida, devemos nos preocupar com os campos "livros" e "pessoas", mas reparem que ambos são do tipo "ArrayList", e este tipo não está sendo reconhecido pelo compilador. A solução para isso é simples, basta importar o pacote java.util que contém este tipo de dado.
Fazendo conforme indicado, o pacote é importado para a nossa Classe de teste e o erro desaparece.
Agora o campo "livros".
Não esquecendo que para que os erros desapareçam da Classe de teste, a Classe Biblioteca deve ser salva a cada alteração. E também que alguns desses erros, só desaparecerem, se a própria Classe de teste for salva.
Da mesma forma, vamos fazer para o campo "pessoas".
Neste momento, com todo o trabalho feito até aqui já salvo, não há mais erros de compilação no projeto.
Lembrando também, que existe uma outra forma de acessar os problemas e advertências para tratá-los. É a aba "Problems", geralmente localizada na parte inferior da janela do Eclipse.
Neste ponto, nós estamos aptos a completar o método construtor da Classe Biblioteca.
Antes disso, no entanto, vamos cuidar para que os campos da Classe Biblioteca possam ser acessados por outras Classes dentro do mesmo pacote. Para isso, como já mencionado anteriormente, basta remover o modificador "public" da definição dos campos, assim:
Com isso, a nossa Classe de teste pode acessar estes campos da forma correta, mas classes fora deste pacote, não podem.
A próxima intervenção em relação aos campos, é atender os alertas, e definir que tipo de Objeto vai ser tratado em cada uma das Listas.
Para isso, vamos usar a aba "Problems" já citada, selecionar uma das linhas, acionar o botão direito do mouse e selecionar "Quick Fix", assim:
Na janela que se abre, selecionamos as duas linhas com este mesmo problema, e escolhemos o ajuste 
"Add type arguments to ArrayList", assim.
Com isso, temos o problema parcialmente resolvido:
Mas precisamos substituir os pontos de interrogação pelos tipos de Objetos realmente desejados, assim:
Podemos agora ajustar o Construtor propriamente dito, começando pelo nome do campo de parâmetro, de "string" que foi gerado automaticamente para "nome", que é bem mais apropriado.
Em seguida, vamos atribuir o parâmetro "nome" recebido, ao atributo "nome" da instância que estiver sendo criada, assim:
O próximo passo, é criar os atributos de Livros e Pessoas da instância no formato de Listas, assim:
Existem algumas características que devem ser ressaltadas nestas duas linhas.
    livros = new ArrayList<Livro>();
    pessoas = new ArrayList<Pessoa>();
      
Quando chamamos o Construtor de um "ArrayList" usando o comando "new", e especificamos o tipo do Objeto específico que queremos usando o parâmetro de tipo "<Tipo>", é necessário o uso de () para finalizar o construtor de ArrayList, pois ele não possui parâmetros.
Portanto, a sintaxe do construtor nesses casos, é a seguinte:
    new TipoGenérico<TipoEspecífico>();
      
Outra observação importante, é em relação à declaração dos campos a nível da Classe.
Campos declarados na Classe, não devem ser declarados novamente nos métodos da Classe, pois na verdade, estariam sendo declaradas novas variáveis, locais aos métodos, podendo causar muita confusão. A título de aprendizado, vamos ver o que ocorre se isso for feito.
Reparem que é gerado um alerta para o fato de a variável local "livros" não ter sido usada no escopo do método. Este é um erro muito comum de acontecer com iniciantes em Java, portanto, vamos evitá-lo, certo?
Com a nossa Classe Biblioteca criada, é hora de executar o nosso teste, e ver o que acontece.
Se tudo correu bem, o teste deve passar:
Um detalhe que deve ser observado em relação aos testes de JUnit, é que os nomes dos métodos de teste devem começar por "test".
Mais uma vez, a título de aprendizado, vamos ver o que ocorre se isso não for feito.
Com o nome do método alterado desta forma, e executando o teste novamente, teremos:
Reparem no alerta dizendo que não foi encontrado nenhum teste na Classe. Tudo por conta do nome fora do padrão esperado. Fiquem atentos!
Uma última observação a respeito dos testes: eles podem nos ajudar saber de antemão, qual tipo de dado é suportado por cada método.
Sabemos que os livros de uma Biblioteca são do tipo ArrayList. O que acontece se alguém tentar adicionar um livro usando um tipo de dado diferente do esperado?
Reparem que é gerado um erro de compilação justamente dizendo que o método não se aplica ao tipo de dado passado como parâmetro, pois ele esperava um "ArrayList" e foi passado um "String".

Nenhum comentário:

Postar um comentário