Подтвердить что ты не робот

В MVC (например, Django), какое лучшее место для вашей тяжелой логики?

В архитектуре MVC рассмотрим django:

У меня есть метод для расчета лучшего сотрудника года (1000 строк кода со сложной логикой), где я должен его определять и кто его назовет?

Спасибо

4b9b3361

Ответ 1

Из Django docs

Добавление дополнительных методов диспетчера - это предпочтительный способ добавления "уровня таблицы", функциональность для ваших моделей.

  • Создайте модуль с этой логикой (year_employee.py)
  • Допустим, у вас есть модель Employee, поэтому вы должны создать класс для управления сотрудниками:

    class EmployeeManager(models.Manager)
        def of_the_year(self):
            from year_employee import my_calc_func
            return my_calc_func()
    

Затем добавьте этот менеджер в свою модель

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

После этого вы можете просто сделать это:

chosen_employee = Employee.objects.of_the_year()

Ответ 2

Что касается django, лучшее место для размещения бизнес-логики - внутри моделей. Представление должно быть чистым от бизнес-логики и должно использоваться только для того, чтобы данные отображались/представлялись в шаблоне или, другими словами, позволяли использовать представление только для логики представления.

Из django FAQ:

В нашей интерпретации MVC "Просмотр" описывает данные, которые представленный пользователю. Это не обязательно, как выглядят данные, но какие данные представлены. Вид описывает, какие данные вы видите, а не как ты видишь это. Его тонкое различие.

Поместив свою бизнес-логику под модели, она приведет вас к unit test проще, потому что модели не связаны с HTTP-методами или обработкой.

Ответ 3

  • Положения логики в представлении не позволят вы легко можете писать модульные тесты и не может эффективно использоваться повторно. Это говорит что вы никогда не должны ставить сложной логики в представлении, которое вы должны отделите его от представления.
  • Если логика тесно связана с (класс/объекты класса) эта логика в модели имеет смысл.
  • Если логика тесно связана несколько объектов/классов, которые вы можете использовать одна из моделей, чтобы поставить логику или вы может создать объект службы (или когда код слишком велик), который будет обрабатывать эту логику.

Ответ 4

Я согласен с теми, кто считает, что такая логика должна быть помещена в файлы models.py. Однако, что-то такое же большое, как у вас, с более чем 1 тыс. Строк кода, начнет загромождать файлы models.py [для меня]. Я был бы склонен переместить такой код в отдельный файл в рамках данного приложения. Нет вреда в этом.

Ответ 5

Это обычное приложение? Если да, извлечение бизнес-логики в стороне от представления на самом деле не совсем возможно. Иногда вам приходится размещать его там по множеству причин, один из которых будет ремонтопригодностью.

Кроме того, расчет должен быть вне пользовательского интерфейса, в 99,9% случаев.

Ответ 6

Я стараюсь следовать концепции "тощий контроллер, толстая модель" (ссылка относится только к Rails, но концепция по-прежнему применяется). Ваш контроллер не должен иметь большого количества кода в нем, кроме как для сеансов, куки, форм и т.д. Вся фактическая логика вашего приложения должна находиться в вашей модели, что упрощает тестирование и рефакторинг позже.

Ответ 7

Что касается вашего конкретного примера "метод расчета лучшего сотрудника года (1000 строк кода со сложной логикой)... где его определить и кто его назовет?"

Для этого большого количества кода я, вероятно, создаю новый модуль (возможно, rank.py) и поставлю его там. Кто будет называть это, зависит от того, как вы его используете, но я бы предположил, что он будет вызываться из одного из ваших представлений.

Ответ 8

От ваших входов:

Определение отдельного модуля "services.py" для хранения методов/классов со сложным алгоритмом и логикой.

Как мы знаем, в конце концов вызов будет сделан из представлений (кто знает, чего он хочет), поэтому самое лучшее, что мы можем сделать, это вызвать метод в моделях, которые внутренне вызывают логику из модуля служб, использует данные моделей для обработки и вернуть результат, который будет записан на ответ.

Спасибо за ваши ответы.