我想向我的用户推荐食谱,所以我从
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将自己渲染成一个字符串.可能有一些参数指示度量与英制,该成分可能有一些用途,或者它可能会忽略,如果无单位.简单,优雅,尝试,它的工作原理.