Kirill Profile picture
20 Apr, 20 tweets, 5 min read
Третий тред по автоматному программированию. Поговорим про бекенд на разных языках. Ситуации, связь с базой, готовые либы и применимость. Ретвиты приветствуются! Вопрос: Используется ли в вашем проекте либа для автоматов?
Краткий пересказ прошлых частей. Автоматы есть всегда, главное их увидеть и заменить флаги на явно выделенное состояние. А в бекенде еще и автоматизировать работу с ними. Как?
Независимо от выбранного стека, состояние практического любого проекта отражается на базу данных. Заводятся либо флаги, либо поле state/status куда записывается название текущего состояния. В отличии от фронтенда, с автоматами в беке надо быть гораздо более аккуратными
То что флаги, как правило, зло, мы уже выяснили, но в бекенде еще накладывается то, что все хранится в базе. Предположим что у нас публикация постов на хабре и мы используем флаг published в базе данных. Все будет работать до тех пор пока мы не введем третье состояние draft.
Неправильный путь – добавлять еще один флаг. Правильный менять published на поле state строкового типа. Но это база данных, менять тип поля в любом живом проекте это тяжело, а иногда тупо невозможно. Теряется обратная совместимость (пока zero down deploy). Мы попадаем в ловушку
На практике получается, что, даже, если автомат состоит из двух состояний, в подавляющем большинстве случаев стоит завязываться на строковое поле в базе данных. Тогда мы получаем бесплатную расширяемость и, что важно, код от этого не станет сложнее, даже местами проще (i18n)
Во фронтенде использование спец либ для автоматов оправдано только в сложных ситуациях, но в бекенде все по другому. Хорошие библиотеки просты в использовании и, самое главное, дают нам множество офигенных плюшек. Расскажу на примере рубишного автомата github.com/aasm/aasm
Само описание автомата. Оно позволяет понять, а что собственно происходит и какие возможны варианты. Это натурально живая документация. Фактически открыв модель и прочитав ее автоматы, можно без доки понять какие процессы есть в приложении и как они функционируют. Image
А библиотека гарантирует ограничения, что мы перейдем только в то состояние, в которое можно перейти. Более того, она генерирует все необходимые методы переходов и проверки. Мы не пишем ничего сами! Причем подобные библиотеки позволяют повесить доп ограничения на переходы Image
Здесь нужно сказать что в автоматах нельзя менять стейт напрямую, это противоречит самой идее. Переходы в (событийном) автомате происходят только по событиям, которые уже знают в какой стейт нужно перейти. Только в этом случае библиотеки могут что-то гарантировать. Плюс фишки
Главная фишка это события. Можно вешать обработчики на переходы без ручных проверок стейтов. Например отправлять письмо автору о том что его статья успешно прошла модерацию. Image
И все это напрямую связано с ORM. То есть оно автоматически встраивается в save модели, валидируется и записывается в базу. Подключение подобного автомата занимает просто минуту времени. Поэтому в прокаченном бекенде использование либы лучше чем не использование.
В исходном коде Хекслета на бекенде около 100 явных автоматов. В одном пользователе их около 5 штук. Например есть автомат по синхронизации емейла пользователя с емейлом в Stripe (биллинг). А вот пример из ru.code-basics.com github.com/hexlet-basics/… Посмотрите как просто
Теперь по языкам, кто что нам предлагает. Таких автоматов как в руби мы вряд ли найдем (в руби прямо мега интеграция), но все же. Java, там автоматы есть прямо в спринге и многие про это не знают: spring.io/projects/sprin… интеграции с базой из коробки нет, но есть много другого
В PHP зависит от фреймворка. Symfony: из коробки symfony.com/doc/current/wo… Laravel: куча доп либ github.com/spatie/laravel…
Оу в PHP без фреймворков: github.com/yohang/Finite
Node.js github.com/jakesgordon/ja… почему-то не обновлялась давно(
За бортом остались зависимые автоматы, обработка в формах (можно подсмотреть в нашем опенсорсе), историчность, конкурентность, и куча других классных штук)
Обо всех этих вещах приглашаю поговорить в нашем комьюнити slack-ru.hexlet.io (больше 21 тысячи человек на секундочку!)

• • •

Missing some Tweet in this thread? You can try to force a refresh
 

Keep Current with Kirill

Kirill Profile picture

Stay in touch and get notified when new unrolls are available from this author!

Read all threads

This Thread may be Removed Anytime!

PDF

Twitter may remove this content at anytime! Save it as PDF for later use!

Try unrolling a thread yourself!

how to unroll video
  1. Follow @ThreadReaderApp to mention us!

  2. From a Twitter thread mention us with a keyword "unroll"
@threadreaderapp unroll

Practice here first or read more on our help page!

More from @mokevnin

