Значения функций по умолчанию в многоуровневой архитектуре
Хотите знать, лучший способ установить значения по умолчанию в многоуровневой структуре приложения. В частности, если для определенного рабочего процесса требуется вложенный набор вызовов функций, указывается ли значение по умолчанию для всех функций или только для функции верхнего уровня и передается вниз? Или это какая-то другая модель целиком?
Например, рассмотрим веб-приложение с 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 ответ
Я бы сделал дефолт на самом низком уровне, который требует значения по умолчанию вместо самого высокого.
Рассматривая это с точки зрения необходимости - для уровня ресурсов "тип" является необязательным. То же самое относится и к вашему бизнес-уровню - там нет логики, которая требует значения для типа. Только когда вы перейдете на уровень данных, значение по умолчанию необходимо и имеет какое-либо значение.
Функция в каждом слое должна работать независимо от того, что вызывает ее сверху. Итак, если вашему уровню данных требуется какое-то значение для "типа" (и есть значение по умолчанию, которое имеет смысл независимо от того, кто его вызывает), поместите значение по умолчанию в слой данных.
Если вы хотите быть последовательными, нет ничего плохого в том, чтобы указывать значения по умолчанию и на более высоких уровнях. Возможно, если некоторые функции вашего бизнес-уровня имеют логику, которая требует значения для того, что передается на уровень данных, вы можете установить значения по умолчанию для всех функций на этом уровне. Тем не менее, я действительно не думаю, что это необходимо.
Ключ в том, что значения по умолчанию идут туда, где они действительно необходимы.