在MVC(例如Django)中,放置重型逻辑的最佳位置是什么?

时间:2009-11-11 05:12:16

标签: django model-view-controller

在MVC架构中让我们考虑一下django:

我有一种计算年度最佳员工的方法(1000行代码具有复杂的逻辑),我应该在哪里定义它以及谁来调用它?

由于

8 个答案:

答案 0 :(得分:26)

来自Django docs

  

添加额外的Manager方法就是   添加“表级”的首选方法   模型的功能。

  1. 使用该逻辑(year_employee.py
  2. 创建一个模块
  3. 假设你有一个模型Employee,那么你应该创建一个管理员工的课程:

    class EmployeeManager(models.Manager)
        def of_the_year(self):
            from year_employee import my_calc_func
            return my_calc_func()
    
  4. 然后将此经理添加到您的模型

    class Employee(models.Model):
        [...]
        objects = EmployeeManager()
    

    之后你可以这样做:

    chosen_employee = Employee.objects.of_the_year()
    

答案 1 :(得分:12)

至于django,放置业务逻辑的最佳位置是模型内部。视图应该从业务逻辑中清除,并且应该仅用于使数据在模板上显示/显示,或者换句话说,仅将视图用于视图逻辑。

来自django FAQ

  

在我们对MVC的解释中,   “view”描述了获得的数据   呈现给用户。不是   必然是数据的外观,但是   提供哪些数据。风景   描述您看到的数据,而不是如何   你看到了这是一个微妙的区别。

通过将您的业务逻辑放在模型下,它将使您更容易进行单元测试,因为模型没有与HTTP方法或处理相结合。

答案 2 :(得分:7)

  1. 将逻辑放入View中是不允许的 你可以轻松地编写单元测试 不能有效地重复使用。这说 你永远不应该把它 你应该在视图中的复杂逻辑 将它从视图中分离出来。
  2. 如果逻辑与a紧密相关 (类的类/对象)推杆 模型中的逻辑是有道理的。
  3. 如果逻辑紧密相关 您可以使用多个对象/类 把逻辑或你的模型之一 可以创建一个服务对象(或者当代码太大时) 将处理这个逻辑。

答案 3 :(得分:4)

我同意那些认为应该将这种逻辑放在models.py文件中的人。然而,有超过1k行代码的东西就像你拥有的那样大,会开始混乱models.py文件[对我来说]。我倾向于将这些代码移动到给定应用程序中的单独文件中。这样做没有坏处。

答案 4 :(得分:2)

这是自定义应用程序吗?如果是,那么从视图中提取业务逻辑实际上并不是真的可能。有时你必须把它放在那里有很多原因,其中一个原因是可维护性。

除此之外,计算应该在UI之外,在99.9%的情况下。

答案 5 :(得分:1)

我尝试遵循"skinny controller, fat model"概念(链接特定于Rails,但概念仍然适用)。您的控制器根本不应包含太多代码,除了处理会话,cookie,表单等。您的应用程序的所有实际逻辑应该驻留在您的模型中,以便以后更容易测试和重构。

答案 6 :(得分:0)

关于您的具体示例“一种计算年度最佳员工的方法(1000行具有复杂逻辑的代码)...我应该在哪里定义它以及谁来调用它?”

对于那么多代码,我可能会创建一个新模块(可能是ranking.py)并将其放在那里。谁会打电话取决于你如何使用它,但我猜它会从你的一个观点中调用。

答案 7 :(得分:0)

来自您的输入:

定义一个单独的模块“services.py”,用于保存具有复杂算法和逻辑的方法/类。

我们最终知道调用将来自视图(谁知道它想要什么),所以我们能做的最好的事情就是在模型中调用一个方法,从内部调用服务模块的逻辑,使用模型数据进行处理并返回要写入响应的结果。

感谢您的回复。