1
resposta

[Projeto] Resoluçao do Desafio MasterCard

Fiz o desafio um pouco às pressas, pois precisei sair para um compromisso. Por isso, talvez ele não esteja 100% fiel ao que foi proposto. Ainda assim, decidi entregar para receber feedback sobre o que pode ser melhorado ou se os requisitos foram atendidos corretamente.

Para quem quiser ver melhor, o publiquei no meu github.

Class Main:

public class Main {
    public static void main(String[] args) {

        Scanner sc = new Scanner(System.in);
        MasterCard masterCard = new MasterCard();
        Requests requests = new Requests();
        int option;

        System.out.println("Enter credit limit: ");
        masterCard.setCredit(Optional.of(sc.nextDouble()));
        sc.nextLine();

        do {
            System.out.println("Enter products name: ");
            String name = sc.nextLine();

            System.out.println("Enter product value: ");
            double value = sc.nextDouble();

            if (value < 0 || value > masterCard.get().orElse(0.0)) return;

            insertProduct(name, value, requests, masterCard);

            do {
                System.out.println("Enter 0 for 'exit' or 1 for 'continue'");
                option = sc.nextInt();
            } while (option != 0 && option != 1);

            verify(option, sc, requests, masterCard);

        } while (option == 1 && requests.value() < masterCard.getCredit().get());
        sc.close();
    }

    @Contract(pure = true)
    private static void insertProduct(String name, double value, @NotNull Requests requests, @NotNull MasterCard masterCard) {
        Products product = new Products();
        product.insertName(name);
        product.insertValue(value);

        requests.getRequests().add(product);
        masterCard.decrementCredit(value);
        System.out.println("Purchase!");
    }

    @Contract(pure = true)
    private static void verify(int i, Scanner sc, Requests requests, MasterCard masterCard) {
        if (i == 1)
            sc.nextLine();

        else {
            Collections.sort(requests.getRequests());
            System.out.println("""
                        **********@*@**********
                        Purchase made successfully!
                        """);

            for (Products product : requests.getRequests()) {
                System.out.println(product.name() + ": R$" + String.format("%.2f", product.value()));
            }

            masterCard.get().ifPresent(s -> System.out.println("\nBalance of the Card: " + s));
            System.out.println("""
                        
                        **********@*@**********
                        """);
        }
    }
}

Class MasterCard & Credit:

/**
 * The {@code Card} class extends the {@code Credit} class, inheriting its functionalities
 * for managing a credit system. This class represents a specific type of credit entity
 * which can be used to associate and manage purchasing operations involving products.
 *
 * <p>The {@code Card} class leverages all features defined in the parent {@code Credit} class,
 * such as setting a credit limit, decrementing credit, and retrieving the current credit value.
 */
public class MasterCard extends Credit {
}
@lombok.ToString
@lombok.Getter(value = lombok.AccessLevel.PUBLIC)
@lombok.NoArgsConstructor(access = lombok.AccessLevel.PUBLIC)
public class Credit {

    private Optional<Double> credit;

    public void setCredit(@NotNull Optional<Double> credit) {
        if (credit.isEmpty()) return;
        this.credit = credit;
    }

    public void decrementCredit(double decrement) {
        if (decrement < 0) return;
        credit.ifPresent(current -> credit = Optional.of(current - decrement));
    }

    public Optional<Double> get() {
        return credit;
    }
}

Class Products & Request:

public class Products implements Comparable<Products> {

    private String name;

    private double value;

    public double value() {
        return value;
    }

    public void insertValue(double value) {
        this.value = value;
    }

    public String name() {
        return name;
    }

    public void insertName(String name) {
        this.name = name;
    }

    @Override
    public int compareTo(@NotNull Products products) {
        return Double.compare(this.value(), products.value());
    }
}
@lombok.Getter(value = lombok.AccessLevel.PUBLIC)
@lombok.Setter(value = lombok.AccessLevel.PUBLIC)
public class Requests extends Products {

    private List<Products> requests;

    public Requests() {
        requests = new ArrayList<>();
    }

    @Override
    public String toString() {
        return name()
                + " - "
                + value();
    }
}
1 resposta

Oi, Rick! Como vai?

Você organizou bem a lógica do programa, especialmente na separação das classes e no uso de Optional para o controle do crédito. Isso mostra atenção à segurança e clareza na manipulação de valores que podem estar ausentes.

Uma dica interessante para o futuro é usar a função DecimalFormat para deixar os valores monetários ainda mais elegantes na saída. Veja este exemplo:


DecimalFormat df = new DecimalFormat("R$ #,##0.00");
System.out.println("Valor formatado: " + df.format(1500.5));

Esse código imprime o valor com separador de milhar e casas decimais, o que facilita a leitura e deixa o resultado mais próximo do real.

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