19 Jul
Заждались тредов? Их есть у меня. Cегодня поговорим про такую мегаважную штуку как "идемпотентность", про то как она позволяет проектировать более надежные системы. Ретвитим, не стесняемся! Небольшой опрос. Насколько вы в курсе про идемпотентность?
Идемпотентность – это свойство какой-либо операции, например, вызова функции или выполнения HTTP-запроса. Операция считается идемпотентной, если повторные выполнения приводят к тому же результату что и первое выполнение. Рассмотрим кучку примеров из самых разных направлений
Возьмем команду mkdir в линуксе. Она создает директорию: mkdir jopa. Что будет если выполнить эту команду два раза? Во второй раз мы получим ошибку. То есть операция не идемпотентная. Тоже самое справедливо и для многих других команд работающих с файловой системой. Что дальше? Image
Read 17 tweets
7 Jul
На собеседовании я всегда начинаю разговор с вопроса "где вы сейчас работаете и чем там занимаетесь?". Вопрос простой, но при большой выборке скапливается довольно много интересных, смешных и грустных ответов. Ниже я расскажу о всяких забавных ситуациях и об идеальном ответе =>
Самое страшное когда говорят "начну с самого начала". Началом может оказаться школьные годы и долгий тернистый путь к себе настоящему. Однажды чувак мне сказал "щас я коротко про себя расскажу". Через 30 минут пришлось его останавливать
В любом случае, многие рассказывают про весь свой путь чуть ли не с самого первого дня работы программистом. Как собеседующий я бы хотел пропустить эту часть и говорить про текущую работу, так как это съедает кучу времени. Если понадобиться уйти в прошлое, то я задам вопрос.
Read 13 tweets
24 May
Через час-два тред про функции. Многим кажется, что функции это просто, но нет. Хорошие функции выглядят просто, но реализовать их тяжело. Какими руководствоваться правилами? Об этом и поговорим. #functions
Поехали! Обычно, от функций ожидают сокращения дублирования кода. Да, функции устраняют дублирование, но лишь в дополнение к тому, зачем они нужны. Настоящий смысл функции – повышение уровня абстракции. Звучит немного абстрактно, поэтому раскроем подробнее =>
Мир сложная штука, но эта сложность спрятана за простыми и понятными вещами. Например, работать с клавиатурой может даже ребенок, но лишь потому что она хорошо спроектирована и прячет от нас детали реализации. Нам не нужно знать физических законов для ее использования
Read 25 tweets
11 May
Метатред по серии "Автоматное программирование". Рассказываю тут про флаговое программирование, явно выделенное состояние, автоматы на бекенде, автоматы на фронтенде и кидаюсь кучей полезнях #FSM
1. Автоматы как способ моделировать процессы вокруг нас
2. Автоматы во фронтенде
Read 4 tweets
16 Apr
Вторая часть про Автоматное Программирование. Сегодня поговорим со стороны фронтенда, а следующим тредом про бекенд. Не забываем лайкнуть и пошарить, дабы добро дошло до всех уголков твиттера. Поехали! #fsm
Напомню что конечный автомат это удобная модель, с помощью которой естественным образом описываются процессы с дискретным состоянием. Простой пример – модальное окно. Оно может быть закрыто или открыто и его можно закрыть или открыть. 2 состояния, 2 перехода.
Состояния влияют на то что можно делать с объектом о котором идет речь, а переходы это собственно то что мы программируем. Кстати иногда возможны переходы в самого себя. Про это поговорим отдельно в бекенд истории.
Read 19 tweets
13 Apr
И так поехали тред про конечные автоматы (fsm, state machines). Одной из ключевых тем в разработке софта касающуюся всех программистов без исключения. Будет много примеров для разных языков. После этого треда вы, вероятно, увидите мир другими глазами. Лайк, шер, алишер, погнали!
Существует заблуждение что автоматы это что-то, из математики, не имеющее отношение к реальной жизни. Их используют в лексическом анализе для написания парсеров. Многие помнят лабы на си, где нужно было разбирать строчку. Да это тоже автоматы, но совсем другие.
Мы же поговорим об автоматах с точки зрения моделирования бизнес-процессов, которые мы программисты по большей части и программируем. Сразу предупрежу, что тема автоматов ну очень глубокая, они бывают совсем разные и к ним нужен разный подход. Поэтому что-то останется за кадром
Read 18 tweets

Did Thread Reader help you today?

Support us! We are indie developers!


This site is made by just two indie developers on a laptop doing marketing, support and development! Read more about the story.

Become a Premium Member ($3/month or $30/year) and get exclusive features!

Become Premium

Too expensive? Make a small donation by buying us coffee ($5) or help with server cost ($10)

Donate via Paypal Become our Patreon

Thank you for your support!

Follow Us on Twitter!

:(