gpt4 book ai didi

c++ - 试图理解适用于我的代码的 Demeter 法则

转载 作者:搜寻专家 更新时间:2023-10-31 00:18:21 26 4
gpt4 key购买 nike

我有一个简单的 Store 类,其中包含一个 InventoryInventory 包含一个 Item 列表。为了修改 Inventory 中的其中一个 Item,我必须这样写:

Store store( /*parameters*/ );
store.accessInventory(/*password*/).accessItem(/*item name*/).setPrice(9.50);

据我了解,这打破了 Law of Demeter因为 Store 必须通过 Inventory 到达 Item 才能调用 setPrice()

我想将这种违法行为与报童和顾客的经典示例中的违法行为相协调。在送报员的例子中,送报员假设他会用钱包付款,因此对客户“了解”得太多了。如果客户的付款方式发生变化,送报员也必须随之改变。

我的代码中的哪些假设可能导致像报童示例中遇到的问题?

我知道法律实际上更像是一个指导方针,在这种情况下遵守它可能不是最好的主意,但我想在继续之前至少了解法律。谢谢。

最佳答案

您的代码假设 Inventory 对象是唯一需要在价格变化时得到通知的对象。

想象一下,除了包含元素 list 外,您的商店还在其橱窗中悬挂了一些广告海报。

如果您遵循得墨忒耳法则,您的 Store 对象可能有一个像这样的好方法:

void Store :: SetItemPrice(string item_name, float item_price)
{
inventory.SetItemPrice(item_name, item_price);

for (int i=0; i<num_advertising_posters; i++)
{
// Update any posters with the new price!
if (advertising_posters[i].advertised_item == item_name)
{
advertising_posters[i].SetAdvertisedPrice(item_price);
}
}
}

...但是如果您改为允许调用代码直接访问库存对象,那么就没有简单/万无一失的方法来确保每当价格更新时广告总是更新,所以有可能在某些时候指出您商店的广告海报会显示旧的/错误的产品价格。得墨忒耳法则可以更轻松地避免此类错误。

关于c++ - 试图理解适用于我的代码的 Demeter 法则,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10779252/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com