【发布时间】:2016-03-10 17:25:22
【问题描述】:
我想向我的用户推荐食谱,所以我从 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();
}
}
实际上,我认为我的问题是我不知道如何正确表示单位,所以我正在寻求您的帮助。
感谢您的宝贵时间!
编辑
我不会只展示我的成分。在我的领域层中,我需要计算成分的营养成分。因此,根据其数量(或体积或质量),计算方式不同。一个简单地将营养成分乘以数量,而另一个必须执行 pro-rata。这是多态性的完美案例。
【问题讨论】:
-
DDD 架构不存在。看来您正试图过度设计解决方案。保持简单
-
查看quantity 模式。对于您的无单位成分,只需使用“一块”单位。
标签: oop design-patterns architecture domain-driven-design