Refatoração em métodos semelhantes

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.

[code]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);
}[/code]

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.

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