В архитектуре MVC рассмотрим django:
У меня есть метод для расчета лучшего сотрудника года (1000 строк кода со сложной логикой), где я должен его определять и кто его назовет?
Спасибо
В архитектуре MVC рассмотрим django:
У меня есть метод для расчета лучшего сотрудника года (1000 строк кода со сложной логикой), где я должен его определять и кто его назовет?
Спасибо
Из 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()
Что касается django, лучшее место для размещения бизнес-логики - внутри моделей. Представление должно быть чистым от бизнес-логики и должно использоваться только для того, чтобы данные отображались/представлялись в шаблоне или, другими словами, позволяли использовать представление только для логики представления.
Из django FAQ:
В нашей интерпретации MVC "Просмотр" описывает данные, которые представленный пользователю. Это не обязательно, как выглядят данные, но какие данные представлены. Вид описывает, какие данные вы видите, а не как ты видишь это. Его тонкое различие.
Поместив свою бизнес-логику под модели, она приведет вас к unit test проще, потому что модели не связаны с HTTP-методами или обработкой.
Я согласен с теми, кто считает, что такая логика должна быть помещена в файлы models.py. Однако, что-то такое же большое, как у вас, с более чем 1 тыс. Строк кода, начнет загромождать файлы models.py [для меня]. Я был бы склонен переместить такой код в отдельный файл в рамках данного приложения. Нет вреда в этом.
Это обычное приложение? Если да, извлечение бизнес-логики в стороне от представления на самом деле не совсем возможно. Иногда вам приходится размещать его там по множеству причин, один из которых будет ремонтопригодностью.
Кроме того, расчет должен быть вне пользовательского интерфейса, в 99,9% случаев.
Я стараюсь следовать концепции "тощий контроллер, толстая модель" (ссылка относится только к Rails, но концепция по-прежнему применяется). Ваш контроллер не должен иметь большого количества кода в нем, кроме как для сеансов, куки, форм и т.д. Вся фактическая логика вашего приложения должна находиться в вашей модели, что упрощает тестирование и рефакторинг позже.
Что касается вашего конкретного примера "метод расчета лучшего сотрудника года (1000 строк кода со сложной логикой)... где его определить и кто его назовет?"
Для этого большого количества кода я, вероятно, создаю новый модуль (возможно, rank.py) и поставлю его там. Кто будет называть это, зависит от того, как вы его используете, но я бы предположил, что он будет вызываться из одного из ваших представлений.
От ваших входов:
Определение отдельного модуля "services.py" для хранения методов/классов со сложным алгоритмом и логикой.
Как мы знаем, в конце концов вызов будет сделан из представлений (кто знает, чего он хочет), поэтому самое лучшее, что мы можем сделать, это вызвать метод в моделях, которые внутренне вызывают логику из модуля служб, использует данные моделей для обработки и вернуть результат, который будет записан на ответ.
Спасибо за ваши ответы.