我有一个简单的Store
类,其中包含Inventory
个对象和CashRegister
个对象。为了销售商品,CashRegister对象需要访问Inventory对象的方法;即那些返回特定项目的价格,存储中的数量等的那些。什么是让CashRegister对象访问Inventory对象方法的最佳方法?
谢谢。
答案 0 :(得分:3)
CashRegister对象需要访问Inventory对象的方法
为什么呢? CashRegister
可以存在并且在没有Inventory
的情况下完美运行。您可以在剧院或电影院中拥有CashRegister
,而不仅仅是Store
。你所谈论的这部分逻辑应该是商店的一部分。
class Store
{
CashRegister register;
Inventory I;
void sellSomething(Item i)
{
//move logic inside the store
//not in CashRegister
int price = I.getPrice(i);
register.addCash(price);
I.removeItem(i);
}
};
答案 1 :(得分:3)
一种解决方案是在Inventory
对象中存储对CashRegister
对象的引用,并在构造Store
对象时提供引用。
class Inventory { /* ... */ };
class CashRegister
{
public:
CashRegister(Inventory &inventory)
: inventory_(inventory)
{ }
// ....
private:
Inventory &inventory_;
};
class Store
{
public:
Store()
: cashregister_(inventory_)
{ }
// ....
private:
Inventory inventory_;
CashRegister cashregister_;
};
答案 2 :(得分:1)
class Inventory {
Currency price;
uint64_t quantity;
public:
Currency get_price() { return price; }
uint64_t get_quantity() { return quantity; }
};
然后您的收银机可以调用Inventory
。
但实际上,您应该在Inventory
上设置一个功能来保留或提供一定数量的对象(如果可用) - 收银机不需要知道有多少物品在库存,只需知道当前的需求是否可以满足。就此而言,我不确定Inventory
是否需要知道某个对象的价格 - 如果周三下午有10%的折扣,那么该仓库的业务是什么?
答案 3 :(得分:1)
赋予对象责任,不要只使用它们来聚集数据。
Inventory
应该知道如何添加和删除Item
。可能需要进行交易。这个赋值是数据库的隐喻。
您希望Inventory
(数据库)能够处理Transaction
,在这种情况下,专门用于使用收银机。
Item
应该能够代表Inventory
。