Api_view['POST', 'GET'] против принципов SOLID?

Это не проблема, с которой я сталкиваюсь, это просто открытое обсуждение. в среде Django Rest мы объявляем декоратор @api_view[] и принимаем такой аргумент, как

  1. ПОЧТА
  2. ПОЛУЧАТЬ
  3. ПОМЕЩАТЬ
  4. УДАЛИТЬ

в моем случае мне разрешено помещать в декоратор более одного аргумента и делать одну функцию более чем одной ответственностью, например

  @api_view['POST', 'GET]
  def fbv_list(request):`
       if request.method == 'POST':
           #do something
       if request.method == 'GET':
           #do something

в этом случае fbv_list делает более одной вещи, которая является POST и GET разве в этом случае эта функция не противоречит Единому классу ответственности, который соответствует принципам SOLID ????

Это мой вопрос, и если да, то что нужно сделать, чтобы не сломать SOLID .

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

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
58
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

На мой взгляд, вы не нарушаете никаких правил. С помощью одной функции вы обрабатываете один объект. Таким образом, вы экономите строки/печать, что облегчает чтение и отладку в дальнейшем. Нарушение правил будет, если ваш get обрабатывает один объект, а post обрабатывает другой. Было бы адом отлаживать это, если что-то не работает.

(Мое мнение).

Ответ принят как подходящий

Я начну свой ответ, процитировав определение представления из официальных документов Django:

Функция представления, или сокращенно представление, — это функция Python, которая принимает веб-запрос и возвращает веб-ответ. Этот ответ может быть HTML содержимое веб-страницы, или перенаправление, или ошибка 404, или XML документ или изображение. . . или что-нибудь, на самом деле. Сам вид содержит любую произвольную логику, необходимую для возврата этого ответ.

Ответственность представления состоит в том, чтобы принимать веб-запрос в качестве входных данных и возвращать веб-ответ в качестве выходных данных. API-интерфейсы DRF также являются «представлениями», поэтому это определение подходит и для них.

Разбивая это дальше, основная ответственность представления состоит в том, чтобы принять запрос и выполнить «произвольную» логику над ним. Что произвольно? Когда представление получает запрос, как оно решает, какой набор операций необходимо выполнить? Пытается ли запрос получить какую-то информацию из системы, создать запись или, возможно, попытаться выполнить сложную операцию обновления моделей данных? Это то, что должно решить представление, потому что это его основная цель. В зависимости от характера входного запроса тип вывода будет меняться. Тем не менее, основной функционал остался прежним. Это не нарушает SRP. Я также перечисляю один из фрагментов кода из документации Django, который использует тот же шаблон:

from django.http import HttpResponseRedirect
from django.shortcuts import render

from .forms import NameForm

def get_name(request):
    # if this is a POST request we need to process the form data
    if request.method == 'POST':
        # create a form instance and populate it with data from the request:
        form = NameForm(request.POST)
        # check whether it's valid:
        if form.is_valid():
            # process the data in form.cleaned_data as required
            # ...
            # redirect to a new URL:
            return HttpResponseRedirect('/thanks/')

    # if a GET (or any other method) we'll create a blank form
    else:
        form = NameForm()

    return render(request, 'name.html', {'form': form})

P.S. Обязательно проверьте эту ссылку, чтобы увидеть, как SRP может вводить в заблуждение и насколько его цель и использование субъективны.

Спасибо, Сайед, я не знал, что высокая сплоченность в одном классе не нарушает принцип SRP.

Yussef Raouf Abdelmisih 19.12.2022 16:59

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