Ya estoy inscrito ¿Todavía no tienes acceso? Nuestros Planes
Ya estoy inscrito ¿Todavía no tienes acceso? Nuestros Planes
1
respuesta

[Sugerencia] Mi propuesta de solución...

Clase Card

package models;

public class Card {
    private double value;

    public Card(double value) {
        this.value = value;
    }

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

    public double getValue() {
        return value;
    }
}

Clase Product

package models;

public class Product {
    String description;
    double price;

    public Product(String description, double precio) {
        this.description = description;
        this.price = precio;
    }

    public String getDescription() {
        return description;
    }

    public double getPrice() {
        return price;
    }
}

Clase Sale

package models;

import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;

public class Sale {
    private final List<Product> productList;
    double total;

    public Sale() {
        productList = new ArrayList<>();
        total = 0;
    }

    public void addProduct (Product product) {
        productList.add(product);
        total += product.getPrice();
    }

    public double getTotal() {
        return this.total;
    }

    public void showShopping() {
        System.out.println("""                
    
                    **************************
                    COMPRAS REALIZADAS
                """
        );
        productList.sort(Comparator.comparing(Product::getPrice));
        productList.forEach(product -> System.out.printf("""                
                    %s - %.1f
                """,
                product.getDescription(),
                product.getPrice())
        );
        System.out.println("""                
    
                    **************************
                """
        );
    }
}

Clase Main

import models.Sale;
import models.Product;
import models.Card;

import java.util.InputMismatchException;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        showHeader();
        Scanner scanner = new Scanner(System.in);
        Sale sale = new Sale();
        double cardLimit = getCardLimit(scanner);
        Card card = new Card(cardLimit);

        double purchaseValue;
        String purchaseDescription;
        String continuar = "1";


        do {
            try {
                System.out.print("Escriba la descripción de la compra: ");
                purchaseDescription = scanner.next();
                System.out.print("Escriba el valor de la compra: ");
                purchaseValue = scanner.nextDouble();

                if (!(card.getValue() > sale.getTotal() + purchaseValue)) {
                    System.out.println("Saldo insuficiente!");
                    break;
                }

                Product newProduct = new Product(purchaseDescription, purchaseValue);
                sale.addProduct(newProduct);
                card.descontar(newProduct.getPrice());

                System.out.println("Compra realizada!");

                System.out.print("Escriba 1 para continuar, cualquier otra tecla para salir: ");
                continuar = scanner.next();

            } catch (InputMismatchException _) {
                System.out.println("\n¡Ingrese un valor válido, intenta de nuevo!\n");
                scanner.nextLine();
            }
        } while (continuar.equals("1"));

        sale.showShopping();

        System.out.printf("Saldo de la tarjeta: %.1f%n", card.getValue());
    }

    private static double getCardLimit(Scanner scanner) {
        double cardLimit = 0;
        do {
            try {
                System.out.print("Escriba el límite de la tarjeta: ");
                cardLimit = scanner.nextDouble();
            } catch (InputMismatchException _) {
                System.out.println("\n¡Ingrese un valor válido, intenta de nuevo!\n");
                scanner.nextLine();
            }
        } while (cardLimit == 0);

        return cardLimit;
    }

    private static void showHeader() {
        System.out.print("""
                
                ************************************
                    Welcome to shopping list app
                ************************************
                
                """
        );
    }
}

¡Gracias por leer!

1 respuesta

¡Hola Wilmar, espero que estés bien!

Gracias por compartir tu propuesta de solución. Parece que has hecho un gran trabajo al implementar una aplicación para gestionar compras con un límite de tarjeta. Tu código está bien estructurado, y las clases que has creado reflejan una buena comprensión de los conceptos de programación orientada a objetos.

Aquí hay algunas observaciones y sugerencias que podrían ayudarte a mejorar tu aplicación:

  1. Validación del Límite de la Tarjeta: En el método getCardLimit, asegúrate de que el usuario no pueda ingresar un valor negativo o cero como límite de tarjeta. Puedes agregar una condición para validar esto antes de aceptar el valor.

  2. Manejo de Excepciones: Estás manejando bien las excepciones de entrada, pero sería útil proporcionar un mensaje más específico en el caso de que el usuario ingrese un valor no numérico para el precio o el límite de la tarjeta.

  3. Formato de Salida: En el método showShopping, estás usando System.out.printf para formatear la salida. Esto es excelente para mantener la consistencia en la presentación de datos. Asegúrate de que el formato de los precios sea consistente en toda la aplicación.

  4. Comentarios y Documentación: Considera agregar comentarios en tu código para explicar la lógica detrás de ciertas decisiones o para describir lo que hace cada método. Esto hará que tu código sea más fácil de entender para otros (y para ti mismo en el futuro).

  5. Pruebas: Aunque no está directamente relacionado con el código, asegúrate de probar tu aplicación con diferentes escenarios, como intentar comprar con un saldo insuficiente o ingresar valores no válidos, para garantizar que maneje todos los casos posibles.

Tu implementación parece cumplir con los requisitos del desafío, y has logrado ordenar las compras por precio, lo cual es un objetivo clave. Espero que estas sugerencias te sean útiles.

¡Espero haber ayudado y buenos estudios!