Skip to content

Instantly share code, notes, and snippets.

@fey
Created May 30, 2019 05:19
Show Gist options
  • Save fey/21683be24a7da256b0caf1b1517b8754 to your computer and use it in GitHub Desktop.
Save fey/21683be24a7da256b0caf1b1517b8754 to your computer and use it in GitHub Desktop.
Кирилл про архитектуру и mvc 30/05/2019
point212 [8:19 PM]
Ребята, а скажите вот на счёт побочных эффектов.
Вот в типичном MVC приложении Controller это top level, можно сказать.
И вот всю логику из него я убираю, и помещаю в Service.
Но по логике, допустим, у меня Service должен создавать и сохранять в БД модельку.
И если я это оставлю в сервисе - это будет побочный эффект ведь?
ReDBrother [8:21 PM]
Ну, если service только сохраняет в базу, то все норм.
igor-i [8:22 PM]
в кодобазе хекслета в сервисах не только сохранение
ReDBrother [8:23 PM]
Это если только одна модель в mvc.
point212 [8:24 PM]
Ну конкретно тот сервис, который я имел в виду, когда задавал вопрос, да. Создает и сохраняет в базу
Но могут то быть всякие. Которые в итоге делают дохрена всего: например дёргают чужое АПИ (чем на той стороне что-то меняют), а по полученным данным связанные модели апдейтят,
ReDBrother [8:25 PM]
Уже чудесатее. Тогда нужно четко разделять модель и сервис.
point212 [8:25 PM]
)))) Дык вот.
igor-i [8:25 PM]
мне кажется тут важно просто всё в перемешку не делать, стараться сначала запросить данные, потом их обработать и в конце сохранить
ReDBrother [8:26 PM]
Правильно, что все убрали с контролера, это точно.
point212 [8:26 PM]
Модель то отдельная. Просто вот как бы получается или логику все же выносить в контроллер
igor-i [8:26 PM]
а как будет по модулям разложенно - это уже вторично кмк
Ivan Levchuk [8:27 PM]
А что у вас подразумевается под моделью?
point212 [8:32 PM]
У меня то? Модель AR :slightly_smiling_face:
Ivan Levchuk [8:45 PM]
Вообще в MVC под моделью нужно понимать модель предметной области, не AR, не один класс. Вы моделируете какой-то домен, а AR это просто работа с базой. Если вы вынесите все в сервисы - то у вас будет анемичная модель, если вы вынесите все в контроллеры - будут анемичные модели и проблемы с переиспользованием кода, если вынесите все в AR - тостые “модели“, в которых будет перемешенна и валидация, и работа с базой и бизнес логика . Тут нет серебянной пули и врятли вам кто-то сможет сказать, что вот так и вот так сделайте и все будет хорошо, есть какие-то общие прицнипы, но нужно просто следить за связанностью кода (coupling и cohesion), все принципы solid и тд сводятся именно к этому, а эти вещи очень сильно зависят от вашей предметной области и проекта. Если у вас просто круд какой-то - ну оставьте все в контроллере и не нужно городить кучу абстракций.
point212 [8:56 PM]
Да. Спасибо за развёрнутый ответ.
Ivan Levchuk [8:56 PM]
И кстати в контексте веба не верно говорить про MVC, тут скорее MVA(Model, View, Adapter). MVC был описан Трюгве в конце 70-x, когда еще не было веба и идея там была другая.
https://habr.com/ru/post/321050/
Хабр
Охота на мифический MVC. Обзор, возвращение к первоисточникам и про то, как анализировать и выводить шаблоны самому
— Не понимаю, почему люди так восхищаются этим Карузо? Косноязычен, гугнив, поёт — ничего не разберешь! — А вы слышали, как поёт Карузо? — Да, мне тут кое-что из...
point212 [8:57 PM]
Проблемка скорее все же в людях, как всегда.
Когда тебе говорят "вынеси всю логику из контроллера". А там логики то и нет
Но ты не в сильной позиции для спора
feycot [9:04 PM]
Я так понял, что под логикой будет все, кроме получения параметров и отдачи респонса
Ivan Levchuk [9:04 PM]
Да, все через это проходили. И на самом деле это очень сложно следить за связанностью. Тут еще проблема в том, что как правило вначале разрабатывается база данных, а не моделируется предметная область. А на самом деле база вторична, это просто персистенс, который позволяет восстановить состояние приложния. Поэтому многим сложно понимать, что если в ваших моделях(аггрегатах) половина методов вообще никак не относятся к другой половине - то скорее всего это вообще разные модели.
Не совсем, бизнес логика и логика приложения это немного разные вещи. Есть вещи, которые не критичны для бизнеса, например после оплаты человеку не пришло письмо, о том что товар успешно оплачен. Это относится не к бизнесу, а скорее к логике приложения.
Jekamai [9:23 PM]
joined #computer_science. Also, NN left.
kirill.mokevnin [1:07 AM]
я тут даже больше скажу, есть какая-то дикость в том что обычная абстаркция в рамках MVC превращается в “архитектуру”
когда речь идет про “просто код“, то всем все понятно, вот у нас слой, вот у нас функции, вот мы завернули их в другие функции и так далее
когда речь заходит про mvc, ощущение что программисты забывают что они программисты
для них становится открытием что общий код можно выносить
что можно строить слои (если логика повторяется)
им становятся нужны паттерны в стиле service layer
общий принцип для любого кода вообще такой. Пишем код, видим что логика начинает повторяться: выносим в функции (не забываем про барьеры и слои)
point212 [1:11 AM]
Ну потому что везде люди. В них одно сплошное человеческое. Дедовщина, иерархии, выпячивание своего эго.
Вот и получается, что ты приходишь в фирму вроде с чистой головой, а потом на форумах от тебя появляются вопросы вроде: "какой паттерн мне тут лучше применить?"
Ivan Levchuk [1:12 AM]
Вот все что касается архитектуры, мне кажется отличное утверждение - it’s about journey, not destination (edited)
point212 [1:20 AM]
Угу. И мало кто способен это во первых хотя бы первести правильно, во вторых развернуть и наложить на предметную область "программирование".
В основном люди следуют тому, к чему привыкли, своему опыту.
И вот ты сидишь такой, перед проблемой. Вроде начал делать, а тебе с одной стороны говорят: неправильна. чота ты перемудрил, как-то не по рельсовому. вот же, хуяк-хуяк и в продакшен. буизинесс фёрст, все дела. а с другой - чота как-то грязно, тут бы в сервис вынести логику, валидации в форм-обджект, и монады привертеть, чтобы ошибки возвращать.
А у тебя и права голоса нет. только встать и уйти.
kirill.mokevnin [1:20 AM]
кстати я так и не отписался по твоему разговору насчет отправки писем
отправка письма в контроллере это херовая мысль
отправка письма в модели еще более херовая мысль
отправка писем это мать его сетевое взаимодействие, такие вещи нельзя брать и просто так делать синхронно. Представь что по какой-то причине отправка зафейлится, причем регистрация уже прошла успешна (допустим что речь про регистрацию). Это значит что чувак увидит 500 в браузере, хотя процесс прошел
это только одна возможная проблема
дальше можно нафантазировать еще дсяток, начиная от тормозов заканчивая гарантиями доставки
point212 [1:23 AM]
Я помню про эти штуки. Но я не говорил прям про формирование письма и отправку его запросом по сетке.
Допустим я про рельсовый способ, когда создается джоба асинхронная. И после вызова строчки кода ты можешь уже забыть про нее.
Вопрос был куда правильней всего пихать этот вызов, что создает джобу
kirill.mokevnin [1:24 AM]
забыть совсем не правильно
но это отдельная тема
ну смотри у тебя обработка любого запроса стартует с контроллера (на самом деле с мидлвар но это специфические кейсы)
ну а дальше включаем здравый смысл
делаем все в контроллере пока не начинает болеть
начинает болеть вносим абстракции
все
point212 [1:28 AM]
Ммм.. окей
Ну тут наверное еще та беда, что народ сразу же пытается применить какую-то штуку из своего опыта (не важно Сервис она называется, или монада или еще что).
А ты со своим "а может просто в функцию вынести?" оказываешься героем того комикса которого выкинули из окна )))
И вот этот вот код, начинают подтягивать к знакомому людям образу.
kirill.mokevnin [1:30 AM]
ну тут главное не передергивать
если уже есть какая-то структура
то будет странно если ты начнешь выносить просто в функции, а не следовать ей
другой вопрос что сама структура может быть не очень, тут бесполезно разговаривать, нужно смотреть (edited)
ReDBrother [1:31 AM]
Собственно поэтому надеются на расширенный вариант mvc, который просто успокаивает других членов команды, когда просто нужно другой слой добавить.
point212 [1:32 AM]
Ну да. Тоже верно. Всё больше убеждаюсь что надо не по Руби книжки задрачивать, а читать что-то типа "тактика ведения бизнес-переговоров" :slightly_smiling_face:
kirill.mokevnin [1:32 AM]
могу как пример сказать, на хекслете нельзя просто так взять и по рубишному отправить письмо из контроллера. У нас любые нотификации проходят через специальную систему событий, которая унифицирует способ работы с разными типами нотификаций и контролирует их, дает много нужных нам плюшек (edited)
поэтому тут выбора нет
а кроме сервисов у нас введет еще один слой, называется мутаторы
благодаря нему мы не используем колбеки в моделях (это отдельное злое зло)
и кстати это все довольно сильно впечатлило ваню немытченко
что он аж по следам наших решений книгу пишет
https://railshurts.com/ во)
point212 [1:38 AM]
А вы ему код давали посмотреть?
kirill.mokevnin [1:38 AM]
он даже запилил кое чего
его знакомство с этими подходами началось на воркшопах
дальше мы с ним постоянно общались и подключали его
point212 [1:39 AM]
Ааа.. вспоминаю. Читал же его блог.
kirill.mokevnin [1:39 AM]
я как раз рассказывал как мы письма шлем
или как биллинг сделан
довольно много интересных решений
point212 [1:41 AM]
Да кто-то с ребят даже стримил, как он новый тип событий у вас там запиливал.
Интересно было
kirill.mokevnin [1:44 AM]
о, саша про это как раз рассказывал
kirill.mokevnin [1:45 AM]
кстати я знаю что @vtm после воркшопа у себя запиливал эту систему
kirill.mokevnin [1:45 AM]
и потом хвастался что у него круче получилось)
Morozzzko [1:46 AM]
а насколько гут он в книге описывает идеи, принципы и применимость? я почти хочу её купить и посмотреть
kirill.mokevnin [1:46 AM]
сложно сказать, я не читал
@inem тыц
inem [1:47 AM]
was added to #computer_science by kirill.mokevnin.
Morozzzko [1:47 AM]
это не у него было 2 аккаунта в слаке? :thinking: (edited)
kirill.mokevnin [1:48 AM]
вижу что есть два да)
Игорь, скажу так, видя что ты пишешь и за что топишь
тебе не понравятся наши идеи :batya:
Morozzzko [1:49 AM]
ну и ладно, мне важно понимать, как можно добиться схожих результатов, но другими путями
kirill.mokevnin [1:49 AM]
именно по организации кода самого фреймворка, то есть того как принято структурировать его во фреймворке
мой фаворит это феникс
никакого булшита, все по делу там
Morozzzko [1:53 AM]
Интересно, как на фениксе выглядят проекты с обширной / сложной предметной областью. А то я в в своих продуктовых разработках почти не видел «как у других» сделано
kirill.mokevnin [1:53 AM]
да ну нормально выглядят
код он и в африке код
функция туда, данные сюда
а учитывая что нет наркоманских классов и есть возможность паттерн матчить
то кода будет меньше
Morozzzko [1:55 AM]
> функция туда, данные сюда
для меня так на любом языке выглядит код :kolobok_odobryau:
мне на уровне абстракций и «чего они там наворотили» хочется
kirill.mokevnin [1:56 AM]
ну бизнес логику то за тебя никто не сделает
kirill.mokevnin [1:56 AM]
в эликсире персистентность отдельно от данных
kirill.mokevnin [1:57 AM]
точнее в ecto
но выборки там довольно многословные
https://github.com/hexlet-basics/hexlet_basics/blob/master/services/app/lib/hexlet_basics_web/controllers/language_controller.ex
services/app/lib/hexlet_basics_web/controllers/language_controller.ex
```defmodule HexletBasicsWeb.LanguageController do
use HexletBasicsWeb, :controller
alias HexletBasics.Repo
alias HexletBasics.{Language, Language.Module, Language.Module.Lesson}
import Ecto.Query```
Show more
hexlet-basics/hexlet_basicsAdded by GitHub
вот тут хандлер на 100 строк
он тупой, но много запросов
point212 [1:59 AM]
Кирилл, возьми на заметку всё же.
Очень хорошая статья (имхо)
https://habr.com/ru/post/321050/
Хабр
Охота на мифический MVC. Обзор, возвращение к первоисточникам и про то, как анализировать и выводить шаблоны самому
— Не понимаю, почему люди так восхищаются этим Карузо? Косноязычен, гугнив, поёт — ничего не разберешь! — А вы слышали, как поёт Карузо? — Да, мне тут кое-что из...
Тебе то наверное всё это как перечисление азбуки. Но тут хорошо изложено для новичков.
Ну и не новичков, но тех кто не в теме.
Имхо стоит включить в курсы главу про MVC примерно в таком стиле. Чтобы люди понимали что то что им потом на работе будут подсовывать в виде MVC не совсем то. (edited)
kirill.mokevnin [2:00 AM]
саш но я же об этом и рассказывал на слаконарах
что есть два mvc
point212 [2:01 AM]
Ну на слаконарах - да. Я про курсы.
kirill.mokevnin [2:01 AM]
один для толстых клиентов другой для клиент серверных
это и в курсах доносится
не так подробно конечно, но я об этом говорю
point212 [2:01 AM]
Ааа. пардон муа, тогда.
Morozzzko [2:02 AM]
replied to a thread:
вот это то, чего мне до сих пор не хватает в рельсе
как устроился с рельсой работать год назад, так до сих пор тянет обратно в ром
я исследую архитектуры на рельсе в т.ч. чтобы понять, как можно организовывать плавные переходы с AR на ROM (вместе с логикой) и чтоб было идиоматично
point212 [2:02 AM]
Но очень хорошая статья. Я б её закрепил куда-нибудь в ссылки материалов с хеклсета.
Там в статье, даже есть ссылки на исходные работы людей, которые собсно MVC придумали
kirill.mokevnin [2:02 AM]
@Morozzzko я это называю “писать против ветра”
Morozzzko [2:02 AM]
ударение сам? :kolobok:
kirill.mokevnin [2:02 AM]
у меня было время когда я упарывался по архитектурам и только этим занимался (edited)
но сейчас следую максимально прагматичному подходу
есть инструмент, под него реализовано все что только возможно
и нет ничего дешевле чем использовать то что есть (при этом понимая ограничения)
потому что фокус не на коде, а на бизнесе
например выкинув AR ты сразу лиаешься ransack
а это значит что вместо 5 минут на фильтрацию тебе придется тратить гораздо больше времени и фигачить свои решения
и так далее
тоже самое во фронте, пусть будут фреймворки которые в тысячу раз быстрее реакта, но реакт сейчас стандарт, а значит имеет кучу интеграций и готовых решений под него
это важнее с точки зрения бизнеса (учитываем конечно что реакт сам по себех хорош, в отличии от того же ангуляра)
но я понимаю тебя) до бизнеса еще дойдет
надо сначала напробоваться
Morozzzko [2:06 AM]
ух, фильтры, моя любимая тема. не люблю их продуктово.
в целом да, я часто сам сбиваюсь на такую точку зрения, особенно когда от меня требуют, чтоб команда деливерила результат. мне лишь бы в продакшен побыстрее
мне просто нравится делать инструменты, это моё хобби
kirill.mokevnin [2:06 AM]
да да я понимаю, у меня такое же было
прямо года два три
я перечитал все книги по архитектурам
участвовал во всех батлах
пробовал всякие схемы
потом узбагоился
:smile:
point212 [2:07 AM]
Надо подарить тебе фигурку магистра Йоды :slightly_smiling_face:
kirill.mokevnin [2:07 AM]
да ну это стандартная история, от этого устают многие
кто-то перегорает
кто-то в бизнес ударяется
вон те же ребята с девзена
мы с ними как раз общались на эту тему, что их задолбали эти базы данных и нагрузки высокие вместе с эрлангом
хочется про жизнь, про бизнес
Morozzzko [2:08 AM]
У меня программирование как хобби уже лет 12, для меня это «угореть по архитектуре» — это скорее один из завершающих этапов как полноценного программиста, а потом пойдет бизнес, продукт.
Мне уже кастдевы в разы интереснее всяких кубернетесов
point212 [2:08 AM]
А еще лет 5 пройдет - про детей, про дачу
kirill.mokevnin [2:10 AM]
короче код тлен, главное миллион долларов сша
:trollparrot:
Morozzzko [2:10 AM]
Хочется не выдрачивать архитектуру, а просто делать прикольные штуки, и есть лишь какое-то время, чтобы изучить инструменты — будь это CS, фреймворк, архитектура, ещё что-то. А потом будет таааак лень. Мне уже лень :yoba-rolling: (edited)
kirill.mokevnin [2:10 AM]
вот из такого мне интересны языки
типа свой компилятор написать
или фреймворк на js)
Morozzzko [2:11 AM]
я думал, писать фреймворки — это этап в начале карьеры программиста
у меня и моих друзей так было, по крайней мере :yoba-rolling:
kirill.mokevnin [2:12 AM]
ага, один мой фреймворк даже в проде использовался
но тут другая история, на ноде просто нет нормальных бекенд фреймворков
щас один два появились, но тоже не совсем то
поэтому я давно собирался написать что-то нормальное
а у меня все же много опыта по копанию кишков и фреймворков и orm
vernat [3:24 AM]
nest.js все еще не то?
по поводу отправки письма из контроллера, какое решение норм?
типа вернуть юзеру 200 , из контроллера кинуть сообщение в очередь сообщений, которое подхватит сервис отправки писем и сделает всю работу?
kirill.mokevnin [3:34 AM]
лучше без рукопашки, для таких целей юзают асинхронные джобы
Aleksandr Dargeev [8:04 AM]
что такое модель AR? гугл про дополненную реальность рассказывает
igor-i [8:43 AM]
Active Record - ORM в Ruby-On-Rails
Greg [8:47 AM]
joined #computer_science.
vtm [8:49 AM]
replied to a thread:
Да, зарилил в каком-то варианте. Могу гист сделать.
Aleksandr Dargeev [9:29 AM]
спасибо)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment