Slide 1

Slide 1 text

RubyͰ࡞ΔSimpleͰEasyͳ DSL Burikaigi 2022 ϧʔϜϗλϧΠΧ OKURA Masafumi, 2022

Slide 2

Slide 2 text

Ruby DSL

Slide 3

Slide 3 text

DSLͱ͸ʁ

Slide 4

Slide 4 text

No content

Slide 5

Slide 5 text

Ҏ߱ͷ”DSL”͸ʮݴޠ಺DSLʯΛࢦ͢ ͜ͱͱ͠·͢

Slide 6

Slide 6 text

RubyͰॻ͔ΕͨDSLͷྫʢRuby಺Ͱͷར༻ʣ • Rake • RSpec • FactoryBot • Sinatra • Rails • ίʔϧόοΫɺόϦσʔγϣϯͳͲ

Slide 7

Slide 7 text

RSpecͷྫʢREADMEΑΓʣ

Slide 8

Slide 8 text

RubyͰॻ͔ΕͨDSLͷྫʢRuby֎Ͱͷར༻ʣ • Homebrew • Chef • Vagrant • Capistrano

Slide 9

Slide 9 text

HomebrewͷྫʢZoomͷCaskΑΓʣ

Slide 10

Slide 10 text

ݴޠ಺DSLͷϝϦοτ • ϓϩάϥϛϯάݴޠͷϑϧػೳ͕࢖͑Δ • ม਺΍ؔ਺ • ಡΉ͚ͩͳΒϓϩάϥϛϯάݴޠͷ஌͕ࣝෆཁ • ϓϩάϥϛϯάݴޠͱઃఆϑΝΠϧͷ͍͍ͱ͜औΓ

Slide 11

Slide 11 text

ࣗݾ঺հ • ໊લɿେ૔խ࢙ • ॴଐɿϑϦʔϥϯε • ՝֎׆ಈɿKaigi on RailsνʔϑΦʔΨφΠβʔɺGrow.rb/Entaku.rb ΦʔΨφΠβʔɺAlba࡞ऀ • ޷͖ͳRubyͷϝιουɿinstance_evalʢ2೥લͷൃදΛࢀরʣ

Slide 12

Slide 12 text

Alba • JSONγϦΞϥΠβʢ೚ҙͷΦϒδΣΫτΛJSONʹม׵ʣ • ଎͍ʢྨࣅͷgemͱൺ΂ͯ΋2൪໨ʹ଎͍ʣ • ໿300ms͔͔͍ͬͯͨAPIΛ໿100ms·Ͱߴ଎Խͨ͠Γ • Ϣʔβʔ͕DSLΛॻ͘ͱAlba͕ͦΕʹैͬͯΦϒδΣΫτ͔ΒଐੑΛऔಘ ͯ͠JSONΛߏங͢Δ • ৄࡉ͸ https://github.com/okuramasafumi/alba Λࢀর

Slide 13

Slide 13 text

ࠓ೔ͷൃද ͷߏ੒

Slide 14

Slide 14 text

ೋ෦ߏ੒ • ୈҰ෦ɿDSLʹؔ͢Δཧ࿦తߟ࡯ • RubyͱDSLɺϑΣʔζͷ෼཭ͳͲ • ୈೋ෦ɿDSLΛ࡞ͬͯΈΔ • ؆୯ͳDSLΛ࡞ͬͯΈΔ • ࣮૷͕SimpleͰ࢖͍ํ͕EasyͳDSLΛ࡞Δ • λΠτϧճऩ

Slide 15

Slide 15 text

ୈҰ෦ɿ DSLʹ͍ͭͯͷ ߟ࡯

Slide 16

Slide 16 text

ͳͥRubyͰ DSLΛॻ͘ͷ͔

Slide 17

Slide 17 text

RubyͰDSLΛॻ͘ཧ༝ • τοϓϨϕϧʢRubyͰ͸”main”ʣʹϝιουΛఆٛ͠΍͍͢ • ϝιουͷׅހ͕লུͰ͖ΔͷͰݟͨ໨͕ӳจͬΆ͘ͳΓ΍͍͢ • => ಡΈ΍͍͢ • ωετͨ͠ϒϩοΫͱ”eval”଒ϝιουͷ૊Έ߹ΘͤΛ࢖͏͜ͱͰෳ ࡶͳϩδοΫ΋දݱͰ͖Δ • => ॻ͖΍͍͢

Slide 18

Slide 18 text

ٯʹݴ͏ͱ • DSL͸୯ͳΔϝιουʢಛʹΫϥεϝιουʣ • eval଒ͱϒϩοΫͷ࢖͍ํ͑͞Θ͔Ε͹DSL͸࡞ΕΔʂ

Slide 19

Slide 19 text

