Расчет стоимости заказа с учетом блюд и типов клиентов

#java

Вопрос:

Я пытаюсь рассчитать цену заказа, определяемую стоимостью блюд, типом блюд и типом гостя.

Класс Блюд:

 public class DishImplementation implements Dish {

    private String name;
    private double basePrice;
    private DishType type;

    public DishImplementation(String name, double basePrice, DishType type) {
        this.name = name;
        this.basePrice = basePrice;
        this.type = type;
        }

    @Override
    public String getName() {
        return name;
    }

    @Override
    public double getBasePrice() {
        return basePrice;
    }

    @Override
    public DishType getDishType() {
        return type;
    }
 

Гостевой класс:

 public class GuestImplementation implements Guest {

    private String name;
    private GuestType type;

    public GuestImplementation (String name, GuestType type) {
        this.type = type;
        this.name = name;
    }

    @Override
    public String getName() {
        return name;
    }

    @Override
    public GuestType getGuestType() {
        return type;
    }
 

И вот класс, с которым у меня возникли проблемы, класс Order:

 public class OrderImplementation implements Order {

    private Guest guest;
    private List<Dish> dishes;

    public OrderImplementation(Guest guest, List<Dish> dishes) {
        this.guest = guest;
        this.dishes = dishes;
    }

    @Override
    public double calculatePrice() {
        double price = 0;
        int i = 0;
        double total = 0;

        if ((getDishes().equals(DishType.MAIN_DISH)) || (getDishes().contains(DishType.DESSERT)) || (getDishes().contains(DishType.STARTER))) {
            for (Dish a : dishes) {
                Dish dish = dishes.get(i);
                price = dish.getBasePrice();
                total = total   price;
                i  ;
            }
            return total = (total * this.guest.getGuestType().getDiscountFactor()) * 0.8;
        }
            else {
                for (Dish a : dishes) {
                    Dish dish = dishes.get(i);
                    price = dish.getBasePrice();
                    total = total   price;
                    i  ;
                }
                return total = total * this.guest.getGuestType().getDiscountFactor();
            }
        }

    @Override
    public List<Dish> getDishes() {
        return dishes;
    }

    @Override
    public Guest getGuest() {
        return guest;
    }
}
 

Различные типы блюд:

 public enum DishType {
    STARTER, MAIN_DISH, DESSERT, OTHER;
}
 

Мой метод calculatePrice работает так, как задумано (хотя я уверен, что он слишком сложен, но сейчас это не имеет значения для меня).

Единственное, что не работает, это то, что к заказу необходимо применить скидку 20%, если он состоит хотя бы из одного блюда с типом MAIN_DISH, ДЕСЕРТ или ЗАКУСКА.

Мой подход не работает, так как он всегда игнорирует мое первое условие «если».

И я также удивляюсь, почему я не могу позвонить

 dishes.getDishType();
 

точно так же, как я сделал с типами гостей. Я уверен, что это решило бы мою проблему.

Комментарии:

1. Не читая всего этого кода. getDishes() звучит как список блюд, и вы сравниваете их с одним типом блюд. Не «кажется» правильным (но, как я уже сказал, я не прочитал весь код)

Ответ №1:

Так dishes как это список Dish , вам нужно перебрать их и проверить, есть ли тип какого-либо из них MAIN_DISH , DESSERT или STARTER :

 boolean shouldGetDiscount = false;
for (Dish dish : getDishes()) {
    DishType type = dish.getDishType();
    if (type.equals(DishType.MAIN_DISH) || type.equals(DishType.DESSERT) || type.equals(DishType.STARTER)) {
        shouldGetDiscount = true;
        break;
    }
}
if (shouldGetDiscount) {
    //consider the discount
}
 

Я остро неправильно истолковал инструкции.. вместо получения дополнительной скидки, если это основное блюдо, десерт ИЛИ закуска, вы получаете скидку только в том случае, если это основное блюдо, десерт и закуска.. как вы изменяете его, чтобы он работал именно так?

 boolean hasMain = false, hasStarter = false, hasDesert = false;
for (Dish dish : getDishes()) {
    DishType type = dish.getDishType();
    if (type.equals(DishType.MAIN_DISH))
        hasMain = true;
    else if (type.equals(DishType.DESERT))
        hasDesert = true;
    else if (type.equals(DishType.STARTER))
        hasStarter = true;

    if (hasMain amp;amp; hasDesert amp;amp; hasStarter)
        break;    
}
if (hasMain amp;amp; hasDesert amp;amp; hasStarter) {
    //consider the discount
}
 

Комментарии:

1. Я остро неправильно истолковал инструкции.. вместо получения дополнительной скидки, если это основное блюдо, десерт ИЛИ закуска, вы получаете скидку только в том случае, если это основное блюдо, десерт и закуска.. как вы изменяете его, чтобы он работал именно так?