Slide 1

Slide 1 text

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

Slide 19

Slide 19 text

Договоренности Код по понятиям

Slide 20

Slide 20 text

Договоренности validates_presence_of :name after_filter :send_email expect(results).to match_array(%w(foo bar))

Slide 21

Slide 21 text

Приятный, читабельный код Код для людей, не для компилятора

Slide 22

Slide 22 text

Приятный, читабельный код 2 5.times { print "Odelay!" } exit unless "restaurant".include? "aura" ['toast', 'cheese', 'wine'].each { |food| print food.capitalize } 2 http://poignant.guide/book/chapter-3.html

Slide 23

Slide 23 text

Истина в Runtime

Slide 24

Slide 24 text

Истина в 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]