Rubyʹ͓͚ΔDSLͷ෼ྨʹ͍ͭͯ • “main”ύλʔϯɿ”main”ʹ௚઀ϝιουΛఆٛ͢Δύλʔϯ • Rake, SinatraͳͲ • “include”ύλʔϯɿϞδϡʔϧ಺ʹσʔλͱϩδοΫΛू໿͠ɺ`include`΍`extend`͠ ͨΫϥε͕ͦΕʹΞΫηεͰ͖Δύλʔϯ • Railsͷଟ͘ͷDSL • ಠཱύλʔϯɿϞδϡʔϧΛ`include`͠ͳͯ͘΋DSLΛ࢖͑Δ • RSpec, FactoryBotͳͲ

Slide 20

Slide 20 text

DSLͷ࣮૷্ͷίπ • ʮఆٛɾొ࿥ʯʮࢦఆʯʮ࣮ߦʯͷϑΣʔζ͕෼͔Ε͍ͯΔͨΊɺ͜ ΕΒΛ͔ͬ͠Γ෼཭্ͭͭ͠खʹ݁߹͢Δ • ʮఆٛɾొ࿥ʯϑΣʔζͰ͸ʮ࣮ߦʯϑΣʔζͰߦ͍͍ͨ͜ͱΛొ࿥ ͍ͯ͘͠ • ʮࢦఆʯϑΣʔζͰ͸ʮఆٛɾొ࿥ʯ͞Εͨ΋ͷ͔Βࠓճద༻͍ͨ͠ ΋ͷΛࢦఆ͢Δ • ʮ࣮ߦʯϑΣʔζͰ͸ʮࢦఆʯ͞Εͨ΋ͷΛ࣮ߦ͢Δ

Slide 21

Slide 21 text

ݱ࣮ͷDSLʹ͓͚ΔϑΣʔζͷ෼཭ ఆٛ ࢦఆ ࣮ߦ 3BLF UBTL EFGBVMUͳͲ SBLFίϚϯυ 34QFD EFTDSJCF JUͳͲ STQFDίϚϯυ 3BJMTόϦσʔγϣϯ A"DUJWF.PEFM7BMJEBUPSAΫ ϥεΛܧঝͨ͠Ϋϥεͷ࡞੒ WBMJEBUFTϝιου WBMJE ϝιου "MCB A"MCB3FTPVSDFAϞδϡʔϧ ΛAJODMVEFA͔ͯ͠Β ABUUSJCVUFTAͳͲ Ϋϥεબ୒ TFSJBMJ[Fϝιου

Slide 22

Slide 22 text

ࠓճ࡞ΔDSLʹ͍ͭͯ • ΍Γ͍ͨ͜ͱɿRailsͷόϦσʔγϣϯͷ؆қ൛ • ࣮૷ɿϞδϡʔϧΛ`include`͢ΔͱɺΫϥεϝιουͷ`.validates`ͱ Πϯελϯεϝιουͷ`#validate`͕ར༻ՄೳʹͳΔ • `.validates`ʹ͸όϦσʔλͷ໊લͱΦϓγϣϯΛ౉͢ɺ͢ΔͱόϦ σʔλ͕Ϋϥεʹొ࿥͞ΕΔ • `#validate`͸ࣗ਎ͷΫϥεʹొ࿥͞ΕͨόϦσʔλΛ࣮ߦ͢Δ

Slide 23

Slide 23 text

ʢଓʣࠓճ࡞ΔDSLʹ͍ͭͯ • ॳظঢ়ଶͰ͸όϦσʔλ͕ଘࡏ͠ͳ͍ͨΊɺ`.validator`ϝιουͰఆ ͍ٛͯ͘͠ • ޙͰ`.validates`Ͱࢦఆ͢ΔͨΊͷ໊લͱɺϩδοΫʢόϦσʔγϣ ϯͷ಺༰ʣΛఆٛ͢Δ • ϩδοΫ͸ϒϩοΫͰఆٛ͢Δɺ͜ͷͱ͖ର৅ͷΦϒδΣΫτͱඞ ཁͳ஋ʢ௕͞ΛόϦσʔτ͢ΔͳΒͦͷ਺ࣈʣΛड͚औΔ

Slide 24

Slide 24 text

͓·͚ͷߟ࡯ • ϓϩάϥϛϯάͰ͸ʮߏ଄ʯͱʮৼΔ෣͍ʯͷ2͕ͭॏཁ • cf. σβΠϯύλʔϯͷ෼ྨ • ʮఆٛɾొ࿥ʯͱʮࢦఆʯ͸ߏ଄Ͱʮ࣮ߦʯ͸ৼΔ෣͍ • ߏ଄͸੩తͰৼΔ෣͍͸ಈతɺͱ΋͍͑Δ • DSLΛ࢖͏ͱߏ଄ͱৼΔ෣͍Λࣗવʹ෼཭Ͱ͖ͯݟ௨͕͠ྑ͘ͳΔ

Slide 25

Slide 25 text

ୈೋ෦ɿ ࣮ࡍʹDSLΛ ࡞ͬͯΈΑ͏ʂ

Slide 26

Slide 26 text

ΤσΟλ͕։ ͖·͢