在OOP中设计食品成分类

时间:2015-12-05 21:19:50

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

我想向用户推荐食谱,因此我从JSON来源(包括其成分)中提取食谱。

目前,成分可以从三个方面获取:

  1. 3 tomatoes(没有特定单位)
  2. 125ml of milk(音量单位,公制或英制)
  3. 500g of pasta(质量单位,公制或英制)
  4. 要求

    我想使用DDD方法,因此是分层架构。

    我需要能够按原样显示原料,就像上面的子弹列表中所示。用户可以在度量标准或英制视图之间进行选择。

    1. 3 tomatoes
    2. 125ml of milk1/2 cup of milk
    3. 55g of pasta2 ounces of pasta
    4. 我的挑战

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

      我的第一个想法是用Unit类来表示单位,所以我的Ingredient类会保留数量和单位。但在某些情况下,这种成分是无统一的。考虑到这个想法,我的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();
          }
      }
      

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

      感谢您的时间!

      修改

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

1 个答案:

答案 0 :(得分:2)

绝对是多态性的。

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

因此,您基本上调用Ingredient将自身呈现为字符串。可能有一些参数指示度量与英制,该成分可能有一些用途,或者它可能会忽略,如果无单位。简单,优雅,尝试,它的工作原理。