Slide 1

Slide 1 text

ɹ!shin1x1 2016/05/21 1)1ΧϯϑΝϨϯε෱Ԭ ੍໿ͰίʔυʹடংΛ

Slide 2

Slide 2 text

੍໿ͱ͸

Slide 3

Slide 3 text

੍ݶ΍৚݅Λ͚ͭͯ ࣗ༝ʹ׆ಈͤ͞ͳ͍͜ͱ https://kotobank.jp/word/%E5%88%B6%E7%B4%84-546519

Slide 4

Slide 4 text

੍ݶ΍৚݅Λ͚ͭͯ ࣗ༝ʹ׆ಈͤ͞ͳ͍͜ͱ https://kotobank.jp/word/%E5%88%B6%E7%B4%84-546519

Slide 5

Slide 5 text

ࠓ೔ͷ୊ࡐ

Slide 6

Slide 6 text

&$αΠτ γϣοϐϯάΧʔτ

Slide 7

Slide 7 text

Χʔτʹ௥Ճ

Slide 8

Slide 8 text

ΧʔτΛදࣔ

Slide 9

Slide 9 text

Χʔτʹ঎඼Λ௥Ճ

Slide 10

Slide 10 text

D .BTBTIJ4IJOCBSB!TIJOY Χʔτʹ঎඼Λ௥Ճ wΧʔτ$BSUΫϥε w঎඼*UFNΫϥε w$BSUJUFNTʹ঎඼Λ௥Ճ

Slide 11

Slide 11 text

*UFN class Item
 {
 public $code;
 public $price;
 
 public function __construct(string $code, int $price)
 {
 $this->code = $code;
 $this->price = $price;
 }
 }

Slide 12

Slide 12 text

$BSU class Cart
 {
 public $items;
 
 public function __construct()
 {
 $this->items = [];
 }
 
 public function calculateTotalPrice(): int
 {
 $totalPrice = 0;
 
 foreach ($this->items as $item) {
 $totalPrice = $totalPrice + $item->price;
 }
 
 return $totalPrice;
 }
 }

Slide 13

Slide 13 text

D .BTBTIJ4IJOCBSB!TIJOY ঎඼௥ՃΛ*UFNΫϥεʹݶఆ w$BSUJUFNTΛQSJWBUFͰӅ͢ wBEE*UFNϝιουΛ௥Ճ wλΠϓώϯςΟϯάͰ*UFNΫϥεʹݶఆ

Slide 14

Slide 14 text

$BSU class Cart
 {
 private $items;
 
 public function __construct()
 {
 $this->items = [];
 }
 
 public function addItem(Item $item)
 {
 $this->items[] = $item;
 }
 (snip) } QSJWBUF λΠϓώϯςΟϯά

Slide 15

Slide 15 text

D .BTBTIJ4IJOCBSB!TIJOY ΞΫηεम০ࢠλΠϓώϯςΟϯά wΫϥεࣗ਎͕ϓϩύςΟΛίϯτϩʔϧ wΫϥε֎ʹίϯτϩʔϧΛ౉͞ͳ͍ wૢ࡞ํ๏Λݶఆ͍ͯ͠Δ͔Βͦ͜
 ίϯτϩʔϧͰ͖Δ
 ʢλΠϓώϯςΟϯάͳͲʣ

Slide 16

Slide 16 text

Χʔτͷ঎඼఺਺͸ ఺·Ͱ

Slide 17

Slide 17 text

D .BTBTIJ4IJOCBSB!TIJOY Χʔτͷ঎඼఺਺͸఺Ҏ಺ w఺Ҏ্ͷ঎඼Λ֨ೲ͠Α͏ͱͨ͠Βྫ֎ൃੜ w঎඼௥ՃͷࡍʹνΣοΫΛߦ͏

Slide 18

Slide 18 text

D .BTBTIJ4IJOCBSB!TIJOY BEE*UFNϝιουͰ੍໿ wBEE*UFNϝιουͰ঎඼఺਺ΛνΣοΫ w͜ͷϝιουͰ͔͠$BSUJUFNTΛ
 มߋͰ͖ͳ͍ͷͰ༗ޮ wϓϩύςΟͷίϯτϩʔϧΛΫϥεࣗ਎͕ߦ͏
 QVCMJDͩͱ֎෦ʹίϯτϩʔϧ͞ΕΔ

Slide 19

Slide 19 text

$BSU class Cart
 { (snip)
 public function addItem(Item $item)
 {
 if (count($this->items) >= 3) {
 throw new PreconditionException();
 }
 
 $this->items[] = $item;
 } (snip)
 }

Slide 20

Slide 20 text

঎඼খܭʹ ফඅ੫ΛՃࢉ

Slide 21

Slide 21 text

