Versão ALPHA! Este artigo está em versão 'Alpha' e, portanto, não foi ainda revisado corretamente

Implementação

Introdução

Depois de finalizado o teste e vermos o mesmo falhar, o próximo passo é fazer a implementação da classe referente ao Gen. Na maioria dos casos teremos uma interface que definirá os métodos do Gen, sendo assim, devemos criar uma classe que implemente essa interface.

Passo-a-passo

Seguindo o que esperamos que nossa implementação faça, ou seja, deve retornar o que dizemos que o nosso teste deve testar, teremos a interface do Gen com a seguinte estrutura:

@ImplementedBy(RelatorioDeAlunoGenGuice.class)
public interface RelatorioDeAlunoGen {

  RelatorioDeAluno gerarDe(Aluno aluno);

}

Note que a inteface tem a anotação @ImplementedBy que define qual classe concreta fará a implementação dessa interface. Ao criar a classe que implementará a interface acima também seguimos a convenção de nomeá-la com a palavra Guice no final.

Na classe de implementação, devemos implemetar a lógica do método gerarDe(), que dado um aluno, retorne uma instância de RelatorioDeAluno. Como foi falado no artigo sobre o teste, precisaremos de um construtor de RelatorioDeAluno para obtermos uma instância do mesmo. Nesse contexto, construtor refere-se a sub-interface definida na interface RelatorioDeAluno, onde será declarado o que for necessário para construir uma instância de RelatorioDeAluno.

Nesse exemplo, essa é estrutura da interface RelatorioDeAluno:

public interface RelatorioDeAluno {

  interface Construtor extends br.com.objectos.comuns.base.Construtor<RelatorioDeAluno> {

    String getNomeDoAluno();

    List<Fatura> getFaturasEmAberto();

    List<Disciplina> getDisciplinas();

  }

  String getNomeDoAluno();

  List<Fatura> getFaturasEmAberto();

  List<Disciplina> getDisciplinas();

}

Na implementação do método gerarDe() a estrutura mais comumente encontrada é a seguinte:

public RelatorioDeAluno gerarDe(Aluno aluno) {
  return new Construtor(aluno).novaInstancia();
}

Onde Construtor é a classe interna que implementaremos, onde de fato será construída uma instância de RelatorioDeAluno. O método novaInstancia() é declarado na implementação da interface RelatorioDeAluno. Esse método vem da interface Construtor da biblioteca objectos :: way :: base.

A classe interna Construtor que ficará dentro de RelatorioDeAlunoGenGuice, terá a estrutura exibida abaixo. Antes de implementar a lógica do método gerarDe() crie a classe interna Construtor, isso nos ajudará a pensar no que precisaremos passar para o construtor para construtruir uma instância de RelatorioDeAluno.

private class Construtor implements RelatorioDeAluno.Construtor {

  private final Aluno aluno;

  public Construtor(Aluno aluno) {
    this.aluno = aluno;
  }

  @Override
  public RelatorioDeAluno novaInstancia() {
    return new RelatorioDeAlunoPojo(this);
  }

  @Override
  public String getNomeDoAluno() {
    return aluno.getNome();
  }

  @Override
  public List<Fatura> getFaturasEmAberto() {
    return buscarFatura.vencidas(aluno);
  }

  @Override
  public List<Disciplina> getDisciplinas() {
    return buscarDisciplina.porAluno(aluno);
  }

}

O Construtor basicamente nos informa do que vamos precisar para construir uma instância de uma determinada classe, mas não nos diz como isso ocorrerá. Então não existe uma maneira exata de implementar seus métodos, o importante é retornar o que está sendo pendido nas assinaturas dos métodos. No código acima por exemplo, a implementação do método getFaturasEmAberto() poderia não ter como buscar diretamente do banco de dados as faturas vencidas, mas somente todas as faturas de um determinado aluno. Sendo assim, teríamos que implementar outro método ou classe que ficaria com a responsabilidade de filtrar e devolver somente as faturas vencidas. Dado esse cenário, podemos ter uma situação com essa:

public List<Fatura> getFaturasEmAberto() {
  FaturaVencidaGen res = gen.gerarDe(aluno);
  return res.getFaturas();
}

Como é possível notar precisamos de outra classe, ou seja, de outro Gen, logo será necessário fazer um teste seperado para FaturaVencidaGen. O mais importante para tomar nota é que em algumas ocasiões será necessários delegar tarefas para outro subgen. É possível perceber que um grande problema pode ser quebrado em várias partes, delegando tarefas específicas para cada classe e na sequência integrá-las num único local.

Observe também que tínhamos precisado de um Aluno para construir uma RelatorioDeAluno. Sendo assim, o método gerarDe() recebeu uma referência de Aluno, que passou a mesma referência para a classe interna Construtor e dentro do Construtor foi definido que precisavamos obter a faturas não pagas de aluno e as disciplinas desse aluno, esses mesmos obtidos através dos buscadores BuscarFatura e BuscarDisciplina.

Veja como ficou a estrutura completa da classe RelatorioDeAlunoGenGuice:

class RelatorioDeAlunoGenGuice implements RelatorioDeAlunoGen {

  private final BuscarDisciplina buscarDisciplina;

  @Inject
  public RelatorioDeAlunoGenGuice(BuscarDisciplina buscarDisciplina) {
    this.buscarDisciplina = buscarDisciplina;
  }

  @Override
  public RelatorioDeAluno gerarDe(Aluno aluno) {
    return new Construtor(aluno).novaInstancia();
  }

  private class Construtor implements RelatorioDeAluno.Construtor {

    private final Aluno aluno;

    public Construtor(Aluno aluno) {
      this.aluno = aluno;
    }

    @Override
    public RelatorioDeAluno novaInstancia() {
      return new RelatorioDeAlunoPojo(this);
    }

    @Override
    public String getNomeDoAluno() {
      return aluno.getNome();
    }

    @Override
    public List<Fatura> getFaturasEmAberto() {
      return buscarFatura.vencidas(aluno);
    }

    @Override
    public List<Disciplina> getDisciplinas() {
      return buscarDisciplina.porAluno(aluno);
    }

  }

}

Códigos-fonte

RelatorioDeAlunoGen.java
RelatorioDeAlunoGenGuice.java
RelatorioDeAlunoPojo.java
BuscarFatura.java
BuscarDisciplina.java
br.com.objectos.comuns.base.Construtor


 
 

objectos, Fábrica de Software LTDA

  • R. Demóstenes, 627. cj 123
  • 04614-013 - Campo Belo
  • São Paulo - SP - Brasil
  • +55 11 5093-8640
  • +55 11 2359-8699
  • contato@objectos.com.br