Slide 1

Slide 1 text

Dependency Injection in Scala גࣜձࣾϑΝϯίϛϡχέʔγϣϯζ ੴ઒ ༟थ

Slide 2

Slide 2 text

Profile • ϑΝϯίϛೖࣾ4೥໨ • Scalaྺ2೥൒͘Β͍ (લ: Java, Ruby, Perl,PHP, etc.) • nend, nex8, viidleͷ഑৴γεςϜߏஙΛ୲౰ • ࠷ۙ͸ϒϩοΫνΣʔϯͷษڧΛͨ͠Γ ੴ઒ ༟थ Yuki Ishikawa

Slide 3

Slide 3 text

Dependency Injection (DI) ͱ͸Կ͔ʁ

Slide 4

Slide 4 text

Dependency Injection (DI) ͱ͸Կ͔ʁ ίϯϙʔωϯτؒͷґଘؔ܎ΛϓϩάϥϜͷ ιʔείʔυ͔Βഉআ͠ɺ֎෦ͷઃఆϑΝΠ ϧͳͲͰ஫ೖͰ͖ΔΑ͏ʹ͢Διϑτ΢ΣΞ ύλʔϯͰ͋Δɻ WikipediaΑΓ https://ja.wikipedia.org/wiki/ґଘੑͷ஫ೖ

Slide 5

Slide 5 text

"E$POUSPMMFS "E4FSWJDF "E4FSWJDF*NQM Dependency Injection (DI) ͱ͸Կ͔ʁ .PEVMF *OKFDUPS AdController: ޿ࠂϦΫΤετͷϋϯυϦϯά AdService: ࠷దͳ޿ࠂͷબग़ϩδοΫ

Slide 6

Slide 6 text

Dependency Injection (DI) ͱ͸Կ͔ʁ Manual DIʹΑΔ࣮૷ྫɻDIͷํ๏͸Կछྨ΋ଘࡏ͢Δ

Slide 7

Slide 7 text

Dependency Injection (DI) ͱ͸Կ͔ʁ Manual DIʹΑΔ࣮૷ྫɻDIͷํ๏͸Կछྨ΋ଘࡏ͢Δ wiring(഑ઢ)

Slide 8

Slide 8 text

Կ͕خ͍͠ͷ?

Slide 9

Slide 9 text

Կ͕خ͍͠ͷʁ ‣ ݁߹౓ͷ௿ԼɾίϯϙʔωϯτԽͷଅਐ ‣ ୯ମςετ͕͠΍͘͢ͳΔ

Slide 10

Slide 10 text

ScalaͰDI͢Δํ๏

Slide 11

Slide 11 text

• MacWire • Guice • Spring • Scaldi • SubCut • Freestyle
 (Free Monad & Taggless Final) Pure Scala Library • Manual DI • Cake Pattern • Reader Monad • Free Monad • Tagless Final ScalaͷDIύλʔϯ

Slide 12

Slide 12 text

͕࣌ؒ͋·Γແ͍ͷͰ • Manual DI • Cake Pattern • MacWire • Guice ͷ̐छྨΛ঺հ͠·͢ʂ

Slide 13

Slide 13 text

Manual DI (Constructor Injection) • ίϯετϥΫλҾ਺Λ࢖ͬͯख࡞ۀͰ഑ઢ • Ұ൪؆୯ʹDI͢Δํ๏

Slide 14

Slide 14 text

Manual DI (Constructor Injection) ख࡞ۀͰ഑ઢ͢Δ

Slide 15

Slide 15 text

Manual DI (Constructor Injection) ςετ͢Δͱ͖͸ܧঝͯ͠mock/stubͰ্ॻ͖͢Ε͹OK

Slide 16

Slide 16 text

Manual DI (Constructor Injection) Pros Cons • Ұ൪खܰʹ࢝ΊΒΕΔํ๏ • Compile-time DI • Pure Scala • ґଘؔ܎͕ଟ͍ͱ഑ઢ࡞ۀ͕ͭΒ͍ খن໛ͷϓϩδΣΫτͳΒManualͰे෼!!

Slide 17

Slide 17 text

Cake Pattern • ίϯετϥΫλҾ਺Λ࢖༻͠ͳ͍໘ന͍Ξϓϩʔν ‣ ࣗ෼ܕΞϊςʔγϣϯ΍ܧঝͰDI͢Δ • nendͰ࠾༻͍ͯ͠Δ • આ໌͕೉͍͠

