Slide 1

Slide 1 text

ΞεϖΫτࢦ޲ʹΑΔ ΞϓϦέʔγϣϯ֦ு yuuki.takezawa / ytake PHP conference kansai 2016

Slide 2

Slide 2 text

Agenda • OOPɺίϯϙʔωϯτʹΑΔ։ൃͷ࢟ • ΞεϖΫτࢦ޲͓͞Β͍ • ԣஅతͳؔ৺ࣄ ࣮ફͷώϯτ

Slide 3

Slide 3 text

OOPɺίϯϙʔωϯτʹΑΔ։ൃ

Slide 4

Slide 4 text

ϓϩάϥϜ͸Ͳ͏͋Δ΂͖͔ʁ • ίϯϙʔωϯτΛϕʔεʹγεςϜΛߏங͍ͯ͘͠Ұൠ తͳύλʔϯ • ΫϥεɺύοέʔδɺαʔϏεͳͲͷίϯϙʔωϯτʹ
 ཁٻΛׂΓ౰ͯͯߟ͑Δ • େମͷύλʔϯͰ͸ޮՌతʹίϯϙʔωϯτͱͯ͠࡞༻ • ޮՌతͰ͸ͳ͍ύλʔϯͱ͸ɺଞͷίϯϙʔωϯτʹ ӨڹΛ༩͑ͯ͠·͏΋ͷ͕෼཭Ͱ͖ͳ͍ύλʔϯͰ͋Γɺ େ͖ͳΞϓϦέʔγϣϯʹͳΕ͹ͳΔ΄Ͳ໰୊ʹ

Slide 5

Slide 5 text

ίϯϙʔωϯτ

Slide 6

Slide 6 text

database logger cache middleware request response config

Slide 7

Slide 7 text

ίϯϙʔωϯτ • ࣗ਎ͷ࣋ͭ಺༰͕ΧϓηϧԽ͞ΕɺӅṭ͞Ε͍ͯΔ • ίϯϙʔωϯτͷத਎Λ஌Δඞཁ͸ͳ͍ • ΠϯλʔϑΣʔεΛհͯ͠Ԡ౴͕ಘΒΕΕ͹ྑ͍ • ΠϯλʔϑΣʔεʹมߋ͕͋ͬͯ΋ɺಛఆͷ΋ͷ͚ͩʹ มߋ͕ՃΘΔ͚ͩͰྑ͍(ந৅ʹґଘ͍ͯ͠Δ΋ͷ)

Slide 8

Slide 8 text

No content

Slide 9

Slide 9 text

No content

Slide 10

Slide 10 text

ίϯϙʔωϯτʹΑΔΞϓϦέʔγϣϯߏங

Slide 11

Slide 11 text

͋ΔΞϓϦέʔγϣϯͷྫ

Slide 12

Slide 12 text

ސ٬ը໘ ঎඼༧໿ ༧໿ ελοϑ ঎඼ొ࿥ औѻఀࢭ ঎඼

Slide 13

Slide 13 text

γεςϜߏஙྫ • ސ٬ը໘ɺελοϑίϯϙʔωϯτ͸
 ৘ใΛࣔ͠ɺೖྗΛड͚෇͚Δ • ঎඼༧໿ɺ঎඼ొ࿥ɺऔѻఀࢭ͸
 ۀ຿ϩδοΫͱ੍ޚϩδοΫΛΧϓηϧԽ • ༧໿ɺ঎඼͸σʔλετΞʹ͋Δ৘ใΛอ࣋ • ͦΕͧΕͷίϯϙʔωϯτ͸ɺ໾ׂɺ੹຿Λ෼཭͠
 Ͳ͔͜ʹมߋ͕͋ͬͨ৔߹ʹ͓͍ͯ΋ɺ
 ద༻ੑͷߴ͍γεςϜߏங͕Ͱ͖Δ

Slide 14

Slide 14 text

ίϯϙʔωϯτͷݶքͱؔ৺ࣄ

Slide 15

Slide 15 text

ؔ৺ࣄͱ͸ • ϓϩάϥϜͷ͋Δػೳ΍ৼΔ෣͍ɺ໨త • ར֐ؔ܎ऀ͕ؔ৺Λ࣋ͭ͋ΒΏΔ΋ͷ • ར֐ؔ܎ؔ܎ऀͱ͸
 ΤϯυϢʔβʔɺεϙϯαʔɺ։ൃऀ
 ·ͨ͸ػೳཁٻɺઃܭ੍໿ͳͲ෯޿͍΋ͷ • Ωϟογϡ΍σʔλͷόοϑΝͳͲͷؔ৺ࣄ΋
 ར֐ؔ܎ऀͰ͋Δͱ͍͑Δ • ໰୊Λ෼ղͯ͠খ͘͢͞Δ͜ͱΛɺ
 ؔ৺ࣄͷ෼཭ͱ͍͏

