Slide 1

Slide 1 text

©2018 Wantedly, Inc. YARDͰ࢝ΊΔ ੩తܕ෇͖Ruby 28.Jun.2018 - Nao Minami (@south37)

Slide 2

Slide 2 text

©2018 Wantedly, Inc. ࣗݾ঺հ

Slide 3

Slide 3 text

©2018 Wantedly, Inc. Nao Minami / @south37, @minami7o Infrastructure engineer @ Wantedly, Inc.

Slide 4

Slide 4 text

©2018 Wantedly, Inc. ಥવͰ͕͢ɻɻɻ

Slide 5

Slide 5 text

©2018 Wantedly, Inc.

Slide 6

Slide 6 text

©2018 Wantedly, Inc. 3VCZ,JHJ ྑ͔ͬͨͰ͢Ͷʂ

Slide 7

Slide 7 text

©2018 Wantedly, Inc. ৭ʑͳτʔΫ͕͋Γ·͕ͨ͠ɺ 4UFFQͱ͍͏ʮ੩తܕ෇͚πʔϧʯ͕ ҹ৅ʹ࢒Γ·ͨ͠

Slide 8

Slide 8 text

©2018 Wantedly, Inc.

Slide 9

Slide 9 text

©2018 Wantedly, Inc. 4UFFQͱ͸ w 3VCZʹରͯ͠੩తܕ෇͚͕ग़དྷΔπʔϧ w ܕఆٛϑΝΠϧͱ3VCZίʔυ͔ΒɺܕݕࠪΛߦ͏

Slide 10

Slide 10 text

©2018 Wantedly, Inc. 4UFFQͷܕఆٛϑΝΠϧ class Person @name: String @contacts: Array def initialize: (name: String) -> any def name: -> String def contacts: -> Array def guess_country: -> (String | nil) end

Slide 11

Slide 11 text

©2018 Wantedly, Inc. 4UFFQͷ1SPT$POT w 1SPT w 3VCZͰ੩తܕݕ͕ࠪग़དྷΔʂιϑτ΢ΣΞ։ൃͷॿ͚ʹͳͬͯ͘ΕΔʂ w $POT w ܕఆٛϑΝΠϧͷઐ༻จ๏Λ֮͑Δඞཁ͕͋Δ w ܕఆٛϑΝΠϧΛ͔Βॻ͘ͷ͕େมʂ w ATUFFQTDB⒎PMEAίϚϯυ͕ॿ͚ʹͳͬͯ͘ΕΔ͕ɻɻɻ

Slide 12

Slide 12 text

©2018 Wantedly, Inc. Կ͔ྑ͍ํ๏͸ແ͍͔ʁ

Slide 13

Slide 13 text

©2018 Wantedly, Inc. 3VCZͰܕͱ͍͑͹:"3%ʜ :"3%ͰܕνΣοΫΛߦ͑͹ྑ͍ͷ͸ʁ

Slide 14

Slide 14 text

©2018 Wantedly, Inc. ͱ͍͏͜ͱͰɺ πʔϧΛ࡞ͬͯΈͨ

Slide 15

Slide 15 text

©2018 Wantedly, Inc.

Slide 16

Slide 16 text

©2018 Wantedly, Inc.

Slide 17

Slide 17 text

©2018 Wantedly, Inc. ZBSETUFFQ

Slide 18

Slide 18 text

©2018 Wantedly, Inc.  എܠ  ZBSETUFFQͷ͝঺հ  ·ͱΊ ࠓ೔࿩͢಺༰

Slide 19

Slide 19 text

©2018 Wantedly, Inc. ZBSETUFFQͱ͸ w 3VCZϓϩάϥϜதͷ:"3%Ξϊʔςʔγϣϯ ͔Βɺ4UFFQͷܕఆٛϑΝΠϧΛࣗಈੜ੒ w 4UFFQͱ૊Έ߹ΘͤΔࣄͰɺ:"3%Ͱ੩తܕݕ ࠪΛ࣮ݱʂ

Slide 20

Slide 20 text

©2018 Wantedly, Inc. %&.0

Slide 21

Slide 21 text

©2018 Wantedly, Inc. 3VCZίʔυΛ༻ҙ͢Δ # lib/parser.rb class AST # @return [String] def to_s "AST" end # @param [Hash] opt def traverse!(opt) end end class Parser # @param [String] text # @param [Hash] opt # @return [AST] def parse(text, opt) ast = AST.new ast.traverse!(opt) ast end end

Slide 22

Slide 22 text

©2018 Wantedly, Inc. ZBSETUFFQίϚϯυΛ࣮ߦ $ yard2steep lib ZBSETUFFQͰܕఆٛϑΝΠϧΛੜ੒ # sig/parser.rbi class AST def to_s: -> String def traverse!: (Hash) -> any end class Parser def parse: (String, Hash) -> AST end

