我有一个简单的Store
类,其中包含一个Inventory
对象和一个CashRegister
对象。为了销售商品,CashRegister 对象需要访问 Inventory 对象的方法;即,返回特定项目的价格、存储数量等的那些。让 CashRegister 对象访问 Inventory 对象的方法的最佳方法是什么?
谢谢你。
我有一个简单的Store
类,其中包含一个Inventory
对象和一个CashRegister
对象。为了销售商品,CashRegister 对象需要访问 Inventory 对象的方法;即,返回特定项目的价格、存储数量等的那些。让 CashRegister 对象访问 Inventory 对象的方法的最佳方法是什么?
谢谢你。
CashRegister 对象需要访问 Inventory 对象的方法
为什么?CashRegister
没有Inventory
. _ 您可以CashRegister
在剧院或电影院中拥有 a,而不仅仅是在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);
}
};
一种解决方案是在对象中存储对该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_;
};
class Inventory {
Currency price;
uint64_t quantity;
public:
Currency get_price() { return price; }
uint64_t get_quantity() { return quantity; }
};
然后您的收银机可以调用Inventory
.
但实际上,您应该设置一个功能Inventory
来保留或交付一定数量的物品(如果有的话)——收银机不需要知道有多少物品有库存,它只需要知道当前的需求是否可以满足。就此而言,我不确定是否Inventory
需要知道物品的价格——如果周三下午有 10% 的折扣,那么仓库的业务是什么?
赋予对象职责,不要仅仅将它们用于聚集数据。
Inventory
应该知道如何添加和删除Item
s 。可能需要进行交易。这个赋值是一个数据库的隐喻。
@Luchian 有正确的想法,但我会更进一步。
您希望Inventory
(数据库)能够处理Transaction
s,在这种情况下,它专门用于使用收银机。
应该能够Item
向.Inventory