Solucionado (ver solução)
Solucionado
(ver solução)
4
respostas

[Dúvida] Como deixar meu código mais profissional

Criei o código abaixo para a resolução de um problema proposto pelo curso Java: aplicando a Orientação a Objetos, porém, meu conhecimento em boas práticas ainda são bem básicos e gostaria de saber o que eu poderia melhorar neste meu código para deixa-lo mais semelhante a um profissional

package br.com.alura.modificadores.models;

import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.ArrayList;
import java.util.List;
import java.util.Collections;

public class Aluno {
private String nome;
private List notas = new ArrayList<>();

public String getNome() {
    return nome;
}

public List<BigDecimal> getNotas() {
    return Collections.unmodifiableList(this.notas);
}

public void setNome(String nome) {
    this.nome = nome;
}

public boolean adicionarNota(String nota) {
    BigDecimal notaCovertida = new BigDecimal(nota);
    if (notaCovertida.compareTo(BigDecimal.ZERO) >= 0 && notaCovertida.compareTo(BigDecimal.TEN) <= 0) {
        this.notas.add(notaCovertida);
        return true;
    } else {
        return false;
    }

}

public BigDecimal calcularMedia() {
    if (notas.isEmpty()) {
        return BigDecimal.ZERO;
    }

    BigDecimal soma = BigDecimal.ZERO;
    for (BigDecimal notasUnitarias : notas) {
        soma = soma.add(notasUnitarias);
    }
    BigDecimal tamanho = BigDecimal.valueOf(notas.size());
    BigDecimal mediaFinal = soma.divide(tamanho, 2,RoundingMode.HALF_UP);
    return mediaFinal;
}

}


import br.com.alura.modificadores.models.Aluno;

import java.util.Scanner;

public class Principal3 {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
Aluno aluno1 = new Aluno();
boolean loopExterno = false;

    System.out.println("Digite o nome do aluno: ");
    aluno1.setNome(input.nextLine());
    System.out.println("Agora adicione as notas do aluno %s".formatted(aluno1.getNome()));
    System.out.println("Se desejar parar ou não adicionar nenhuma nota digite Stop");
    int i = 1;
    while (!loopExterno) {
        System.out.println("Nota %d°".formatted(i));
        String nota = input.nextLine();
        if (nota.equalsIgnoreCase("stop")) {
            loopExterno = true;
        } else if (aluno1.adicionarNota(nota)) {
            System.out.println("Nota adicionada com sucesso");
            i++;
        } else {
            System.out.println("Valor inválido, tente novamente");
        }
    }
    System.out.printf("%n%n");
    if (aluno1.getNotas().isEmpty()) {
        System.out.println("Sem notas para tirar a média");
    } else {
        System.out.println("A media do aluno é: " + aluno1.calcularMedia());
    }
}

}

Matricule-se agora e aproveite até 50% OFF

O maior desconto do ano para você evoluir com a maior escola de tecnologia

QUERO APROVEITAR
4 respostas
solução!

Oi, Antonio! Como vai?

Seu código está bem estruturado e demonstra que você entendeu conceitos fundamentais da Orientação a Objetos. A utilização de BigDecimal foi uma ótima escolha para lidar com valores numéricos com precisão. Uma melhoria interessante seria tipar a lista diretamente, evitando raw types, e pensar em encapsular responsabilidades (por exemplo, separar lógica de entrada de dados da lógica de cálculo).

Alura Conte com o apoio da comunidade Alura na sua jornada. Abraços e bons estudos!

Olá Antonio.
Excelente iniciativa em buscar melhorar a qualidade e profissionalismo do seu código.
Seu código está funcional e bem estruturado, mas há pequenas melhorias de boas práticas, legibilidade e design orientado a objetos que podem deixá-lo mais profissional.
Vamos analisar:

  • Você declarou private List notas = new ArrayList<>(); sem especificar o tipo genérico.
    Declare o tipo explicitamente (List<BigDecimal>) e inicialize com ArrayList<>.
    Além disso, evite expor a lista diretamente.
    Já fez isso bem com Collections.unmodifiableList, mas o tipo cru ainda é um ponto a corrigir.
private final List<BigDecimal> notas = new ArrayList<>();

Dica: usar final aqui indica que a referência à lista não será reatribuída (embora o conteúdo ainda possa mudar).

  • O método adicionarNota(String nota) mistura lógica de conversão, validação e adição.
    Um código mais profissional separa essas responsabilidades.
    Exemplo :
public boolean adicionarNota(String notaStr) {
    try {
        BigDecimal notaConvertida = new BigDecimal(notaStr);
        if (notaValida(notaConvertida)) {
            this.notas.add(notaConvertida);
            return true;
        }
    } catch (NumberFormatException e) {
        // Ignora e retorna falso
    }
    return false;
}