Slide 23

Slide 23 text

©2018 Wantedly, Inc. TUFFQͰܕνΣοΫ $ steep check lib ܕݕ͕ࠪ௨Ε͹ɺԿ΋ग़ྗ͞Εͳ͍

Slide 24

Slide 24 text

©2018 Wantedly, Inc. Ͱ͸ɺܕݕ͕ࣦࠪഊ͢Δέʔε͸Ͳ͏ͩΖ͏ʁ

Slide 25

Slide 25 text

©2018 Wantedly, Inc. ܕݕࠪͰࣦഊͤͯ͞ΈΔ # lib/parser.rb class AST # @return [String] def to_s "AST" end # @param [Hash] opt def traverse!(opt) end end class Parser # @param [String] text - # @param [Hash] opt + # @param [Hash, nil] opt # @return [AST] - def parse(text, opt) + def parse(text, opt: nil) ast = AST.new ast.traverse!(opt) ast end end

Slide 26

Slide 26 text

©2018 Wantedly, Inc. ܕݕࠪͰࣦഊͤͯ͞ΈΔ $ yard2steep lib && steep check lib lib/parser.rb:18:18: ArgumentTypeMismatch: receiver=::AST, expected=::Hash, actual=(::Hash | nil) (opt) ZBSETUFFQͱTUFFQΛ૊Έ߹ΘͤͯܕνΣοΫ ͪΌΜͱɺAOJMAνΣοΫ͍ͯ͠ͳ͍ίʔυͰΤϥʔ ͕ग़ͨʂ

Slide 27

Slide 27 text

©2018 Wantedly, Inc. :"3%Ͱ੩తܕݕ͕ࠪग़དྷͯΔʂ

Slide 28

Slide 28 text

©2018 Wantedly, Inc. ZBSETUFFQͷࠓޙʹ͍ͭͯ w ΍Γ͍ͨࣄ͸ͨ͘͞Μ w :"3%BOOPUBUJPOͷϦονͳه๏Λαϙʔτ w BUUS@ ͳͲɺ3VCZͷ૊ΈࠐΈͷNFUBQSPHSBNNJOHܥͷػೳΛTVQQPSU w 3VCZQBSTFSͷվળ ࣗલ࣮૷3JQQFSϕʔε΁Ҡߦ  w FUD w 4UFFQଆʹ΋DPOUSJCVUF͍ͨ͠ w CVJMUJONFUIPEͷܕ෇͚ w PQFODMBTTͷTVQQPSU w CVHpY ػೳ௥Ճ

Slide 29

Slide 29 text

©2018 Wantedly, Inc.  എܠ  ZBSETUFFQͷ͝঺հ  ·ͱΊ ࠓ೔࿩͢಺༰

Slide 30

Slide 30 text

©2018 Wantedly, Inc. ·ͱΊ w :"3%Ͱ੩తܕݕ͕ࠪͰ͖ΔΑ͏ʹͳͬͨʂ w 4UFFQͱZBSETUFFQΛ૊Έ߹ΘͤΔࣄͰ࣮ݱ w BOZܕ͕͋ΔͷͰɺগͣͭ͠ಋೖ͕Մೳ w ͜Ε͔Β΋ɺ3VCZͰ)BQQZ)BDLJOH͠Α͏ʂ

Slide 31

Slide 31 text

©2018 Wantedly, Inc.  എܠ  ZBSETUFFQͷ͝঺հ  ·ͱΊ  ͓·͚ ࠓ೔࿩͢಺༰

Slide 32

Slide 32 text

©2018 Wantedly, Inc. ͓·͚େมͩͬͨࣄ w 3VCZίʔυͷQBSTFSΛࣗલ࣮૷ w ίϯςΩετΛ೺Ѳ͢ΔͨΊʹFOEΛೝࣝ͢Δඞཁ͕͋ͬͯɺ͔ͳΓେมͩͬͨɻɻɻޙஔJG Ή͔͍ͣ͠ɻɻɻ w 3JQQFSTFYQͩͱίϝϯτ͕ফ͑ͯ͠·͏ͷͰࣗલʹ͕ͨ͠ɺ3JQQFSϕʔεʹҠߦ༧ఆʂ w 4UFFQͷڍಈ w ADMBTTTFMGA͕TVQQPSU͞Ε͍ͯͳ͔ͬͨΓɺCVJMUJODMBTT΁ͷܕ෇͚͕଍Γͳͯ͘खؒ औͬͨ w AJGdA΍ANBQ TUSJQ A͕͏·͘ಈ͔ͳ͔ͬͨΓɺAEFGOJM  CPPMA͕QBSTFFSSPS ʹͳͬͯۤ͠ΊΒΕͨ