Slide 16

Slide 16 text

ؔ৺ࣄͷ෼཭ • ͞·͟·ͳؔ৺ࣄΛͳΜΒ͔ͷϞδϡʔϧͱͯ͠෼཭͠ɺ ֤ϞδϡʔϧΛ։ൃΛ͓͜ͳ͏ͷ͕ཧ૝ • ͜ΕΒΛߏ੒ͯ͠ɺ׬શͳγεςϜΛੜΈग़͢ • ؔ৺ࣄͷ෼཭ͱϞδϡʔϧԽ͸ɺ
 ίΠϯͷදཪͷΑ͏ͳؔ܎Ͱ͋Γɺ
 ؔ৺ࣄΛϞδϡʔϧͱͯ͠෼཭͠ɺ
 Ϟδϡʔϧ͸ؔ৺ࣄͷղܾͱ࣮૷Λ୲౰͢Δؔ܎

Slide 17

Slide 17 text

෼཭ͷλΠϛϯά • ؔ৺ࣄͷ෼཭͸ɺγεςϜߏஙͷૣ͍ஈ֊Ͱ։͍࢝ͯ͠ ͳ͚Ε͹ͳΒͳ͍ • υϝΠϯϞσϧͷ࡞੒࣌΍ɺΫϥεઃܭ࣌ͳͲɺ
 ૣ͚Ε͹ૣ͍΄Ͳྑ͍͸ͣ • ؔ৺ࣄ͸෼཭͞ΕͨଞͷίϯϙʔωϯτͰ࣮ݱͰ͖Δ ΋ͷ΋͋Δ

Slide 18

Slide 18 text

ίϯϙʔωϯτʹΑΔղܾ͕೉͍͠΋ͷ • ॲཧʹ൐͏ϩΪϯάɺ෼ࢄॲཧɺτϥϯβΫγϣϯͳͲ
 ΞϓϦέʔγϣϯͷج൫తͳؔ৺ࣄ • ػೳཁ݅ʹ൐͏ɺϢʔεέʔεʹΑΔؔ৺ࣄ • ࢓༷௥ՃʹΑΔෳࡶԽ͢ΔΞϓϦέʔγϣϯͳͲ • ͜ΕΒΛԣஅతͳؔ৺ࣄͱݺͿ

Slide 19

Slide 19 text

֦ுͷ෼཭ෆೳ

Slide 20

Slide 20 text

֦ுͷ෼཭ෆೳͱ͸ • ֦ுͱ͸ɺج൫ͷ্ʹఆٛ͞ΕΔ΋ͷͰɺ
 ௥ՃαʔϏε΍ػೳΛද͢ • ྫ͑͹ɺ
 ঎඼༧໿ʹΩϟϯηϧ଴ͪϦετ͕ඞཁͳ৔߹
 ঎඼༧໿ͷ֦ுͱͳΔ • ෳࡶͳ໰୊Λཧղ͢ΔͨΊͷٕ๏ͳͷͰɺ
 ։ൃ࣌ʹ࣮ࡍʹಋೖͯ͠ΈΔͱྑ͍Ͱ͢

Slide 21

Slide 21 text

࣮ݱྫ • Ωϟϯηϧ଴ͪϦετίϯϙʔωϯτͷ࡞੒ • ঎඼༧໿ίϯϙʔωϯτʹɺ
 Ωϟϯηϧ଴ͪ΁ͷ઀ଓɺίʔϧΛ௥Ճ

Slide 22

Slide 22 text

Ωϟϯηϧ଴͕ͪෳࡶʹͳΔཧ༝ • ػೳ௥Ճ͞ΕΔલʹඞཁͰ͸ͳ͔ͬͨ΋ͷ͕௥Ճ • அยԽ͞ΕͨίʔυΛάϧʔίʔυɺ
 ͜ͷΑ͏ͳมߋΛׂΓࠐΈͱݺͿ • ܾࡁํ๏௥ՃͳͲ΋͜͏͍ͬͨάϧʔίʔυ͕ඞཁʹͳ Δͱ༧૝͞ΕΔ • ػೳ௥Ճͷ౓ʹಉ༷ͷίʔυ͕૿͑Δͱɺ
 ཧղ͠ʹ͘͘ͳΔ • ඇৗʹ͏·͘ઃܭ͞ΕͨγεςϜҎ֎͸ɺ֦ுϙΠϯτ Λݟ͚ͭΔ͜ͱ͸೉͍͠ͱ͍͑Δ

