我编写了一个程序,它从文件读入并将信息存储在我自己的集合类中。我的程序工作正常,但我想知道是否有任何我可以做的改进我的程序,并通过继承和其他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粒全麦
我的计划有点长,但我希望SO社区可以帮助我改进我的计划。我希望改进的是,我有totalPrice()
方法,我在每个班级都凌驾于其中。但是如果仔细观察coffee
类和pop
类的属性有些相似。 donut
类和sandwiches
类也是如此。有没有办法可以防止这些类中的代码重复?
如果需要解释,我希望一切都是不言自明的,我愿意提供。
答案 0 :(得分:2)
在OO系统中,有时会过度使用继承。一般来说,构图是一种更好的技巧 - 阅读&#34;继承与构图&#34;。
对于这种情况,具体而言,您尝试将商店中的库存商品视为订单时,它很奇怪且可能没有帮助。订单具有与之关联的项目,但这些项目本身并不是订单。
在这方面你可以有一个名为StoreItem的类,它有一个名字和一个价格。您还可以允许该类具有影响价格的可选大小属性。因此,对于商店项目,您可以调用item.getName()和item.getPrice()。当您构建商店商品时,您可以仅使用namd和价格,或者使用具有尺寸的商品的名称,尺寸和价格来初始化它。
然后你可以拥有一个商店类,商店有一个商品库存 - 可用商品列表。订单列表中的订单,您的成本计算可以在订单类中进行一次。它只是遍历其项目列表并询问每个项目的价格。
使用此解决方案,您最终会在某个地方找到项目,商店,订单和主程序,但要扩展您的问题以包含更多您根本不需要添加任何新课程的项目。
答案 1 :(得分:0)
虽然你的程序也很好,但它们也可以根据规范为你的问题提供多种解决方案。
你指定的第一件事你想避免重复,我看到重复,特别是在方法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
另一个规范如果被要求是使定价不是硬编码的。您可以通过使用Properties类从外部文件加载大小价格的键值对来实现。