Slide 1

Slide 1 text

Почему код должен быть стильным? Владимир Дементьев, 19.03.2015

Slide 2

Slide 2 text

План — Что такое Style Guide? — Зачем и почему? — Как?

Slide 3

Slide 3 text

Style Guide Стилистический справочник или руководство по стилю — справочное издание с набором стандартов и обязательных для соблюдения требований при написании и оформлении статей в конкретном издании или при составлении документов в той или иной организации.

Slide 4

Slide 4 text

Rails Style Guide http://github.com/bbatsov/rails-style-guide

Slide 5

Slide 5 text

RSpec http://betterspecs.org/

Slide 6

Slide 6 text

Зачем все это?

Slide 7

Slide 7 text

1. Разработчикам легче понимать друг друга, когда они говорят на одном языке.

Slide 8

Slide 8 text

1. Разработчикам легче понимать друг друга, когда они говорят на одном языке. def some_kinda_fun a, even = false x = if even then a+1 else a end {:x => a, :y => x} end def some_kinda_fun(a, even: false) x = flag ? a+1 : a {x: a, y: x} end

Slide 9

Slide 9 text

1. Разработчикам легче понимать друг друга, когда они говорят на одном языке. unless user.active? || address.confirmed? ... end If !user.blank? … end

Slide 10

Slide 10 text

1. Разработчикам легче понимать друг друга, когда они говорят на одном языке. 2. История изменений содержит только изменения в логике, а не в форматировании.

Slide 11

Slide 11 text

1. Разработчикам легче понимать друг друга, когда они говорят на одном языке. 2. История изменений содержит только изменения в логике, а не в форматировании. 3. Новым членам команды проще влиться в процесс разработки.

Slide 12

Slide 12 text

1. Разработчикам легче понимать друг друга, когда они говорят на одном языке. 2. История изменений содержит только изменения в логике, а не в форматировании. 3. Новым членам команды проще влиться в процесс разработки. 4. Предупреждаем появление глупых ошибок.

Slide 13

Slide 13 text

4. Предупреждаем появление глупых ошибок. user = User.new user.name = "John" user.save redirect_to user

Slide 14

Slide 14 text

4. Предупреждаем появление глупых ошибок. user = User.new user.name = "John” user.save! puts user.id redirect_to user

Slide 15

Slide 15 text

4. Предупреждаем появление глупых ошибок. # плохо Client.where(“orders_count = #{params[:count]}”) # хорошо Client.where(“orders_count = ?”, params[:count])

Slide 16

Slide 16 text

4. Предупреждаем появление глупых ошибок. # плохо Client.where(“status != ?”, params[:status]) # хорошо Client.where.not(status: params[:status])

Slide 17

Slide 17 text

4. Предупреждаем появление глупых ошибок. # плохо Time.now # хорошо Time.zone.now

Slide 18

Slide 18 text

1. Разработчикам легче понимать друг друга, когда они говорят на одном языке. 2. История изменений содержит только изменения в логике, а не в форматировании. 3. Новым членам команды проще влиться в процесс разработки. 4. Предупреждаем появление глупых ошибок. 5. Пишем более быстрый код.

Slide 19

Slide 19 text

5. Пишем более быстрый код. # плохо If User.where(status: 1).length > 0 # хорошо User. where(status: 1).exists?

Slide 20

Slide 20 text

5. Пишем более быстрый код. # плохо my_arr.reverse.each { ... } my_arr.select { … }.first # хорошо my_arr.reverse_each { … } my_arr.detect { … }

Slide 21

Slide 21 text

Кто нас спасёт?

Slide 22

Slide 22 text

Кто нас спасёт?

Slide 23

Slide 23 text

Rubocop: Cops — Style – стиль кода (форматирование) Style/UnlessElse – не используй unless с else Style/TrailingWhitespace – избегай пробелов в конце строки Style/StringLiterals – использование ковычек (двойные или одинарные?)

Slide 24

Slide 24 text

Rubocop: Cops — Lint – синтаксис и плохие практики Lint/DuplicateMethods – проверяет на наличие повторяющихся методов Lint/RequireParentheses – не забывай про скобки в сложных условиях (if day.is? 'monday' && month == :jan) Lint/Debugger – не забудь удалить binding.pry

Slide 25

Slide 25 text

Rubocop: Cops — Metrics – различные метрики кода Metrics/LineLength – следит за длиной строки Metrics/BlockNesting – следит за глубиной ветвления Metrics/MethodLength – следит за числом строк в методе

Slide 26

Slide 26 text

Rubocop: Cops — Rails – специфические проверки для RoR Rails/HasAndBelongsToMany – предостерегает от использования HABTM в пользу has_many: :through Rails/Validation – ругается на использование old school валидаций (validate_presence_of, etc) Rails/TimeZone – ругается на использование временных функций без временной зоны

Slide 27

Slide 27 text

Rubocop: Cops — Performance – как сделать код быстрее Performance/Detect – используй detect вместо select.first Performance/ReverseEach – используй reverse_each вместо reverse.each Продолжение следует…

Slide 28

Slide 28 text

Rubocop: Custom Cops — RSpec (https://github.com/nevir/rubocop-rspec) RSpec/MultipleDescribes – должен быть только один describe верхнего уровня в файле RSpec/InstanceVariable – используй let(:user) {…} вместо before { @user = … }

Slide 29

Slide 29 text

Rubocop: Начало работы gem install rubocop # установили rubocop # запустили rubocop –l # только Lint копы rubocop –a # автоматическое исправление

Slide 30

Slide 30 text

Rubocop: Конфигурация ~/.rubocop.yml или project_dir/rubocop.yml или rubocop –c my_config.yml

Slide 31

Slide 31 text

Rubocop: Pre-commit hook http://gist.github.com/palkan/d3ea6692569a218a8743 ln –s rubocop_pre_commit.rb .git/hooks/pre-commit chmod +x .git/hooks/pre-commit

Slide 32

Slide 32 text

Кто нас спасёт? Hound – делает для вас стилистический Code Review

Slide 33

Slide 33 text

Hound CI – Ruby (Rubocop)

Slide 34

Slide 34 text

Hound CI – Ruby (Rubocop) – JavaScript (JSHint)

Slide 35

Slide 35 text

Hound CI – Ruby (Rubocop) – JavaScript (JSHint) – CoffeeScript (CoffeeLint)

Slide 36

Slide 36 text

Hound CI – Ruby (Rubocop) – JavaScript (JSHint) – CoffeeScript (CoffeeLint) – SCSS (SCSS-Lint)

Slide 37

Slide 37 text

Кто нас спасёт?

Slide 38

Slide 38 text

Вопросы