#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')
Но вы можете видеть, что это ничем не отличается от решения с простыми функциями, помимо дополнительного уровня класса. Но это не имеет дальнейшего значения.
Вы также можете написать одноэлементный класс, но, на мой взгляд, это не очень по-питоновски, потому что вы получаете тот же результат с простым экземпляром объекта в модуле.