Refatoração em métodos semelhantes

2 respostas
Robson_Bittencourt

Desenvolvi essa aplicação na disciplina de programação Java. Ela está fazendo o que foi proposto, já foi entregue. Porém agora que estou de férias gostaria de refatorá-la, existem muitos métodos semelhantes, porém não consigo enxergar como tratá-los mais genericamente. Segue o exemplo abaixo, essa classe faz todo o crud da aplicação. Se alguém tiver alguma opinião, agradeço.

PS: Não postei o código inteiro para não poluir, se precisarem algum método para completar a ideia eu posto.

public class ManipuladorXML {

    SAXBuilder builder = new SAXBuilder();
    File arquivoPerguntas = new File("src/xml/perguntas.xml");
    File arquivoMaterias = new File("src/xml/materia.xml");
    File arquivoProvas = new File("src/xml/provas.xml");
    Document documentPerguntas = criarDocument(arquivoPerguntas);
    Document documentMaterias = criarDocument(arquivoMaterias);
    Document documentProvas = criarDocument(arquivoProvas);
    Element rootNodePerguntas = documentPerguntas.getRootElement();
    Element rootNodeMaterias = documentMaterias.getRootElement();
    Element rootNodeProvas = documentProvas.getRootElement();

    public Document criarDocument(File _arquivo) {
        Document document = new Document();
        try {
            document = (Document) builder.build(_arquivo);
        } catch (IOException | JDOMException io) {
            System.out.println(io.getMessage());
        }
        return document;
    }

    public void inserirPerguntaXML(Pergunta _pergunta) {
        Element pergunta = new Element("pergunta");
        pergunta.setAttribute("descricao", _pergunta.getDescricao());
        pergunta.setAttribute("materia", _pergunta.getMateria());
        pergunta.setAttribute("nivel", _pergunta.getNivel());

        for (int i = 0; i < 4; i++) {
            Element resposta = new Element("resposta");
            resposta.setAttribute("descricao", _pergunta.getRespostas().get(i).getDescricao());
            if (_pergunta.getRespostas().get(i).estaCorreta()) {
                resposta.setAttribute("correta", "sim");
            } else {
                resposta.setAttribute("correta", "nao");
            }
            pergunta.addContent(resposta);
        }

        rootNodePerguntas.addContent(pergunta);
        gravar(documentPerguntas, arquivoPerguntas);
    }

    public void inserirMateriaXML(Materia _materia) {
        List list = rootNodeMaterias.getChildren("materia");
        int codigo = 0;

        for (Object o : list) {
            Element materia = (Element) o;
            codigo = Integer.parseInt(materia.getAttributeValue("codigo"));
        }

        Element materia = new Element("materia");
        materia.setAttribute("codigo", Integer.toString(codigo + 1));
        materia.setAttribute("descricao", _materia.getDescricao());

        rootNodeMaterias.addContent(materia);
        gravar(documentMaterias, arquivoMaterias);
    }

    public void inserirProva(Prova _prova) {
        Element prova = new Element("prova");
        prova.setAttribute("id", getIdProva());
        prova.setAttribute("curso", _prova.getCurso());
        prova.setAttribute("materia", _prova.getMateria());
        prova.setAttribute("nivel", _prova.getNivel());
        prova.setAttribute("qtdPerguntas", Integer.toString(_prova.getQuantidadePerguntas()));
        prova.setAttribute("professor", _prova.getProfessor());
        prova.setAttribute("data", _prova.getData());

        for (int i = 0; i < _prova.getQuantidadePerguntas(); i++) {
            Element pergunta = new Element("pergunta");
            pergunta.setAttribute("descricao", _prova.getPerguntas().get(i).getDescricao());
            pergunta.setAttribute("materia", _prova.getPerguntas().get(i).getMateria());
            pergunta.setAttribute("nivel", _prova.getPerguntas().get(i).getNivel());

            for (int r = 0; r < 4; r++) {
                Element resposta = new Element("resposta");
                resposta.setAttribute("descricao", _prova.getPerguntas().get(i).getRespostas().get(r).getDescricao());
                if (_prova.getPerguntas().get(i).getRespostas().get(r).estaCorreta()) {
                    resposta.setAttribute("correta", "sim");
                } else {
                    resposta.setAttribute("correta", "nao");
                }
                pergunta.addContent(resposta);
            }

            prova.addContent(pergunta);
        }

        rootNodeProvas.addContent(prova);
        gravar(documentProvas, arquivoProvas);
    }

2 Respostas

csr_

Oi Robson,

Uma dica para refatoração neste caso seria separar sua lógica da manipulação de xml.

Sua classe ManipuladorXML esta recebendo muita responsabilidade, ela deveria fazer somente o que diz que faz, manipular xml.

Um pequeno exemplo:

public class ManipuladorXML {

  private String caminhoArquivo;

  public ManipuladorXML(String caminhoArquivo) {
    this.caminhoArquivo = caminhoArquivo;
  }

  public void escrever(String conteudo){ ...}

  public String ler() { ... }
}

Outra dica seria interar usas coleções com for each, aqui tem um pequeno exemplo: http://www.java-tips.org/java-se-tips/java.lang/how-to-use-for-each-loop.html

Mas esta é minha opinião pessoal, parabéns pela tarefa concluída.

Até mais.

Robson_Bittencourt

Muito obrigado csr_.

Vou seguir sua dica sobre as responsabilidades, por acaso esta semana me deparei com ela também no livro Código Limpo do Robert C. Martin e já estava pensando em aplicá-la no meu projeto.

Segue o código do projeto no GitHub se te interessar: https://github.com/robsonbittencourt/Gerenciador_de_Provas

Criado 11 de julho de 2012
Ultima resposta 11 de jul. de 2012
Respostas 2
Participantes 2