2013-12-04 4 views
3

я в настоящее время есть несколько кода, как это для различных начинокСокращение дублирования кода

// Toppings - Egg 
System.out.print("Do you want " + egg.getType() + "?"); 
input = keyboard.nextLine(); 
choice = input.charAt(0); 
if (choice == 'y') { 
    l.add(egg.getType()); 
    c.add((double) egg.getCost()); 
    numberOfToppings = numberOfToppings + 1; 
    totalToppingPrice = totalToppingPrice + egg.getCost(); 
    toppings = toppings + "Egg"; 
} 

Он отлично работает, но я надеялся, что я мог сделать все начинку в только один блок кода. Потому что у меня их около 5, и это слишком много, и мне было рекомендовано это сделать. У кого-нибудь есть идеи, как это можно сделать? благодаря

+11

Сделайте способ, который выполняет всю работу, передает переменные в метод для вещей, которые меняются каждый раз. Затем вызовите метод с соответствующими значениями пять раз. – Jesper

+1

Просто используйте функцию «Извлечь метод» вашей среды IDE. И проверьте другие вещи там, потому что они, несомненно, пригодится. – Shiki

+0

Чтобы выполнить принцип Open/Closed => заменить примитив ('choice') на объект, чтобы получить полиморфизм с шаблоном стратегии/состояния – Mik378

ответ

1

Я хотел бы предложить вам сделать класс Топпинг, который можно использовать следующим образом:

Toppping egg = new Topping ("egg", 0.5); // Cost 
ArrayList<Topping> toppings = new ArrayList<Topping>(); 
toppings.add(egg); 

Позже вы можете цикл по вектору Начинка похожее на это:

for (Topping current : toppings) { 
    if (wantsTopping(current)) { 
    chosenToppings.addObject(current); 
    } 
} 

Примечание: Это Java как код, но он не будет компилироваться. Есть еще кое-что, что вам нужно найти

+3

Я знаю, что это не код Java, но вы действительно можете запутать java beginner: 1. используя Vector вместо ArrayList. 2. Использование raw generics (без <>) – ivstas

+1

Справа я обновил код, чтобы использовать ArrayList. Моя Java немного ржавая – Raymond

1

Все начинки должны быть собраны вместе в перечислении, если набор верхушек закрыт и не может меняться во время выполнения программы.

enum Topping{ 
    EGG("egg", 22),... ; 
    private String type; 
    private double cost; 

    private Topping(String type, double cost){ 
     this.type = type; 
     this.cost = cost; 
    } 
    //getters and setters 

} 

Тогда вы могли бы написать метод внутри вашего класса, содержащего код выше, который должен быть в состоянии обрабатывать Topping экземпляр, как это:

private handleTopping(Topping top){ 
    System.out.print("Do you want "+top.getType() +"?"); 
    input = keyboard.nextLine(); 
    choice = input.charAt(0); 
    if (choice == 'y'){ 
     l.add(top.getType()); 
     c.add(top.getCost()); 
     numberOfToppings = numberOfToppings + 1; 
     totalToppingPrice = totalToppingPrice + top.getCost(); 
     toppings = toppings + " " + top.getType(); 
    } 
} 

Наконец, вызовите метод для всех начинок, доступных

for(Topping top : topping.values()){ 
    handleTopping(top); 
} 

Это все о СУХОЙ (не повторяйте принцип). Это даже не обязательно связано с объектно-ориентированной парадигмой. Даже в процедурном программировании одним из основных принципов является извлечение общих и часто используемых функций в параметризованные процедуры.

+0

не может использовать enum, к сожалению :( – user3063201

+1

Почему бы и нет? В любом случае, сделайте его обычным классом вместо enum. –

Смежные вопросы