Slide 1

Slide 1 text

Refactoring. Ruby edition. Anatoli Makarevich @makaroni4

Slide 2

Slide 2 text

Who am I?

Slide 3

Slide 3 text

Our projects look like

Slide 4

Slide 4 text

In next 15 minutes we will • spice up our knowledge about refactoring • look at some common smells • get acquainted with automated code analysis • become ready to refactor

Slide 5

Slide 5 text

Refactoring is but NOT writing tests changing code reducing complexity adding new features

Slide 6

Slide 6 text

Refactoring != Moving backwards

Slide 7

Slide 7 text

To grow fast you need to grow right.

Slide 8

Slide 8 text

What refactoring does? Complexity Readability Maintainability Extensibility

Slide 9

Slide 9 text

This is scientific! Martin Fowler, 1999

Slide 10

Slide 10 text

Your desk books are:

Slide 11

Slide 11 text

Code Smell Any symptom in the source code of a program that possibly indicates a deeper problem Kent Beck

Slide 12

Slide 12 text

Let’s smell it!

Slide 13

Slide 13 text

Code smells Long method Duplications Heavy class Stupid name Too many params Feature envy Ubercallback Complex conditions

Slide 14

Slide 14 text

Refactoring cycle Check test coverage Write tests if needed Change code Ensure that tests pass Check overall complexity

Slide 15

Slide 15 text

Find code smells Check test coverage Write tests if needed Change code Ensure that tests pass Check overall complexity

Slide 16

Slide 16 text

Check test coverage Check test coverage Write tests if needed Change code Ensure that tests pass Check overall complexity

Slide 17

Slide 17 text

Write new tests if needed Check test coverage Write tests if needed Change code Ensure that tests pass Check overall complexity

Slide 18

Slide 18 text

reFACTOR Check test coverage Write tests if needed Change code Ensure that tests pass Check overall complexity

Slide 19

Slide 19 text

Ensure that tests pass Check test coverage Write tests if needed Change code Ensure that tests pass Check overall complexity

Slide 20

Slide 20 text

Automate tests! Check test coverage Write tests if needed Change code Ensure that tests pass Check overall complexity Travis CI Jenkins CI Gitlab CI

Slide 21

Slide 21 text

Automate complexity analysis? Check test coverage Write tests if needed Change code Ensure that tests pass Check overall complexity

Slide 22

Slide 22 text

Could complexity analysis be automated?

Slide 23

Slide 23 text

? How can we process code?

Slide 24

Slide 24 text

s(:class, :Sexp, s(:const, :Array), s(:defn, :sexp_type, s(:args), s(:call, nil, :first)), s(:defn, :sexp_body, s(:args), s(:call, nil, :[], s(:lit, 1..-1)))) S-expressions

Slide 25

Slide 25 text

s(:class, :Sexp, s(:const, :Array), s(:defn, :sexp_type, s(:args), s(:call, nil, :first)), s(:defn, :sexp_body, s(:args), s(:call, nil, :[], s(:lit, 1..-1)))) Sexp operator

Slide 26

Slide 26 text

s(:class, :Sexp, s(:const, :Array), s(:defn, :sexp_type, s(:args), s(:call, nil, :first)), s(:defn, :sexp_body, s(:args), s(:call, nil, :[], s(:lit, 1..-1)))) Sexp body

Slide 27

Slide 27 text

Automated analysis • Long methods • Complex class • Stupid variable name

Slide 28

Slide 28 text

Long method s(:class, :Sexp, s(:const, :Array), s(:defn, :sexp_type, s(:args), s(:call, nil, :first)), s(:defn, :sexp_body, s(:args), s(:call, nil, :[], s(:lit, 1..-1)))) Find method Sexp :defn

Slide 29

Slide 29 text

Long method s(:class, :Sexp, s(:const, :Array), s(:defn, :sexp_type, s(:args), s(:call, nil, :first)), s(:defn, :sexp_body, s(:args), s(:call, nil, :[], s(:lit, 1..-1)))) Find method Sexp :defn Count sexp operators

Slide 30

Slide 30 text

Complex class s(:class, :Sexp, s(:const, :Array), s(:defn, :sexp_type, s(:args), s(:call, nil, :first)), s(:defn, :sexp_body, s(:args), s(:call, nil, :[], s(:lit, 1..-1)))) Find method Sexp :class

Slide 31

Slide 31 text

Complex class s(:class, :Sexp, s(:const, :Array), s(:defn, :sexp_type, s(:args), s(:call, nil, :first)), s(:defn, :sexp_body, s(:args), s(:call, nil, :[], s(:lit, 1..-1)))) Find method Sexp :class Cound weights of Sexp operators

Slide 32

Slide 32 text

Stupid variable name s(:class, :HomerSimpson, s(:const, :BlahBlahBlah), s(:defn, :donuts, s(:args), s(:call, nil, :fist)), s(:defn, :beersnstuff, s(:args), s(:call, nil, :[], s(:lit, 1..-1))))

Slide 33

Slide 33 text

Automated analysis

Slide 34

Slide 34 text

Refactoring != Rehacktoring @katrinyx

Slide 35

Slide 35 text

It is about perception We READ code, NOT COMPILE it.

Slide 36

Slide 36 text

After this talk do: • gem install flog • gem install flay • gem install reek • flog PROJECT_PATH • flay PROJECT_PATH • reek PROJECT_PATH

Slide 37

Slide 37 text

Let’s refactor! Anatoli Makarevich @makaroni4