oop - 在 OOP 中设计食品配料类

标签 oop design-patterns architecture domain-driven-design

我想向我的用户推荐食谱,所以我从 JSON 获取食谱。来源(包括其成分)。

目前,可以通过三种方式获取成分:

  • 3 tomatoes (无特定单位)
  • 125ml of milk (体积单位,公制或英制)
  • 500g of pasta (质量单位,公制或英制)

  • 要求

    我想使用 DDD 方法,所以是分层架构。

    我需要能够按原样显示成分,就像上面我的项目符号列表中所建议的那样。用户可以在公制或英制 View 之间进行选择。
  • 3 tomatoes
  • 125ml of milk1/2 cup of milk
  • 55g of pasta2 ounces of pasta

  • 我的挑战

    我不确定如何设计类以尊重封装并确保易于维护的设计。

    我的第一个想法是用 Unit 表示单位。类,所以我的 Ingredient class 将包含一个数量和一个单位。但在某些情况下,成分是无单位的。带着这个想法,我的 IngredientPresenter看起来像这样:
    public String present(Ingredient ingredient) {
        if ( ingredient.isUnitless() ) 
            return ingredient.getQuantity() + " " + ingredient.getName();
        else
            return ingredient.getUnit() + " " + ingredient.getName();
    }
    

    我不相信这种方法,因为我可以有许多不同类型的 units ,所以我的 IngredientPresenter会迅速增长(并违反 OCP )。

    然后,我想我可以使用多态性。虽然这似乎是一个好方法,但我不知道在我的界面中公开什么,因为我的实现将完全不同。我需要在实现中公开我的方法,因此失去了多态性的所有好处。我的 IngredientPresenter如下所示:
    public String present(Ingredient ingredient) {
        if ( ingredient instanceof UnitlessIngredient ) {
            UnitlessIngredient actualIngredient = (UnitlessIngredient) ingredient;
            return actualIngredient.getQuantity() + " " + actualIngredient.getName();
        } else {
            WithUnitIngredient actualIngredient = (WithUnitIngredient) ingredient;
            return actualIngredient.getUnit() + " " + actualIngredient.getName();
        }
    }
    

    实际上,我认为我的问题是我不知道如何正确表示单位,所以我正在寻求您的帮助。

    感谢您的时间!

    编辑

    我不仅会展示我的配料。在我的领域层中,我需要计算成分的营养成分。因此,根据其数量(或体积或质量),计算方式不同。一个简单地将营养事实乘以数量,而另一个必须按比例进行。这是多态的完美例子。

    最佳答案

    绝对要使用多态性。

    通常这样做的方式是 present()在真空中不再是一个独立的函数,它变成了 Ingredient 的一个方法反而。

    所以,你基本上调用 Ingredient将自身呈现为字符串。可能有一些参数指示公制与英制,成分可能有一些用处,或者如果没有单位,它可能会忽略。简单,优雅,尝试,它的工作原理。

    关于oop - 在 OOP 中设计食品配料类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34111042/

    相关文章:

    c# - 如何静态访问 .resx 文件

    javascript - DOM API 在创建/操作节点时是否使用构造函数和原型(prototype)?

    python - 如何在单个类的每个实例上使用方法?

    design-patterns - 解释器与虚拟机

    oop - 什么设计模式或反模式?

    mysql - 如何建立多个子实体与列表属性之间的关系?

    Java Map反模式?

    Python 最小样板类初始化

    architecture - 叶说明(处理器/程序集)

    web-services - DAO 微服务是微服务架构中的好方法吗?