我想向我的用户推荐食谱,所以我从 JSON
获取食谱。来源(包括其成分)。
目前,可以通过三种方式获取成分:
3 tomatoes
(无特定单位)125ml of milk
(体积单位,公制或英制)500g of pasta
(质量单位,公制或英制)要求
我想使用 DDD 方法,所以是分层架构。
我需要能够按原样显示成分,就像上面我的项目符号列表中所建议的那样。用户可以在公制或英制 View 之间进行选择。
3 tomatoes
125ml of milk
或 1/2 cup of milk
55g of pasta
或 2 ounces of pasta
我的挑战
我不确定如何设计类以尊重封装并确保易于维护的设计。
我的第一个想法是用
Unit
表示单位。类,所以我的 Ingredient
class 将包含一个数量和一个单位。但在某些情况下,成分是无单位的。带着这个想法,我的 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();
}
}
实际上,我认为我的问题是我不知道如何正确表示单位,所以我正在寻求您的帮助。
感谢您的时间!
编辑
我不仅会展示我的配料。在我的领域层中,我需要计算成分的营养成分。因此,根据其数量(或体积或质量),计算方式不同。一个简单地将营养事实乘以数量,而另一个必须按比例进行。这是多态的完美例子。
最佳答案
绝对要使用多态性。
通常这样做的方式是 present()
在真空中不再是一个独立的函数,它变成了 Ingredient
的一个方法反而。
所以,你基本上调用 Ingredient
将自身呈现为字符串。可能有一些参数指示公制与英制,成分可能有一些用处,或者如果没有单位,它可能会忽略。简单,优雅,尝试,它的工作原理。
关于oop - 在 OOP 中设计食品配料类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34111042/