Slide 18

Slide 18 text

Cake Pattern ίϯϙʔωϯτΛ࡞੒

Slide 19

Slide 19 text

Cake Pattern MixinͰΦϒδΣΫτΛ஫ೖ͢Δ

Slide 20

Slide 20 text

Cake Pattern Minimal Cake Pattern υϫϯΰΞΧ΢ϯτγεςϜͰ࠾༻͞Ε͍ͯΔख๏ ʢࣗ෼ܕΞϊςʔγϣϯ͕ొ৔͠ͳ͍ͷͰཧղ͠΍͍͢ʣ https://qiita.com/pab_tech/items/1c0bdbc8a61949891f1f

Slide 21

Slide 21 text

Cake Pattern Pros Cons • Compile-time DI • Pure Scala • େྔͷϘΠϥʔϓϨʔτ • ॊೈੑ͕௿͍ ‣ Component͕ΠϯελϯεΛ͔̍ͭ࣋ͯ͠ͳ͍ͷͰɺ2ͭͷಉ͡ ܕʹґଘͰ͖ͳ͍ • ύϑΥʔϚϯεɾίϯύΠϧ࣌ؒʹѱӨڹʁ(ະݕূ)

Slide 22

Slide 22 text

MacWire • Scala༻ϥΠϒϥϦ • ϚΫϩͰ഑ઢͯ͘͠ΕΔ • viidleͰ࠾༻͍ͯ͠Δ • Adam Warski͞Μ͕࡞ͬͯΔ ‣ ϒϩάͰScalaͷDIؔ࿈ͷهࣄΛެ։ͯ͠Δ ‣ ࠷ۙ͸sttpͱ͔࡞ͬͯΔ

Slide 23

Slide 23 text

MacWire wire͢Δ͚ͩͰɺ͋ͱ͸ϚΫϩ͕΍ͬͯ͘ΕΔ

Slide 24

Slide 24 text

MacWire wireSetͰෳ਺ΦϒδΣΫτͷSetԽ͕Մೳ

Slide 25

Slide 25 text

MacWire scala-commonͰλά෇͚͕Մೳ (λά෇͚ͨ͘͠ͳ͍৔߹͸Manual DIͱซ༻ͯ͠΋ྑ͍)

Slide 26

Slide 26 text

MacWire Pros Cons • ϘΠϥʔϓϨʔτ͕গͳ͍ • Compile-time DI • ϚΫϩ (ڧ͍ͯݴ͑͹)

Slide 27

Slide 27 text

Guice • Java༻DIϑϨʔϜϫʔΫ • ҆৺ͷGoogle੡ • ߴػೳͰग़དྷΔࣄ͕ଟ͍ • Runtime DI

Slide 28

Slide 28 text

Guice ஫ೖ͍ͤͨ͞ͱ͜Ζʹ @Inject Λ͚ͭΔ

Slide 29

Slide 29 text

Guice @ImplementedBy Ͱ࣮૷Λࢦఆ͢Δ or bind Ͱ഑ઢ͢Δ

Slide 30

Slide 30 text

Guice @Named, annotatedWithͰλά෇͚΋Մೳ

Slide 31

Slide 31 text

Guice @Named, annotatedWithͰλά෇͚΋Մೳ

Slide 32

Slide 32 text

Guice ProviderͰॊೈͳDI͕Մೳ

Slide 33

Slide 33 text

Guice Pros Cons • ߴػೳͰॊೈੑ͕ߴ͍ • ϘΠϥʔϓϨʔτ͕গͳ͍ • ࣮ߦ࣌ʹ഑ઢΛίϯτϩʔϧͰ͖Δ • JavaͰ࢖ͬͯͨਓʹ͸ೃછΈ΍͍͢ • Runtime DI • ֶशίετ͕ߴ͍

Slide 34

Slide 34 text

ͳʹΛ࢖͑͹ྑ͍͔ʁ

Slide 35

Slide 35 text

ԿΛ࢖͑͹ྑ͍͔ʁ ͓޷͖ͳͷΛͲ͏ͧ

Slide 36

Slide 36 text

͓͢͢Ί • ࠷ॳ͸Manual DI͔Β࢝ΊΔͷ͕Φεεϝ • Compile-time DIΛ࢖ͬͨ΄͏͕҆શ • Guice͸ڽͬͨࣄ͕͍ͨ͠৔߹ʹ