Otimizar método

Bom dia galera, tdo certo? Bem, na minha aplicação eestou tendo que fazer transferências de alunos de uma turma para outra…Então fiz o seguinte método:

 public void atualizaNotasDoAlunoNaTurmaDestino(Integer codMatricula) {

        List<Grade> listGradeOrigem = new ArrayList<Grade>();
        List<Grade> listGradeDestino = new ArrayList<Grade>();

        if (crudObj.getTurma() != null && crudObj.getTurmaDestino() != null) {
            if (!crudObj.getTurma().getCodigo().toString().equals(crudObj.getTurmaDestino().getCodigo().toString())) {
                for (Grade grade : crudObj.getTurma().getEtapasList().get(0).getGradeCollection()) {
                    listGradeOrigem.add(grade);
                }
                for (Grade grade : crudObj.getTurmaDestino().getEtapasList().get(0).getGradeCollection()) { // a coleção de grade possui as disciplinas que cada etapa(série) possui...
                    listGradeDestino.add(grade);
                }

                for (int i = 0; i < listGradeOrigem.size(); i++) { // origem
                    for (int j = 0; j < listGradeDestino.size(); j++) { //destino
                        if (listGradeOrigem.get(i).getDisciplina().getCodigo() == listGradeDestino.get(j).getDisciplina().getCodigo()) {
                            notasParaTurmaDestinoList = notaService.buscaNotasDoAluno(crudObj.getMatricula());
                        }
                    }
                }


                for (Nota n : notasParaTurmaDestinoList) {
                    Nota nota = new Nota();
                    //nota.setCodigo();
                    nota.setAno(n.getAno());
                    nota.setMatriculas(crudObj.getMatriculaDestino());
                    nota.setAluno(n.getAluno());
                    nota.setDisciplina(n.getDisciplina());
                    nota.setEscola(n.getEscola());
                    nota.setPeriodo(n.getPeriodo());
                    nota.setNota(n.getNota());
                    nota.setConceito(n.getConceito());
                    nota.setNroFaltas(n.getNroFaltas());
                    nota.setTurma(crudObj.getTurmaDestino());
                    // nota.setStatus(n.getStatus());
                    nota.setParecer(n.getParecer());
                    nota.setNotaRecuperacao(n.getNotaRecuperacao());
                    nota.setEtapa(n.getEtapa());
                    nota.setAvaliacoes(n.getAvaliacoes());
                    nota.setPercFaltas(n.getPercFaltas());
                    nota.setNotaParcial(n.getNotaParcial());
                    nota.setCodParecer(n.getCodParecer());
                    getCrudService().save(nota);
                }


            } else {
                JsfUtil.warn("Você não pode transferir um aluno para a mesma turma.Verifique.");
            }
        }
    }

Está funcioando, porém, queria otimizá-lo…Por exemplo, vou fazer uma transferência de um aluno da turma A para turma A1: A turma A era composta por 3 trimestres e a média final. Além disso possuía 14 matérias. Então, nesse caso seriam 56 notas para transferir para a outra turma…A transferência está levando em média 8 segundos no caso como citado…Se alguém puder ajudar, agradeceria mto…vLW…

Usa o Design Pattern DAO, isso já deixaria seu código muito mais limpo.

rafadelnero, nunca utilizei o mesmo, pesquisei sobre ele mas n entendi mto bem…Estou fazendo esse método em um bean…Teria como eu melhorar ele, por exemplo…deixar a consulta mais rápida?? Vlw…

Umas dúvidas e observações:

  • Os métodos crudObj.getXXXX() buscam as informações no banco de dados a cada chamada? Se for pode ter muitas consultas desnecessárias.

  • Procure utilizar os recursos que as listas oferecem. Por exemplo, ao invés de:

List<Grade> listGradeOrigem = new ArrayList<Grade>();
//....
for (Grade grade : crudObj.getTurma().getEtapasList().get(0).getGradeCollection()) {  
     listGradeOrigem.add(grade);  
}  

Faça:

Assim a lista é criada com todos os elementos da outra, com um código mais curto e legível além de uma ligeira melhoria de performance devido às otimizações implementadas pela própria ArrayList. (esse não é o grande problema na performance do seu método, mas qualquer ajuda é bem-vinda)

  • Qual é o propósito desses loops aninhados:
    for (int i = 0; i < listGradeOrigem.size(); i++) { // origem for (int j = 0; j < listGradeDestino.size(); j++) { //destino if (listGradeOrigem.get(i).getDisciplina().getCodigo() == listGradeDestino.get(j).getDisciplina().getCodigo()) { notasParaTurmaDestinoList = notaService.buscaNotasDoAluno(crudObj.getMatricula()); } } }
    A única tarefa que é feita dentro desse código (notaService.buscaNotasDoAluno) não depende em nada dos valores das coleções, então por que está aí?

if (crudObj.getTurma() != null && crudObj.getTurmaDestino() != null) { /// Faz tudo } // Se não, não faz nada
É realmente normal dentro das regras de negócio não existir uma das turmas? Será que essa condição poderia ser ignorada?

rafadelnero, nunca utilizei o mesmo, pesquisei sobre ele mas n entendi mto bem…Estou fazendo esse método em um bean…Teria como eu melhorar ele, por exemplo…deixar a consulta mais rápida?? Vlw…[/quote]

A consulta não ficará mais rápida, porém seu código ficará muito mais legível, na apostila FJ-11 da Caelum ensina DAO passo a passo.

Complementando o que o pessoal já disse sobre deixar seu código mais limpo: se ele estiver mais simples de entender, fica mais fácil otimizá-lo.