Slide 23

Slide 23 text

ίϯϙʔωϯτͷݶք

Slide 24

Slide 24 text

ΞεϖΫτΛ༻͍ͨղܾΛߟ͑Δ

Slide 25

Slide 25 text

ΞεϖΫτࢦ޲ͱ͸

Slide 26

Slide 26 text

Aspect Oriented Programming • OOPʹ୅ΘΔ΋ͷͰ͸ͳ͘ɺॊೈੑΛ࣋ͨͤΔ
 ϓϩάϥϛϯάύϥμΠϜ • separation of concerns ʢؔ৺ࣄͷ෼཭ʣ • ΞεϖΫτࢦ޲Λཧղ͢ΔͨΊʹ͢΂͖͜ͱ͸ɺ
 ΦϒδΣΫτࢦ޲Λ·ͣ஌Δ͜ͱ

Slide 27

Slide 27 text

ΞεϖΫτઐ໳༻ޠ • Weave(΢Οʔϒ)
 ΞεϖΫτΛద༻͢Δ͜ͱ • δϣΠϯϙΠϯτ
 ΞεϖΫτΛ΢Οʔϒ͢ΔϙΠϯτ • ϙΠϯτΧοτ
 δϣΠϯϙΠϯτΛ·ͱΊͨఆٛ • ΞυόΠε
 ΢Οʔϒ͢ΔΞεϖΫτͷॲཧఆٛ

Slide 28

Slide 28 text

δϣΠϯτϙΠϯτ • ͲͷΫϥεͷΠϯελϯε͕ੜ੒͞Εͨ࣌ • ͋ΔΫϥεͷಛఆͷϝιου͕࣮ߦ͞Εͨ࣌ • ͋ΔΫϥεͷϝιουͷ͏ͪಛఆͷϓϨϑΟοΫε͕෇ ͍͍ͯΔ΋ͷ͕࣮ߦ͞Εͨ࣌ • ͋ΔΫϥεΛܧঝͨ͠Ϋϥε͕࣮ߦ͞ΕΔ࣌
 
 ͳͲͳͲ
 *஫ҙ DIίϯςφͰղܾ͞ΕΔ΋ͷͰ͸ͳ͍

Slide 29

Slide 29 text

ϙΠϯτΧοτ • call
 ϝιουͷݺͼग़͠ɺίϯετϥΫλݺͼग़͠ • execution
 ϝιου࣮ߦɺίϯετϥΫλ࣮ߦ • handler
 ྫ֎ॲཧ • adviceexecution
 ΞυόΠε࣮ߦ

Slide 30

Slide 30 text

ΞυόΠε • before 
 δϣΠϯϙΠϯτൃੜલʹద༻ • after
 δϣΠϯϙΠϯτൃੜޙʹద༻ • around
 ݩͷॲཧΛஔ͖׵͑ͯ͠·͏৔߹΍ɺ
 ಛఆͷॲཧͰڬΈࠐΉ ᷖճॲཧ(go around)

Slide 31

Slide 31 text

ΞεϖΫτʹΑΔ֦ுͷ෼཭

Slide 32

Slide 32 text

঎඼༧໿ػೳͷྫ

Slide 33

Slide 33 text

঎඼༧໿ • ༧໿Մೳ਺Λ௒ա͍ͯ͠Ε͹ɺ
 γεςϜͰ͸༧໿͕Ͱ͖ͳ͍ɺͱͯ͠ϝοηʔδग़ྗ • ༧໿ՄೳͰ͋Ε͹ɺγεςϜͰ͸༧໿Λ࡞੒

Slide 34

Slide 34 text

makeReservation ߪೖՄೳݸ਺ͳ͠ ༧໿࡞੒

Slide 35

Slide 35 text

/** * @param $id * * @return mixed * @throws \Exception */ public function makeReservation($id) { if ($this->reserve->getQuantity($id)) { return $this->reserve->createReservation($id); } throw new \NoStockException(); }

Slide 36

Slide 36 text

঎඼༧໿(֦ு) • ೝՄ͞ΕͨϢʔβʔͷΈ͕༧໿Մೳͱ͢Δ • ༧໿Մೳ਺௒աͷ৔߹͸ɺ
 Ωϟϯηϧ଴ͪϦετ΁௥Ճ
 • ৼΔ෣͍Λ֦ு͢΂͖֦ுϙΠϯτΛࣝผ͢Δ • ௥ՃͷৼΔ෣͍Λఆٛ͢Δ

Slide 37

Slide 37 text

makeReservation ೝՄΤϥʔ ༧໿࡞੒ Ωϟϯηϧ଴ͪ΁

