在哪里放置逻辑处理多个模型

时间:2014-04-22 05:45:15

标签: model-view-controller business-logic

在像Rails这样的MVC框架中,总体共识是将业务逻辑放在模型中。然而,当涉及到像#34;逻辑那样得到用户解决的所有问题时,我不确定我应该把逻辑放在哪个模型类中,因为它需要首先查找用户提交的所有解决方案,并从每个解决方案中收集问题ID,然后问题ID来解决所需的所有问题。

将它放在用户模型中感觉更优雅,因此我们可以调用类似user.getAllProblemsSolved()的内容。但是,我们从用户实例中需要的只是用户ID。在没有用户实例可用的地方,我们必须创建一个只调用其getAllProblemsSolved方法。

更重要的是,由于逻辑主要处理问题和解决方案模型,因此它会将 Feature Envy 添加到用户模型中。为了避免 Feature Envy ,放入问题或解决方案感觉同样好。直观地说,我会把它放在问题中,就像Problem.getAllProblemsSolvedBy(userId)一样,但我没有充分的理由。

那么我应该把这个逻辑放在哪里呢?

1 个答案:

答案 0 :(得分:0)

我可以看到ProblemUser之间的关系是m2m关系,所以如果你想遵循规则并将业务逻辑放在模型类中,你可以放{{1在表示m2m关系的模型类中,但使用该逻辑,getAllProblemsSolvedBy将返回问题ID,然后您必须从getAllProblemsSolvedBy模型类中获取问题。

我会将它放在Problem模型类中,因为该方法将返回Problem类的实例。


<强>更新 2014年4月23日,07:00 UTC

另请注意,在您的情况下,m2m类Problem取决于这两个模型SolutionUser是否存在,因此您可以在此模型中查询这两个模型,因此,如果我的代码中有一个m2m模型,我通常会负责查询m2m关系的两端。

例如,在您的情况下,Problem可以在getAllProblemsSolvedBy模型类中实现,它可以返回Solution个实例的列表,并且可以传递{{1}的实例}}