private boolean notaValida(BigDecimal nota) {
    return nota.compareTo(BigDecimal.ZERO) >= 0 && nota.compareTo(BigDecimal.TEN) <= 0;
}

Assim o código fica mais limpo e testável.

  • Você pode aproveitar as APIs modernas do Java para simplificar o cálculo da média.
public BigDecimal calcularMedia() {
    if (notas.isEmpty()) return BigDecimal.ZERO;

    BigDecimal soma = notas.stream()
            .reduce(BigDecimal.ZERO, BigDecimal::add);

    return soma.divide(BigDecimal.valueOf(notas.size()), 2, RoundingMode.HALF_UP);
}

Isso elimina o loop explícito e torna o código mais declarativo.

  • Evite deixar a classe Aluno fazer tudo.
    Se o programa crescer, talvez você queira criar uma classe de serviço(por exemplo, AlunoService) responsável pela interação com o usuário ou cálculos, mantendo Aluno apenas como modelo de dados.

  • Na classe Principal3, você usa System.out.printf("%n%n"); e .formatted(...).
    Isso é bom, mas você pode melhorar a consistência e legibilidade:

  • Use printf para tudo ou String.format — misturar os dois pode confundir.
  • Use nomes de variáveis mais descritivos, como continuarInserindoNotas em vez de loopExterno.

continua ....

Alguns toques de estilo que ajudam muito:

  • Siga o Java Naming Convention (nomes de variáveis e métodos em camelCase).
  • Sempre use @Override quando sobrescrever métodos (aqui não se aplica, mas é uma boa prática).
  • Evite System.exit ou break abruptos — controle o fluxo com variáveis.
  • Adicione javadoc simples nas classes e métodos públicos:
/**
 * Representa um aluno com nome e uma lista de notas.
 */
public class Aluno {
    ...
}
  • Versão Final Refinada
package br.com.alura.modificadores.models;

import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class Aluno {
    private String nome;
    private final List<BigDecimal> notas = new ArrayList<>();

    public String getNome() {
        return nome;
    }

    public void setNome(String nome) {
        this.nome = nome;
    }

    public List<BigDecimal> getNotas() {
        return Collections.unmodifiableList(notas);
    }

    public boolean adicionarNota(String notaStr) {
        try {
            BigDecimal nota = new BigDecimal(notaStr);
            if (notaValida(nota)) {
                notas.add(nota);
                return true;
            }
        } catch (NumberFormatException e) {
            // Ignora entrada inválida
        }
        return false;
    }

    private boolean notaValida(BigDecimal nota) {
        return nota.compareTo(BigDecimal.ZERO) >= 0 && nota.compareTo(BigDecimal.TEN) <= 0;
    }

    public BigDecimal calcularMedia() {
        if (notas.isEmpty()) return BigDecimal.ZERO;

        BigDecimal soma = notas.stream().reduce(BigDecimal.ZERO, BigDecimal::add);
        return soma.divide(BigDecimal.valueOf(notas.size()), 2, RoundingMode.HALF_UP);
    }
}

E a Principal3 ficaria assim:

import br.com.alura.modificadores.models.Aluno;
import java.util.Scanner;

public class Principal3 {
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        Aluno aluno = new Aluno();

        System.out.print("Digite o nome do aluno: ");
        aluno.setNome(input.nextLine());

        System.out.printf("Agora adicione as notas do aluno %s%n", aluno.getNome());
        System.out.println("Digite 'stop' para encerrar.");

        int i = 1;
        while (true) {
            System.out.printf("Nota %d: ", i);
            String entrada = input.nextLine();

            if (entrada.equalsIgnoreCase("stop")) break;

            if (aluno.adicionarNota(entrada)) {
                System.out.println("Nota adicionada com sucesso!");
                i++;
            } else {
                System.out.println("Valor inválido. Tente novamente.");
            }
        }

        System.out.println();
        if (aluno.getNotas().isEmpty()) {
            System.out.println("Sem notas para calcular a média.");
        } else {
            System.out.println("A média do aluno é: " + aluno.calcularMedia());
        }
    }
}

Analise ai e envia um feedback.
Bons estudos e obrigado por compartilhar.

Nossa, adorei as dicas. Realmente ainda tenho que melhorar minhas noções de códigos, mas graças a vocês estou me aperfeiçoando a cada dia.
A dica de usar uma API para simplificar o cálculo foi simplesmente fantástica. Ainda não iniciei essa parte de APIs com java, mas isso ja é um começo para meu entendimento sobre o assunto