Значения функций по умолчанию в многоуровневой архитектуре

Хотите знать, лучший способ установить значения по умолчанию в многоуровневой структуре приложения. В частности, если для определенного рабочего процесса требуется вложенный набор вызовов функций, указывается ли значение по умолчанию для всех функций или только для функции верхнего уровня и передается вниз? Или это какая-то другая модель целиком?

Например, рассмотрим веб-приложение с 3 слоями:

  • Уровень ресурсов обрабатывает HTTP-запросы и ответы, получает параметры HTTP от клиента
  • Бизнес-уровень выполняет бизнес-логику, необходимую для определения необходимой информации.
  • Уровень данных обращается к базе данных и возвращает запрошенные данные.

Допустим, клиент хочет получить один объект - для этого примера, скажем, его Place объект. Разместить объекты имеют type - город, штат, город, округ и т. д.

Функция ресурса может выглядеть следующим образом (с использованием HTTP-объектов Django):

def resource_get_place(request, type=None):
    """ Gets a place of the specified type, or a place of any type if
     type is None """

   place = business_get_place(type=type)

   return HttpResponse(request, {
       "place" : place
   }

Тогда два других могут быть:

def business_get_place(type):
    # Trivial in this case, used for consistency
    return data_get_place(type)

def data_get_place(type):
    # Get a place of specified type from the cache, or db,
    # or wherever else.  If type is None, get place of any type.
    return place

Должны ли две функции "ниже" уровня ресурсов в этом стеке также иметь тип по умолчанию None? Часть меня думает, что это нарушит СУХОЙ. Другая часть меня считает, что наиболее предсказуемым и модульным способом сделать это было бы, чтобы каждая функция в стеке по умолчанию набирала тип "разумно" для None.

1 ответ

Я бы сделал дефолт на самом низком уровне, который требует значения по умолчанию вместо самого высокого.

Рассматривая это с точки зрения необходимости - для уровня ресурсов "тип" является необязательным. То же самое относится и к вашему бизнес-уровню - там нет логики, которая требует значения для типа. Только когда вы перейдете на уровень данных, значение по умолчанию необходимо и имеет какое-либо значение.

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

Если вы хотите быть последовательными, нет ничего плохого в том, чтобы указывать значения по умолчанию и на более высоких уровнях. Возможно, если некоторые функции вашего бизнес-уровня имеют логику, которая требует значения для того, что передается на уровень данных, вы можете установить значения по умолчанию для всех функций на этом уровне. Тем не менее, я действительно не думаю, что это необходимо.

Ключ в том, что значения по умолчанию идут туда, где они действительно необходимы.

Другие вопросы по тегам