Как правильно использовать сервисные методы в Django?

#python #django #design-patterns

#python #django #шаблоны проектирования

Вопрос:

В качестве примера предположим, что я создаю Rest API с использованием Django Rest Framework. Теперь, как часть приложения, несколько методов являются общими для всех представлений. Мой подход заключается в том, что в корневом каталоге я создал services.py досье. Внутри этого модуля находится класс (CommonUtils), содержащий все общие служебные методы. В том же services.py модуль Я создал экземпляр объекта CommonUtils.

Теперь во всем приложении, в разных views.py файлы Я импортирую объект из модуля и вызываю методы для этого объекта. Итак, по сути, я использую одноэлементный объект для общих служебных методов.

Я чувствую, что это не очень хороший подход к дизайну. Итак, я хочу получить объяснение, почему этот подход не является хорошей идеей, и какова наилучшая практика или наилучший подход для достижения того же, то есть использовать набор общих служебных методов во всех views.py файлы.

Заранее спасибо.

Комментарии:

1. Это довольно субъективный вопрос. Каждый проект, над которым я работал, в конечном итоге имеет utils модуль / пакет, потому что есть логика, общая для всего. Однако эти функции обычно невелики и в них нет бизнес-логики.

2. Какие преимущества вы получаете от использования класса?

3. Предполагается, что класс должен содержать общие функции, используемые в приложении django. Например. возможно, откуда-то извлекаются образцы данных или, может быть, какая-то логика для анализа данных и т. Д.

Ответ №1:

Это правильный дизайн? Почему? Как сделать лучше?

Я чувствую, что это не очень хороший подход к дизайну. Итак, я хочу получить объяснение, почему этот подход не является хорошей идеей, и какова наилучшая практика или наилучший подход для достижения того же, то есть использовать набор общих служебных методов во всех views.py файлы.

Как писал выше @Dmitry Belaventsev, общего правила для решения этой проблемы не существует. Это типичный случай сквозных проблем.

Теперь во всем приложении, в разных views.py файлы Я импортирую объект из модуля и вызываю методы для этого объекта. Итак, по сути, я использую одноэлементный объект для общих служебных методов.

Да, ваша реализация на самом деле является одноэлементной, и в этом нет ничего плохого. Вы должны спросить себя, чего вы хотите достичь или что вам действительно нужно. Существует множество решений, и вы можете начать с самого простого:

Простая функция в модуле python

 # file is named utils.py and lives in the root directory

def helper_function_one(param):
   return transcendent_all_evil_of(param)

def helper_function_two(prename, lastname):
   return 'Hello {} {}'.format(prename, lastname)
  

В Python нередко использовать только простые функции в модуле. Вы можете обновить его до метода (и класса), если это действительно необходимо, и вам нужны преимущества классов и объектов.

Вы также можете использовать класс со статическими методами:

 # utils.py

class Utils():
   @staticmethod
   def helper_one():
       print('do something')
  

Но вы можете видеть, что это ничем не отличается от решения с простыми функциями, помимо дополнительного уровня класса. Но это не имеет дальнейшего значения.

Вы также можете написать одноэлементный класс, но, на мой взгляд, это не очень по-питоновски, потому что вы получаете тот же результат с простым экземпляром объекта в модуле.