A polyglot's view of
Ruby & Rails
или "Кому нужны рельсы в 2018?"
Leonid Shevtsov · Ruby Meditation · May 2018 · Dnipro
Slide 2
Slide 2 text
Привет!
Меня зовут Леня, и я не фанат Ruby
Slide 3
Slide 3 text
Привет!
Меня зовут Леня, и я не фанат Ruby
→ Десять лет назад я был им очарован
Slide 4
Slide 4 text
Привет!
Меня зовут Леня, и я не фанат Ruby
→ Десять лет назад я был им очарован
→ Лет шесть назад я его ненавидел
Slide 5
Slide 5 text
Привет!
Меня зовут Леня, и я не фанат Ruby
→ Десять лет назад я был им очарован
→ Лет шесть назад я его ненавидел
→ Я долго искал ему замену
Slide 6
Slide 6 text
Я долго искал ему замену
(это сейчас модно, да?)
Slide 7
Slide 7 text
Я долго искал ему замену
(это сейчас модно, да?)
→ Scala
Slide 8
Slide 8 text
Я долго искал ему замену
(это сейчас модно, да?)
→ Scala
→ Clojure
Slide 9
Slide 9 text
Я долго искал ему замену
(это сейчас модно, да?)
→ Scala
→ Clojure
→ Elixir
Slide 10
Slide 10 text
Я долго искал ему замену
(это сейчас модно, да?)
→ Scala
→ Clojure
→ Elixir
→ Golang
Slide 11
Slide 11 text
Я долго искал ему замену
(это сейчас модно, да?)
→ Scala
→ Clojure
→ Elixir
→ Golang
→ F#
Slide 12
Slide 12 text
Я долго искал ему замену
(это сейчас модно, да?)
→ Scala
→ Clojure
→ Elixir
→ Golang
→ F#
→ Node.js
Slide 13
Slide 13 text
Вообще,
крайне полезно пробовать языки
программирования, отличные от своего
основного
Slide 14
Slide 14 text
Но к Ruby я вернулся
Ruby · Golang · JavaScript
Slide 15
Slide 15 text
Но к Ruby я вернулся
Ruby · Golang · JavaScript
Slide 16
Slide 16 text
Материальные свойства Ruby
Slide 17
Slide 17 text
Простота
Минимум правил
Slide 18
Slide 18 text
Простота 1
# The famous Hello World
# Program is trivial in
# Ruby. Superfluous:
#
# * A "main" method
# * Newline
# * Semicolons
#
# Here is the Code:
puts "Hello World!"
1 https://ruby-lang.org
Истина в Runtime
class User < ApplicationRecord
# поля????
end
vs
$> rails console
> User.methods
=> [:id, :name, :email, ...]
Slide 25
Slide 25 text
Быстрая разработка
Редактирование на лету
Slide 26
Slide 26 text
Быстрая разработка
$> heroku run rails console
# Copy + Paste
> class User
def buggy_method
# fixed implementation goes here
end
end
> User.where(buggy: true).each(&:buggy_method)
Slide 27
Slide 27 text
Свойства Ruby
→ Простота
→ Договоренности
→ Приятный, читабельный код
→ Истина в Runtime
→ Быстрая разработка
Slide 28
Slide 28 text
Ruby · Golang · JavaScript
Slide 29
Slide 29 text
Простота + Договоренности + Быстрая разработка
=
Проекты, в которых логика и особенно схема данных еще не
выяснены.
Slide 30
Slide 30 text
Простота + Договоренности
=
Интеграционные тесты
(для проектов на других языках)
Slide 31
Slide 31 text
Простота + Договоренности + Runtime
=
Язык конфигурации для систем
Slide 32
Slide 32 text
Читабельный код + Runtime
=
Скрипты
Slide 33
Slide 33 text
Ruby
Slide 34
Slide 34 text
Ruby
Логика и схема данных известны
Slide 35
Slide 35 text
Ruby
Ограниченный технический бюджет
Slide 36
Slide 36 text
Ruby
Конкурентное программирование
Slide 37
Slide 37 text
Ruby, который я люблю
Slide 38
Slide 38 text
Ruby, который я люблю
cвято следует рубокопу
Slide 39
Slide 39 text
Ruby, который я люблю
cвято следует рубокопу
Метрики:
→ длина строки
→ длина метода
→ длина модуля
→ сложность
→ число аргументов
Slide 40
Slide 40 text
Ruby, который я люблю
состоит из небольших модулей
Slide 41
Slide 41 text
Ruby, который я люблю
состоит из небольших модулей
→ но только не миксинов!
Slide 42
Slide 42 text
Ruby, который я люблю
использует dependency injection
Slide 43
Slide 43 text
Ruby, который я люблю
использует dependency injection
→ Паттерн "Functional with configuration"
Slide 44
Slide 44 text
Ruby, который я люблю
не хранит состояние
Slide 45
Slide 45 text
Ruby, который я люблю
не хранит состояние
→ особенно в Rails
Slide 46
Slide 46 text
Ruby, который я люблю
покрыт простыми тестами
Slide 47
Slide 47 text
Ruby, который я люблю
не злоупотребляет "паттернами"
Slide 48
Slide 48 text
Ruby, который я люблю
не злоупотребляет метапрограммированием
Slide 49
Slide 49 text
Ruby, который я люблю
изолирует мутирующий код
Slide 50
Slide 50 text
Ruby, который я люблю
хорошо документирован
Slide 51
Slide 51 text
Ruby, который я люблю
хорошо документирован
→ манкипатчинг
→ хаки
→ "...я бы обыкновенно написал XXX, но тут такое дело,
что я лучше напишу YYY..."
→ напиши это комментарием!
Slide 52
Slide 52 text
Ruby, который я люблю
→ Свято следует рубокопу
→ Состоит из небольших модулей
→ Использует dependency injection
→ Не использует состояния
→ Простые (благодаря DI) тесты
→ Не злоупотребляет паттернами
→ Не злоупотребляет метапрограммированием
→ Мутирующий код изолирован и легко читабелен
→ Манкипатчинг четко задокументирован
Slide 53
Slide 53 text
Rails, которые я люблю
Slide 54
Slide 54 text
Rails, которые я люблю
Минимум кода в моделях
Slide 55
Slide 55 text
Rails, которые я люблю
Минимум кода в моделях
→ валидаторы
→ жизненный цикл
→ ассоциации
→ скоупы
Slide 56
Slide 56 text
Rails, которые я люблю
Минимум кода в контроллерах
Slide 57
Slide 57 text
Rails, которые я люблю
Минимум кода в контроллерах
→ проверка параметров
→ генереция вивода
Slide 58
Slide 58 text
Rails, которые я люблю
Бизнес-логика в модулях
Slide 59
Slide 59 text
Rails, которые я люблю
Бизнес-логика в модулях
→ Rails - это только Web
→ Рулите вашим app/*!
Slide 60
Slide 60 text
Rails, которые я люблю
Доступ к базе из одного места
Slide 61
Slide 61 text
Rails, которые я люблю
Доступ к базе из одного места
class User < ApplicationRecord
has_many :posts
has_one :latest_post,
class_name: 'Post',
-> { order('created_at DESC') }
end
User.limit(10).includes(:latest_post)
Slide 62
Slide 62 text
Rails, которые я люблю
Вьюха на React
Slide 63
Slide 63 text
Rails, которые я люблю
Вьюха на React
(то есть рельсовой вьюхи и нет) !
Slide 64
Slide 64 text
Rails, которые я люблю
Тесты на RSpec
Slide 65
Slide 65 text
Rails, которые я люблю
Тесты на RSpec
→ простые
→ особенно для бизнес-логики
Slide 66
Slide 66 text
Rails, которые я люблю
Capybara+Chrome
Slide 67
Slide 67 text
Rails, которые я люблю
Capybara+Chrome
→ самый "надежный" современный вариант
→ headless mode
Slide 68
Slide 68 text
Rails, которые я люблю
→ Минимум кода в моделях
→ Минимум кода в контроллерах
→ Доступ к базе из одного места
→ Бизнес-логика в модулях
→ Вьюха на React
→ Тесты на RSpec
→ Capybara+Chrome
Slide 69
Slide 69 text
Что бы я хотел в видеть в Ruby
→ Автоформатирование кода
→ Статическую типизацию
Slide 70
Slide 70 text
Спасибо! Вопросы?
подписывайтесь на RSS:
http://l-s.me
пишите письма:
[email protected]