D .BTBTIJ4IJOCBSB!TIJOY ੫ࠐՁ֨ࢉग़ wΧʔτͷ঎඼ͦΕͧΕʹফඅ੫ΛՃࢉ w੫ࠐΈՁ֨ͷ߹ܭΛখܭՁ֨ͱ͢Δ

Slide 22

Slide 22 text

$BSU $cart = new Cart();
 
 $item1 = new Item('code1', 100);
 $cart->addItem($item1);
 
 $item2 = new Item('code2', 200);
 $cart->addItem($item2);
 
 $this->assertEquals(324, $cart->calculateTotalPrice());
 $this->assertEquals(324, $cart->calculateTotalPrice()); ʹͳΔʁʁʁ

Slide 23

Slide 23 text

$BSU class Cart
 { (snip)
 public function calculateTotalPrice(): int
 {
 $totalPrice = 0;
 
 foreach ($this->items as $item) {
 $item->price = (int)($item->price * 1.08);
 $totalPrice = $totalPrice + $item->price;
 }
 
 return $totalPrice;
 } (snip)
 } *UFNQSJDF͕ มߋ͞ΕΔ ճݺͿͱ ͞ΒʹഒʹͳΔ

Slide 24

Slide 24 text

D .BTBTIJ4IJOCBSB!TIJOY *UFNΫϥεΛෆมʹ͢Δ w׬શίϯετϥΫλ
 ίϯετϥΫλͰશͯͷ஋Λ༩͑Δ wෆมʢΠϛϡʔλϒϧʣΫϥε
 QSJDF ͸ৗʹಉ͡஋Λฦ͢ wඞཁͳHFUUFSͷΈ࣮૷

Slide 25

Slide 25 text

*UFN class Item
 {
 private $code;
 private $price;
 
 public function __construct(string $code, int $price)
 {
 $this->code = $code;
 $this->price = $price;
 }
 
 public function price(): int
 {
 return $this->price;
 }
 } QSJWBUF

Slide 26

Slide 26 text

$BSU class Cart
 { (snip)
 public function calculateTotalPrice(): int
 {
 $totalPrice = 0;
 
 foreach ($this->items as $item) {
 $price = (int)($item->price() * 1.08);
 $totalPrice = $totalPrice + $price;
 }
 
 return $totalPrice;
 } (snip)
 } *UFNQSJDF͸ มߋͰ͖ͳ͍

Slide 27

Slide 27 text

Ձ֨΁ͷૢ࡞Λݶఆ

Slide 28

Slide 28 text

D .BTBTIJ4IJOCBSB!TIJOY Ձ֨ͷԋࢉΛ੍ݶ wJOUͩͱҙຯ͕޿͗͢ΔʢՄೳͳԋࢉ΋ଟ͍ʣ w଍͠ࢉͱ੫ࠐՁ֨ܭࢉʢֻ͚ࢉͰ͸ͳ͍ʣͷΈ wՁ֨Λ1SJDFΫϥεͰදݱ

Slide 29

Slide 29 text

1SJDF class Price
 {
 const TAX_RATE = 1.08;
 private $price;
 
 public function __construct(int $price)
 {
 $this->price = $price;
 }
 
 public function add(self $price): self
 {
 return new self($this->price + $price->price);
 }
 
 public function withTax(): self
 {
 return new self((int)($this->price * static::TAX_RATE));
 }
 
 public function toInt(): int
 {
 return $this->price;
 }
 }

Slide 30

Slide 30 text

*UFN class Item
 {
 private $code;
 private $price;
 
 public function __construct(string $code, int $price)
 {
 $this->code = $code;
 $this->price = new Price($price);
 }
 
 public function price(): Price
 {
 return $this->price;
 }
 }

Slide 31

Slide 31 text

$BSU class Cart
 { (snip)
 public function calculateTotalPrice(): Price
 {
 $totalPrice = new Price(0);
 
 foreach ($this->items as $item) {
 $price = $item->price()->withTax();
 $totalPrice = $totalPrice->add($price);
 }
 
 return $totalPrice;
 } (snip)
 } Ձ֨͸1SJDFͰදݱ ੫ࠐՁ֨ࢉग़ Ձ֨ͷ଍͠ࢉ

Slide 32

Slide 32 text

D .BTBTIJ4IJOCBSB!TIJOY 7BMVF0CKFDU w஋ΛΫϥεͰදݱ wෆมΫϥε
 ԋࢉ݁Ռ͸৽͍͠ΠϯελϯεͰฦ͢ wඞཁͳԋࢉͷΈΛ࣮૷ w಺෦ͷ஋ΛӅณ

Slide 33

Slide 33 text

঎඼ɺΧʔτ৘ใΛ +40/Ͱग़ྗ

Slide 34

Slide 34 text

