При использовании SOC и SRP следует ли мне беспокоиться о передаче слишком большого количества параметров между блоками кода?

Как далеко я разбиваю отдельные задачи в рамках типичного сценария «Веб-приложение реагирует на ввод данных пользователем»?

Например, в приведенном ниже случае скажем, сценарий «Пользователь отправляет форму, в результате чего пользовательские данные преобразуются в объект (техническая деталь) и затем сохраняются в базе данных».

Я использую различные сервисы для получения, фильтрации, объектизации и сохранения данных. В частности, например, в моей строке $domainObject = ... ниже данные копируются исключительно из массива в объект (аналогично этому Как называется шаблон, в котором он получает или запрашивает данные и возвращает объект?)

Я спрашиваю, если, продолжая разделять отдельные проблемы, с которыми я сталкиваюсь, на различные классы, сервисы и методы, усложняю ли я жизнь себе или будущим сопровождающим в долгосрочной перспективе?

class Controller
{
    //saves a domain object acquired from an HTML form & other sources
    function saveAction()
    {
        // acquire data from GET, POST, COOKIE, SESSION, database, et
        $inputData = $this->inputService->acquireData();

        // clean data
        $filteredData = $this->filterService->filter($inputData);

        // marshall data into an object
        $domainObject = $this->objectService->createObject($filteredData);

        //save object into a database
        $id = $this->repository->save($domainObject);

        // Send $id to View
        return new ViewModel(array(
            'id' => $id
        );
    }

Для ясности

Назовем «передачу параметров» «проводкой».

  • Итак, во-первых, мой провод $inputData, который я получаю от inputService.
  • Я беру этот провод и ввожу его в filterService, который возвращает другой конец провода с именем $filteredData.
  • Я беру этот конец провода и вставляю его в objectService.
  • Взамен я получаю $domainObject конец провода.
  • Я беру этот конец и подаю его в repository и получаю обратно ID
  • Я беру $id конец провода и ввожу его в свой ViewModel, и это конечная точка.

^^^^ Вышеприведенное — это все, что я делаю и что должно произойти, когда я использую Разделение проблем для разделения моего кода на различные конструкции кода inputService, filterService, objectService, repository, ViewModel.

Проводка соединяет их вместе.

Я могу «обмануть» и объединить некоторые конструкции кода вместе, чтобы свести к минимуму передачу провода. (минимизируйте передачу параметров везде).

И именно об этом мой вопрос.

Вопрос

Является ли подключение отдельных конструкций кода (передача параметров между различными службами) хорошей идеей? Должен ли я делать больше? Должен ли я делать меньше? Есть ли техника, о которой я не знаю, которая делает это не проблемой?


comment
Возможно, вы могли бы задать вопрос на CodeReview, это хорошее место, чтобы получить отзывы о вашем коде.   -  person Drown    schedule 03.05.2016
comment
Это выглядит как чисто общий пример. Если вы задаете вопрос на Code Review, обязательно опубликуйте свой реальный код.   -  person 200_success    schedule 03.05.2016
comment
Обзор кода предложил мне пойти в Программисты. Если программисты предложат мне перейти на SO, это создаст рефералы бесконечного цикла. Code Review — гораздо меньшее сообщество, и в прошлом мои вопросы просто висели там без ответа. Если я получаю ответ через несколько дней или недель, я, как правило, очень хочу двигаться дальше, и ответы для меня бесполезны. Я предпочитаю SO или Programmers, потому что там я получаю ответы на свои вопросы. Обзор кода — это место, где мой вопрос умирает.   -  person Dennis    schedule 04.05.2016
comment
Я немного озадачен тем, что Code Review отказался от вашего вопроса. Попробуйте задать вопрос об этом на их мета-сайте. Конечно, нет ничего плохого в том, чтобы опубликовать свой вопрос здесь, но в Stack Overflow нет ничего особенного, что делает его более подходящим, чем Code Review.   -  person Robert Harvey    schedule 04.05.2016
comment
Это именно тот вопрос, который нам нужен на Programmers.SE. Это больше связано с архитектурой приложения, чем с программированием, поэтому я понимаю, почему CodeReview.SE прошел мимо него.   -  person Adam Zuckerman    schedule 04.05.2016
comment
@Dennis Где твой вопрос о проверке кода? Я не вижу его нигде. Где Code Review предложил вам пойти в Программисты?   -  person Simon Forsberg    schedule 07.05.2016
comment
@Simon, это здесь: codereview.stackexchange.com/questions/127397/   -  person Dennis    schedule 09.05.2016


Ответы (1)


Я бы сказал, что это зависит от бизнес-логики и области проблемы, которую вы пытаетесь решить. Если вы видите такие фреймворки, как Ruby On Rails или Laravel, они пытаются использовать MVC для решения распространенных проблем веб-приложений. Однако эти фреймворки начинают толстеть (например, вы можете найти контроллеры или модели с более чем 2000 строками кода, то есть знаменитая модель User с большим количеством бизнес-логики).

Это популяризировало два подхода.

  1. Использование микросервисов в разных технологиях вместо монолитных приложений.
  2. Использование концепций ООП, таких как проблемы (черты в PHP), композиция, примеси для поведения, механизмы для разделения логики и многое другое.

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

Это очень обсуждаемая тема, и есть несколько статей великих программистов, таких как это от Дэвида Хайнемайера Ханссона. Также это чистое золото от Sandy Metz в railsconf. И другим хорошим ресурсом является этот вопрос.

person Randall Valenciano    schedule 03.05.2016