【问题标题】:Python: communication between classes and design patternsPython:类和设计模式之间的通信
【发布时间】:2020-05-26 15:47:50
【问题描述】:

我有 4 个类来处理大型项目的逻辑。我有客户购买的Product,我必须向他们收费。然而,这些产品的价格根据许多变量变化很大。我创建了一个处理产品定价的PriceGenerator 类,一个检查“产品”是否仍然可用的Inventory 类和一个包含总账单的“产品”列表的“购物车”类,如果客户购买了许多“产品”

Class PriceGenerator:
    def get_price(*args)

Class Product:
    def prod_bill()

Class Inventory:
    def get_inventory(*args)

Class Cart:
    self.list_product = [product1, product2, product3,...]
    def cart_bill(*args)

我的第一个选择:

pg = PriceGenerator()
pd = Product()
inv = Inventory()
cart = Cart()

我可以将 PriceGenerator 和 Inventory 作为 Cart 的参数传递

def cart_bill(pg, inv, amount):
    bill = 0
    for prod in self.list_product:
        px = prod.prod_bill(pg)
        bill_p = px * min(amount, inv.get_inventory(product_args))
        bill += bill_p

显然,随着Product 中方法数量的增加,跟踪您必须传递的所有参数变得非常复杂。您将PriceGeneratorInventory 传递给Cart,然后将它们传递给产品prod.prod_bill(pg),所有这些嵌套的依赖关系在传递所有对象时都非常麻烦,并且使代码更加复杂。

我可以调用 pg 和 inv 而不将其作为参数传递,例如在 Product 中作为全局变量

def produce_bill(self):
    price = pg.get_price(product_args)
    inventory = inv.get_inventory(product_args)

但我真的不喜欢不知道方法所需的类/参数是什么。

随着项目的发展,您会建议什么设计模式?

【问题讨论】:

    标签: python-3.x design-patterns


    【解决方案1】:

    我建议实施一个context object,其中包含与您的流程相关的任何内容。我假设这是关于在以下示例中下达电子商务订单:

    class OrderContext:
        price_calculator: PriceCalculator
        inventory: Inventory
        cart: Cart
    

    现在您可以将此对象传递给您的流程中涉及的所有操作:

    cart.add_product(context, product, amount)
    

    这允许您在上下文中添加/删除更多位,而无需修改所有函数的签名。缺点是这可能会大量增加应用程序中的依赖项数量(取决于团队中程序员的纪律性)。

    【讨论】:

    • 还有一个旁注:要特别注意上下文对象模式经常被误解,如果没有正确实现,可能最终成为“东西的包装”反模式:stackoverflow.com/questions/986865/…
    • 您是使用上下文作为全局变量还是将其作为参数传递?
    • 在我看来,如果你在全局存储这样一个对象,你就不再实现上下文对象模式,你只是在全局存储某些东西。因为上下文根据定义不是全局的:例如,您不应该拥有全局 Cart 对象,因为购物车与用户相关联,这也不是全局变量(至少它不应该是恕我直言)。如果你确实有一个全局购物车/用户,你根本不需要向你的函数传递任何东西,他们可以从全局范围中提取每个依赖项(请注意,我不提倡这样做方法:这是一个非常糟糕的主意)
    • 好的,如果您需要嵌套方法中的上下文对象:您可以将上下文作为嵌套方法中的级联参数传递给。我只是想知道是否有另一种方法。总的来说,我发现了这种模式,非常感谢
    猜你喜欢
    • 2021-06-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-17
    • 2011-08-23
    • 2017-08-13
    • 2020-12-10
    • 2011-09-02
    相关资源
    最近更新 更多