D .BTBTIJ4IJOCBSB!TIJOY ঎඼ɺΧʔτ৘ใΛ+40/Ͱग़ྗ w+BWB4DSJQUΫϥΠΞϯτ΍
 εϚʔτϑΥϯΞϓϦ࿈ܞ w*UFNUP"SSBZ Ͱ഑ྻͱͯ͠ग़ྗ wKTPO@FODPEF Ͱ+40/ʹ͢Δ

Slide 35

Slide 35 text

"QJ$POUSPMMFS class ApiController
 {
 public function item()
 {
 $item = new Item('code1', 100);
 $this->json($item);
 }
 
 private function json(Item $entity)
 {
 header('Content-Type: application/json');
 echo json_encode($entity->toArray());
 }
 }

Slide 36

Slide 36 text

class ApiController
 {
 public function item()
 {
 $item = new Item('code1', 100);
 $this->json($item);
 }
 public function cart()
 {
 $cart = new Cart();
 $cart->addItem(new Item('code1', 100));
 $cart->addItem(new Item('code2', 200));
 
 $this->json($cart);
 } private function json(Item $entity)
 {
 header('Content-Type: application/json');
 echo json_encode($entity->toArray());
 }
 } DBSU͸
 *UFNΫϥεͰ͸ͳ͍

Slide 37

Slide 37 text

D .BTBTIJ4IJOCBSB!TIJOY "SSBZBCMFΠϯλʔϑΣΠε w"QJ$POUSPMMFSKTPO ͕
 ඞཁͳґଘΛΠϯλʔϑΣΠεͰ໌ࣔ wΠϯλʔϑΣΠε࣮͑͞૷͍ͯ͠Ε͹
 ͲΜͳΫϥεͰ΋ྑ͍ w࢓༷ͱ࣮૷ͷ෼཭

Slide 38

Slide 38 text

"SSBZBCMF interface Arrayable
 {
 public function toArray(): array;
 }

Slide 39

Slide 39 text

*UFN class Item implements Arrayable
 {
 (snip) public function toArray(): array
 {
 return [
 'code' => $this->code,
 'price' => $this->price->toInt(),
 ];
 }
 }

Slide 40

Slide 40 text

$BSU class Cart implements Arrayable
 {
 (snip) public function toArray(): array
 {
 return array_map(function (Item $item) {
 return $item->toArray();
 }, $this->items);
 }
 }

Slide 41

Slide 41 text

class ApiController
 {
 public function item()
 {
 $item = new Item('code1', 100);
 $this->json($item);
 }
 public function cart()
 {
 $cart = new Cart();
 $cart->addItem(new Item('code1', 100));
 $cart->addItem(new Item('code2', 200));
 
 $this->json($cart);
 } private function json(Arryable $entity)
 {
 header('Content-Type: application/json');
 echo json_encode($entity->toArray());
 }
 } "SSBZBCMF

Slide 42

Slide 42 text

D .BTBTIJ4IJOCBSB!TIJOY ˞ิ଍ 1)1ʹ͸ɺ+TPO4FSJBMJ[BCMFͱ͍͏
 ΠϯλʔϑΣΠε͕͋Γ·͢ɻ
 ΦϒδΣΫτΛ+40/Խ͢Δࡍ͸
 ࢀߟʹ͍ͯͩ͘͠͞ɻ http://php.net/manual/ja/class.jsonserializable.php

Slide 43

Slide 43 text

੍໿ͱ͸

Slide 44

Slide 44 text

ࣗ༝Λୣ͏ ໘౗ͳ΋ͷͰ͸ͳ͘

Slide 45

Slide 45 text

டংΛकΓ ҙਤΛ໌֬ʹ͢Δ΋ͷ ੍໿ ΘΜͺ͘ͳίʔυ https://flic.kr/p/4e5ggf ίʔυͷடংΛ कΔ΋ͷ

Slide 46

Slide 46 text

੍໿Ͱடং͋Δ։ൃΛʂ

Slide 47

Slide 47 text

D .BTBTIJ4IJOCBSB!TIJOY !TIJOY !TIJOY D .BTBTIJ4IJOCBSB!TIJOY

Slide 48

Slide 48 text

D .BTBTIJ4IJOCBSB!TIJOY QSPUFDUFEPSQSJWBUF w·ͣ͸ɺQSJWBUFඞཁͳΒQSPUFDUFE w͍͔ͭݺ͹ΕΔ͔΋͠Εͳ͍͔ΒQSPUFDUFE
 :"(/*ʢ:PVBJOUHPOOBOFFEJUʣ wଞਓ͕࡞ͬͨγεςϜΛϝϯςφϯε͢Δͱ
 QSJWBUFສࡀʹͳΔ wUSBJU͕͋ΔͷͰɺػೳͷͨΊʹܧঝ͢Δඞཁ͕ແ͍