2016-11-19 78 views
1

我已經編寫了一個程序,該程序從文件讀入並將信息存儲在我自己創建的集合類中。我的程序工作正常,但是我想知道是否有任何事情可以改善我的程序並通過繼承和其他Java功能防止重複的代碼。這是我的課程。我添加了評論來解釋每個班級的工作。通過繼承改進程序

abstract class Order { //superclass 
private int quantity; //instance variables 

public Order(int quantity) { //constructor 
    this.quantity = quantity; 
} 

public int getQuantity() { // instance method 
    return quantity; 
} 

public abstract double totalPrice(); 

public String toString() { 
    return "quantity: " + quantity; 
} 

} //super Class Order 

class Coffee extends Order { //subclass 
private String size; //instance variables 

public Coffee (int quantity, String size) { //constructor 
    super(quantity); 
    this.size = size; 
} 

public double totalPrice() { //instance method to calculate price for the item 
    double priceSmall = 1.39; 
    double priceMed = 1.69; 
    double priceLar = 1.99; 
    double total = 0; 

    if (size.equals("small")) { 
    total = priceSmall * getQuantity(); 
    } else { 
    if (size.equals("medium")) { 
    total = priceMed * getQuantity(); 
    } else { 
    if(size.equals("large")) { 
     total = priceLar * getQuantity(); 
    } 
    } 
} 
    return total; 
} //totalPrice 


public String toString() { 
return "Coffee ("+ size + "): " + super.toString() ; 
} 

} //coffee sub-class 

class Donuts extends Order { //sub-class 
private double price; //instance variables 
private String flavour; 

public Donuts(int quantity, double price, String flavour) { //constructor 
super(quantity); 
this.price = price; 
this.flavour = flavour; 
} 


public double totalPrice() { //instance method to calculate price 
double total = 0; 
int quantity = getQuantity(); 

if(quantity < 6) { 
    total = (price * quantity); 
    double tax = 0.07 * total; 
    total += tax; 
} else { 
    total = price * quantity; 
} 
return total; 
} //totalPrice 

public String toString() { 
return "Donuts("+ flavour + "): " + super.toString() + ", price: " + price; 
} 

} //class Donuts 

class Sandwich extends Order { //Sub-class 
    private double price; // instance variables 
    private String filling; 
    private String bread; 

// constructor 
    public Sandwich (int quantity, double price, String filling, String bread) { 
    super(quantity); 
    this.price = price; 
    this.filling = filling; 
    this.bread = bread; 
} 

    public double totalPrice() { //instance method 
    double total = 0; 
    int quantity = getQuantity(); 

    total = (price * quantity); 
    double tax = 0.07 * total; 
    total += tax; 

    return total; 
    } //totalPrice 


    public String toString() { 
    return "Sandwich ("+ filling + ") (" + bread + "): "+ super.toString() + 
    ", price: " + price ; 
} 

} // Sandwich class 

    class Pop extends Order { //sub-class 
    private String size; 
    private String brand; 

    public Pop(int quantity, String size, String brand) { //constructor 
    super(quantity); 
    this.size = size; 
    this.brand = brand; 
    } 

    public double totalPrice() { //instance method 
    double priceSmall = 1.79; 
    double priceMed = 2.09; 
    double priceLar = 2.49; 
    double total = 0; 

    if (size.equals("small")) { 
    total = priceSmall * getQuantity(); 
} else { 
    if (size.equals("medium")) { 
    total = priceMed * getQuantity(); 
    } else { 
    if(size.equals("large")) { 
     total = priceLar * getQuantity(); 
    } 
    } 
} 
return total; 
} //totalPrice 

public String toString() { 
    return "Pop ("+ brand + ") (" + size + "): " + super.toString() ; 
} 
} // class Pop 

有四種產品,即咖啡,甜甜圈,三明治和砰砰聲的訂單我存儲,然後打印其總價格。

我正在讀的文件的示例是這樣的:

咖啡,3,介質

甜甜圈,7,0.89,巧克力

流行,5,大,圖示!可口可樂

三明治,1,3.89,神祕的肉,37粒全麥

我的計劃是一點點長,但我希望如果是這樣的社會可以幫助我提高我的程序。我正在尋求改進的是,我有totalPrice()方法,我在每個班級壓倒一切。但是,如果仔細觀察coffee類和pop類的屬性有點相似。 donut班和sandwiches班同樣如此。有沒有辦法可以防止這些類中的代碼重複? 我希望一切都是不言自明的,如果有需要的解釋我願意提供。

回答

2

繼承有時在OO系統中被過度使用。一般來說,組合是一種更好的技術 - 閱讀「繼承與組合」。

對於這種情況,具體而言,您嘗試將商店中的庫存商品視爲訂單,這很奇怪,可能沒有幫助。一個訂單有與它相關的項目,但這些項目本身並不是一個訂單。

在這方面你可以有一個類,StoreItem,有一個名稱和價格。你也可以讓這個類有一個可選的size屬性來影響價格。因此,對於商店商品,您可以調用item.getName()和item.getPrice()。當您構建商店物品時,您可以使用namd和價格,或者具有尺寸的物品的名稱,尺寸和價格來初始化它。

然後,您可以擁有一個Store類,並且該商店有一個物品清單 - 可用物品清單。訂單中列出了物品清單,您的成本計算可能會在訂單類中發生一次。它只是通過它的物品清單循環,並詢問每個物品的價格。

有了這個解決方案,你最終會得到Item,Store,Order和一個主程序,但是爲了擴展你的問題以包含更多的項目,你根本不需要添加任何新的類。

+0

根據您的回答判斷您是否暗示我沒有任何重要的代碼重複?儘管如此,我明白了你對StoreItem類的看法。 – Saad

+0

嗯,沒有重複不是可擴展性的問題 - 要添加項目與您的解決方案,您需要添加類。儘管這種解決方案對於價格的大小如何影響價格,但確實存在重複,只需要擁有一個StoreItem類即可消除。 –

0

雖然你的程序也很好,並且他們也可以根據規範對你的問題提供多種解決方案。

你指定的第一件事就是要避免重複,尤其是在totalPrice()方法中,如果必須添加一些更改,可能會導致問題,尤其是在方法totalPrice()中,您會影響所有類。例如,您希望在總價格中添加1%的折扣。考慮到這一點我如下修改建議:

//add utility interface which can be used by all Concrete product classes 
interface PriceCalculator { 

    static double totalPrice(Map<String, Double> priceMap,String size, int quantity) throws Exception{ 
     Double rate=priceMap.get(size); 
     if(rate==null){ 
      throw new Exception("something really bad happened.Missing price"); 
     } 

     return (rate * quantity); 
    } 

} 

class Coffee extends Order { //subclass 
    private String size; //instance variables 
    private Map<String, Double> priceMap=new HashMap<>(); 

    public Coffee (int quantity, String size) { //constructor 
     super(quantity); 
     this.size = size; 
     priceMap.put("priceSmall", 1.39); 
     priceMap.put("priceMed", 1.69); 
     priceMap.put("priceLar", 1.39); 
    } 

    @Override 
    public double totalPrice() { //instance method to calculate price for the item 
     try { 
      return PriceCalculator.totalPrice(priceMap, size, getQuantity()); 
     } catch (Exception e) { 
      e.printStackTrace(); 
      return 0; 
     } 
    } //totalPrice 


    public String toString() { 
     return "Coffee ("+ size + "): " + super.toString() ; 
    } 

} //coffee sub-class 

如果問另一個指標是使定價不難coded.You可以通過使用屬性類來加載外部文件的鍵值對尺寸的價格做到這一點。