在OOP中设计食品成分类

我想向我的用户推荐食谱,所以我从
JSON源(包括他们的成分)中获取食谱.

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

> 3个西红柿(没有特定单位)
> 125毫升牛奶(体积单位,公制或英制)
> 500克意大利面(质量单位,公制或英制)

要求

我想使用DDD方法,因此是一个分层架构.

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

> 3个西红柿
> 125毫升牛奶或1/2杯牛奶
> 55克意大利面或2盎司意大利面

我的挑战

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

我的第一个想法是用Unit类来表示单位,所以我的Ingredient类会保留一个数量和一个单位.但在某些情况下,这种成分是无统一的.考虑到这个想法,我的IngredientPresenter看起来像这样:

public String present(Ingredient ingredient) {
    if ( ingredient.isUnitless() ) 
        return ingredient.getQuantity() + " " + ingredient.getName();
    else
        return ingredient.getUnit() + " " + ingredient.getName();
}

我不相信这种方法,因为我可以有许多不同类型的单位,所以我的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将自己渲染成一个字符串.可能有一些参数指示度量与英制,该成分可能有一些用途,或者它可能会忽略,如果无单位.简单,优雅,尝试,它的工作原理.

点赞