$30 off During Our Annual Pro Sale. View Details »

A polyglot's view of Ruby and Rails

A polyglot's view of Ruby and Rails

Зачем писать на Ruby и Rails в 2018, что писать, и как писать

Leonid Shevtsov

May 19, 2018
Tweet

More Decks by Leonid Shevtsov

Other Decks in Programming

Transcript

  1. A polyglot's view of Ruby & Rails или "Кому нужны

    рельсы в 2018?" Leonid Shevtsov · Ruby Meditation · May 2018 · Dnipro
  2. Привет! Меня зовут Леня, и я не фанат Ruby

  3. Привет! Меня зовут Леня, и я не фанат Ruby →

    Десять лет назад я был им очарован
  4. Привет! Меня зовут Леня, и я не фанат Ruby →

    Десять лет назад я был им очарован → Лет шесть назад я его ненавидел
  5. Привет! Меня зовут Леня, и я не фанат Ruby →

    Десять лет назад я был им очарован → Лет шесть назад я его ненавидел → Я долго искал ему замену
  6. Я долго искал ему замену (это сейчас модно, да?)

  7. Я долго искал ему замену (это сейчас модно, да?) →

    Scala
  8. Я долго искал ему замену (это сейчас модно, да?) →

    Scala → Clojure
  9. Я долго искал ему замену (это сейчас модно, да?) →

    Scala → Clojure → Elixir
  10. Я долго искал ему замену (это сейчас модно, да?) →

    Scala → Clojure → Elixir → Golang
  11. Я долго искал ему замену (это сейчас модно, да?) →

    Scala → Clojure → Elixir → Golang → F#
  12. Я долго искал ему замену (это сейчас модно, да?) →

    Scala → Clojure → Elixir → Golang → F# → Node.js
  13. Вообще, крайне полезно пробовать языки программирования, отличные от своего основного

  14. Но к Ruby я вернулся Ruby · Golang · JavaScript

  15. Но к Ruby я вернулся Ruby · Golang · JavaScript

  16. Материальные свойства Ruby

  17. Простота Минимум правил

  18. Простота 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
  19. Договоренности Код по понятиям

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

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

  22. Приятный, читабельный код 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
  23. Истина в Runtime

  24. Истина в Runtime class User < ApplicationRecord # поля???? end

    vs $> rails console > User.methods => [:id, :name, :email, ...]
  25. Быстрая разработка Редактирование на лету

  26. Быстрая разработка $> heroku run rails console # Copy +

    Paste > class User def buggy_method # fixed implementation goes here end end > User.where(buggy: true).each(&:buggy_method)
  27. Свойства Ruby → Простота → Договоренности → Приятный, читабельный код

    → Истина в Runtime → Быстрая разработка
  28. Ruby · Golang · JavaScript

  29. Простота + Договоренности + Быстрая разработка = Проекты, в которых

    логика и особенно схема данных еще не выяснены.
  30. Простота + Договоренности = Интеграционные тесты (для проектов на других

    языках)
  31. Простота + Договоренности + Runtime = Язык конфигурации для систем

  32. Читабельный код + Runtime = Скрипты

  33. Ruby

  34. Ruby Логика и схема данных известны

  35. Ruby Ограниченный технический бюджет

  36. Ruby Конкурентное программирование

  37. Ruby, который я люблю

  38. Ruby, который я люблю cвято следует рубокопу

  39. Ruby, который я люблю cвято следует рубокопу Метрики: → длина

    строки → длина метода → длина модуля → сложность → число аргументов
  40. Ruby, который я люблю состоит из небольших модулей

  41. Ruby, который я люблю состоит из небольших модулей → но

    только не миксинов!
  42. Ruby, который я люблю использует dependency injection

  43. Ruby, который я люблю использует dependency injection → Паттерн "Functional

    with configuration"
  44. Ruby, который я люблю не хранит состояние

  45. Ruby, который я люблю не хранит состояние → особенно в

    Rails
  46. Ruby, который я люблю покрыт простыми тестами

  47. Ruby, который я люблю не злоупотребляет "паттернами"

  48. Ruby, который я люблю не злоупотребляет метапрограммированием

  49. Ruby, который я люблю изолирует мутирующий код

  50. Ruby, который я люблю хорошо документирован

  51. Ruby, который я люблю хорошо документирован → манкипатчинг → хаки

    → "...я бы обыкновенно написал XXX, но тут такое дело, что я лучше напишу YYY..." → напиши это комментарием!
  52. Ruby, который я люблю → Свято следует рубокопу → Состоит

    из небольших модулей → Использует dependency injection → Не использует состояния → Простые (благодаря DI) тесты → Не злоупотребляет паттернами → Не злоупотребляет метапрограммированием → Мутирующий код изолирован и легко читабелен → Манкипатчинг четко задокументирован
  53. Rails, которые я люблю

  54. Rails, которые я люблю Минимум кода в моделях

  55. Rails, которые я люблю Минимум кода в моделях → валидаторы

    → жизненный цикл → ассоциации → скоупы
  56. Rails, которые я люблю Минимум кода в контроллерах

  57. Rails, которые я люблю Минимум кода в контроллерах → проверка

    параметров → генереция вивода
  58. Rails, которые я люблю Бизнес-логика в модулях

  59. Rails, которые я люблю Бизнес-логика в модулях → Rails -

    это только Web → Рулите вашим app/*!
  60. Rails, которые я люблю Доступ к базе из одного места

  61. 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)
  62. Rails, которые я люблю Вьюха на React

  63. Rails, которые я люблю Вьюха на React (то есть рельсовой

    вьюхи и нет) !
  64. Rails, которые я люблю Тесты на RSpec

  65. Rails, которые я люблю Тесты на RSpec → простые →

    особенно для бизнес-логики
  66. Rails, которые я люблю Capybara+Chrome

  67. Rails, которые я люблю Capybara+Chrome → самый "надежный" современный вариант

    → headless mode
  68. Rails, которые я люблю → Минимум кода в моделях →

    Минимум кода в контроллерах → Доступ к базе из одного места → Бизнес-логика в модулях → Вьюха на React → Тесты на RSpec → Capybara+Chrome
  69. Что бы я хотел в видеть в Ruby → Автоформатирование

    кода → Статическую типизацию
  70. Спасибо! Вопросы? подписывайтесь на RSS: http://l-s.me пишите письма: leonid@shevtsov.me