Slide 38

Slide 38 text

/** * @param $id * @WaitingList * @return mixed * @throws \Exception */ public function makeReservation($id) { if ($this->reserve->getQuantity($id)) { return $this->reserve->createReservation($id); } throw new \NoStockException(); }

Slide 39

Slide 39 text

/** * @param MethodInvoke $invoke * * @return object * @throws \Exception */ public function __invoke(MethodInvoke $invoke) { try { $result = $invoke->proceed(); }catch(\NoRoomException $e) { // Ωϟϯηϧ଴ͪϦετ΁ͷ௥Ճॲཧ } return $result; }

Slide 40

Slide 40 text

঎඼༧໿(֦ுྫ) • ྫͰ͸ɺ֦ுʹΑΔ΋ͭΕ߹͍Λൃੜͤͣ͞ʹɺ
 ৼΔ෣͍Λ௥Ճ͍ͯ͠·͢ɻ • ։ൃऀ͔ΒΈΔͱ࣮૷ίʔυʹΑΔมߋ͸ͳ͘ɺ
 ֦ு͸෼཭͞Ε͍ͯΔͱݴ͑Δঢ়ଶʹ͋Δ • ΞεϖΫτ͸ෳ਺ͷૢ࡞Λ֦ு͢Δ͜ͱ͕Ͱ͖·͢ɻ

Slide 41

Slide 41 text

ར֐ؔ܎ऀͷؔ৺ࣄΛཧղ

Slide 42

Slide 42 text

঎඼ߪೖɾ༧໿γεςϜγεςϜ ϑΟʔνϟʔચ͍ग़͠

Slide 43

Slide 43 text

঎඼ߪೖɾ༧໿γεςϜ • ސ٬͸঎඼Λ༧໿Ͱ͖Δ • ελοϑ͸঎඼ొ࿥ɺऔΓѻ͍ఀࢭΛૢ࡞Ͱ͖Δ • ؅ཧऀ͸ඪ४Ձ֨ͱظؒݶఆηʔϧͷઃఆ͕Ͱ͖Δ • ϝϯόʔձһ͸ɺϙΠϯτΛஷΊͯࢧ෷͍ʹར༻Ͱ͖Δ • ήετɺ๏ਓɺϝϯόʔձһͱ͍͏ސ٬λΠϓΛऔΓѻ͏ • γεςϜ͸web͔Βར༻Ͱ͖Δඞཁ͕͋Δ • γεςϜ͸RDBMSΛར༻ͯ͠σʔλΛอ࣋͢Δ • ؂ࠪͷͨΊɺ͢΂ͯͷॲཧ͸ϩάʹग़ྗ͢Δ
 etc…

Slide 44

Slide 44 text

ΞϓϦέʔγϣϯϢʔεέʔε

Slide 45

Slide 45 text

঎඼༧໿ Ωϟϯηϧ଴ͪ ϙΠϯτ֫ಘͱར༻ ঎඼ߪೖ ঎඼Ձ֨ઃఆ ݶఆηʔϧՁ֨ઃఆ extend extend extend

Slide 46

Slide 46 text

ϢʔεέʔεʹΑΔΞεϖΫτͷࣝผ • Ϣʔεέʔε͸࣮ݱ͢Δʹ͋ͨΓɺ
 ෳ਺ͷΫϥεɺίϯϙʔωϯτʹލΔԣஅతͳؔ৺ࣄ • ސ٬λΠϓʹӨڹΛड͚ͯɺ༷ʑͳϑϩʔ͕ੜ·ΕΔ
 ސ٬λΠϓผͷϙΠϯτ΍ɺ
 Ωϟϯηϧ଴ͪ༏ઌ౓ͳͲ΋͋Δ͔΋͠Ε·ͤΜ • ͜ΕΒ͸ԣஅతͰɺ֦ுϢʔεέʔεͱͳΔ

Slide 47

Slide 47 text

ϙΠϯτ࢒ߴ֬ೝ ϙΠϯτͰࢧ෷͏ ϙΠϯτ֫ಘ ϙΠϯτ֫ಘͱར༻ ঎඼ߪೖ extend after Advice around Advice

Slide 48

Slide 48 text

·ͱΊ • ར֐ؔ܎ऀΛཧղ • ༏Εͨઃܭ͸ɺਖ਼͍͠࢓༷ཧղ͔Β • ԣஅతؔ৺ࣄΛࣝผ͠ɺॊೈੑͷߴ͍ϓϩάϥϜ΁ • OOPʹ୅ΘΔ΋ͷͰ͸ͳ͍ • Java͚ͩͰ͸ͳ͍ʂ