很抱歉,如果这是重复的话。
我想要建模的是一个向其添加物品的购物车(可能后来创建了一个订单)。有两种主要的不同项目类型。有库存的库存类型和没有库存的通用类型。只有有足够的库存才能添加库存商品,否则不会添加库存商品。会有一个基类在两种项目之间具有共享属性。
我的计划最初是在将商品添加到购物车之前,检查是否为库存商品,如果是,则进行必要的库存检查。否则只需将项目添加到购物车。
一位同事提出了一种不同的方法,不需要测试项目的类型;相反,基类方法将具有“hasEnoughStock()”方法。库存物品将被覆盖以进行实际库存检查,非库存物品将简单地返回一些真实值(即,它们总是具有足够的库存)。我认为我的同事有更好的方法;但对我来说,有一个功能来检查一个物品的功能,实际上没有任何真正的库存,这感觉有点滑稽。
我想问的是从OO的角度来看哪个是正确的方法(或者可能有不同的方法)。
我们计划在C#中执行此操作,如果这有任何区别。
提前致谢
答案 0 :(得分:1)
我也认为,在基类中使用通用函数的方法是正确的。
如果您对名称hasEnoughStock()
有疑问,那么名为canAddToCart()
的函数呢?
非库存商品类只会返回true或进行其他检查,库存商品类会调用名为hasEnoughStock()
的私人函数,如下所示:
public class NonStockItem : Item {
public override bool canAddToCart () {
return true;
}
}
public class StockItem : Item {
public override bool canAddToCart () {
return haveEnoughStock();
}
private bool haveEnoughStock () {
return ... doStockCheckHere;
}
}
答案 1 :(得分:1)
这是我的看法。
假设你有一个类WashingMachine。 WashingMachine对象的职责是洗衣服。 WashingMachine的责任不是计算税收,检查是否缺货或库存。
计算税是计费的责任,并检查缺货是否是其他责任。
以同样的方式,我认为这不是物品的责任,决定它是instock项目还是缺货项目。它应该委托给其他,在这种情况下它可能是Warehouse
类或确定类型的东西,并决定是否添加它。
Class Item
{
}
//Lack of creativity, I just named it as Manager. You can come up with more appropriate name,
Class Manager
{
//Determine weather the item is with stock or without stock.
}
Class Shoppingcart
{
//Instantiate Manager.
//Invoke the method which determines stock or out of stock.
}
希望这有帮助。
答案 2 :(得分:0)
您的同事的方法似乎是合理的 - 如果它可以帮助您将非库存项目(例如电子书)视为虚拟库存。它只是语义,但你可以调用你喜欢的属性/方法,它不必是“hasEnoughStock” - 它可能是“IsAvaialble”或“ValidItem”。对你来说最合乎逻辑的东西。