我想向用户推荐食谱,因此我从JSON
来源(包括其成分)中提取食谱。
目前,成分可以从三个方面获取:
3 tomatoes
(没有特定单位)125ml of milk
(音量单位,公制或英制)500g of pasta
(质量单位,公制或英制)我想使用DDD方法,因此是分层架构。
我需要能够按原样显示原料,就像上面的子弹列表中所示。用户可以在度量标准或英制视图之间进行选择。
3 tomatoes
125ml of milk
或1/2 cup of milk
55g of pasta
或2 ounces of pasta
我不确定如何设计类以尊重封装并确保易于维护的设计。
我的第一个想法是用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();
}
}
实际上,我认为我的问题是我不知道如何正确地代表单位,所以我正在寻找你的帮助。
感谢您的时间!
我不会仅展示我的成分。在我的域层中,我需要计算成分的营养成分。因此,根据其数量(或体积或质量),计算方式不同。一个简单地将营养成分乘以数量,而另一个必须执行按比例。这是多态性的完美案例。
答案 0 :(得分:2)
绝对是多态性的。
通常这样做的方式是present()
在真空中不再是一个独立的函数,而是成为Ingredient
的方法。
因此,您基本上调用Ingredient
将自身呈现为字符串。可能有一些参数指示度量与英制,该成分可能有一些用途,或者它可能会忽略,如果无单位。简单,优雅,尝试,它的工作原理。