Slide 1

Slide 1 text

match switch BABY JOB 株式会社 勝佐拓也 PHPerKaigi2024 2024.03.08

Slide 2

Slide 2 text

自己紹介 勝佐 拓也(かつさ たくや)   BABY JOB 株式会社(2023 年 2 月入社) 保育園探し 「えんさがそっ♪」 の 開発・保守 バックエンドエンジニア 3 年 筋トレ大好き / ニコニコ大好き 3歳になる娘がいます PHPカンファレンス関西のスタッフやってました!! 2 @kitkattsun0531

Slide 3

Slide 3 text

まっち ちゃん のキャラクター紹介 ● PHP 8 から参戦! ● 計算が好き ○ 問題を渡すと、答えを返してくれる ● シンプルなことが好き ○ 他のケースは見ない ○ 複雑な作業は嫌い ● キッチリ決めたい性格 ○ 厳密に値(===)を比較する ○ 条件に合わない場合はエラーになる マッチは、いかが。 ライターなんてもう古い。

Slide 4

Slide 4 text

すいっち くん のキャラクター紹介 ● PHP 4 から参戦! ● 協力プレーが好き ○ 他の式や文と協力して、アクションする ● 複雑なことが好き ○ 他のケースも見る ● 細かいところは気にしない性格 ○ 値を緩やかに(==)比較する ○ 条件に合わない場合はエラーにならない やる気スイッチ 僕のはどこにあるんだろ〜♪

Slide 5

Slide 5 text

Round 1 基本編(単一条件) まっちちゃん すいっちくん

Slide 6

Slide 6 text

まっち $description = match ($service) { 'ensagaso' => '保育園・幼稚園探しサイト', 'tebura' => 'おむつを保育施設に届けるサブスク', default => 'その他' }; すいっち switch ($service) { case 'ensagaso': $description = '保育園・幼稚園探しサイト'; break; case 'tebura': $description = 'おむつを保育施設に届けるサブスク'; break; default: $description = 'その他'; }

Slide 7

Slide 7 text

まっち ● 記述量が少ない ● 値が厳密比較される $description = match ($service) { 'ensagaso' => '保育園・幼稚園探しサイト', 'tebura' => 'おむつを保育施設に届けるサブスク', default => 'その他' };

Slide 8

Slide 8 text

すいっち ● 記述量が多い ● 値が緩やかに(==)比較される switch ($service) { case 'ensagaso': $description = '保育園・幼稚園探しサイト'; break; case 'tebura': $description = 'おむつを保育施設に届けるサブスク'; break; default: $description = 'その他'; }

Slide 9

Slide 9 text

Round 1 RESULT

Slide 10

Slide 10 text

Round 2 基本編(複数条件) まっちちゃん すいっちくん

Slide 11

Slide 11 text

$service = match ($sellingPoint) { 'おむつ', '食事用エプロン・手口ふき ' => '手ぶら登園', '口コミ', '見学予約' => 'えんさがそっ♪', default => 'その他' }; switch ($sellingPoint) { case 'おむつ': case '食事用エプロン・手口ふき ': $service = '手ぶら登園'; break; case '口コミ': case '見学予約': $service = 'えんさがそっ♪'; break; default: $service = 'その他'; break; } まっち すいっち

Slide 12

Slide 12 text

● 記述量が少ない ● 複数条件にできる ※複雑な条件式は可読性が悪くなる ● 値が厳密比較される まっち $service = match ($sellingPoint) { 'おむつ', '食事用エプロン・手口ふき ' => '手ぶら登園', '口コミ', '見学予約' => 'えんさがそっ♪', default => 'その他' };

Slide 13

Slide 13 text

● 記述量が多い ● case 内で複数条件の指定ができないが、 case で分けることで実現できる ● 値が緩やかに(==)比較される すいっち switch ($sellingPoint) { case 'おむつ': case '食事用エプロン・手口ふき ': $service = '手ぶら登園'; break; case '口コミ': case '見学予約': $service = 'えんさがそっ♪'; break; default: $service = 'その他'; break; }

Slide 14

Slide 14 text

Round 2 RESULT

Slide 15

Slide 15 text

Round 3 応用編(複数行) まっちちゃん すいっちくん

Slide 16

Slide 16 text

$song = match ($event) { 'クリスマス' => function() { // 曲を検索する処理があって ... return 'あわてんぼうのサンタクロース '; }, 'ひな祭り' => function() { // 曲を検索する処理があって ... return 'うれしいひなまつり'; }, default => function() { /// 曲を検索する処理があって ... return '該当なし'; }, }; switch ($event) { case 'クリスマス': // 曲を検索する処理があって ... $song = 'あわてんぼうのサンタクロース '; break; case 'ひな祭り': // 曲を検索する処理があって ... $song = 'うれしいひなまつり'; break; default: // 曲を検索する処理があって ... $song = '該当なし'; } まっち すいっち

Slide 17

Slide 17 text

● 記述量は多い ● 原則、返却式は複数行で書けないので、 無名関数などを使う必要がある ※ あまり適切な使い方ではなさそう ● 値が厳密比較される $song = match ($event) { 'クリスマス' => function() { // 曲を検索する処理があって ... return 'あわてんぼうのサンタクロース '; }, 'ひな祭り' => function() { // 曲を検索する処理があって ... return 'うれしいひなまつり'; }, default => function() { /// 曲を検索する処理があって ... return '該当なし'; }, }; まっち

Slide 18

Slide 18 text

● 記述量は少ない ● 複数行で処理できる ● 複雑な処理も書きやすい ● 値が緩やかに(==)比較される すいっち switch ($event) { case 'クリスマス': // 曲を検索する処理があって ... $song = 'あわてんぼうのサンタクロース '; break; case 'ひな祭り': // 曲を検索する処理があって ... $song = 'うれしいひなまつり'; break; default: // 曲を検索する処理があって ... $song = '該当なし'; }

Slide 19

Slide 19 text

Round 3 RESULT

Slide 20

Slide 20 text

Round 4 おまけ編 まっちちゃん すいっちくん

Slide 21

Slide 21 text

match 式は PHP 8 未満で 使えない

Slide 22

Slide 22 text

match式は PHP 8 未満で 使えない とはいえ PHP は 8.0 まで サポート切れてるんですけどね (煽り)

Slide 23

Slide 23 text

Round 4 RESULT

Slide 24

Slide 24 text

Final JudgeMent

Slide 25

Slide 25 text

No content

Slide 26

Slide 26 text

こんな処理があったとします match 式 で書きづらいし、 switch 文でもしっくりこないな〜 うーん、もやもや... readonly class Audience { public string $name; public string $timeSignal; public function __construct(string $keyword) { switch ($keyword) { case 'niconico': $this->name = 'ニコニコ動画'; $this->timeSignal = 'ドワンゴが午前2時くらいをお知らせします '; break; case 'youtube'... } } // 表示するためのメソッド ... } public function showName(): string { return 'サービス名:' . $this->name; } public function showTimeSignal(): string { return '時報:' . $this->timeSignal; }

Slide 27

Slide 27 text

ストラテジーパターンもいいよね!! StreamingInterface を実装した それぞれの動画配信クラス ( Niconico など ) を活用できる 条件追加漏れを防げるかも! interface StreamingInterface { public function name(): string; public function timeSignal(): string; } class Niconico implements StreamingInterface { public function name(): string { return 'ニコニコ動画'; } public function timeSignal(): string { return 'ドワンゴが午前2時くらいをお知らせします '; } } すとらちゃん ふっ… ふつくしいっ…!

Slide 28

Slide 28 text

readonly class Audience { public function __construct( private StreamingInterface $streaming ) { } public function showName(): string { return 'サービス名:' . $this->streaming->name(); } public function showTimeSignal(): string { return '時報:' . $this->streaming->timeSignal(); } } コンストラクタに (例えば) Niconico を渡すことで実現できる 処理を「外部にカプセル化」 することで、 処理を実行する / 利用するを 分けることができる readonly class は PHP8.2で導入された よね〜 ストラテジーパターンもいいよね!!

Slide 29

Slide 29 text

match 式 と switch 文 のもっと良い使い分けを募集中です! 懇親会などで教えてください!! えんさがそっ♪ の目玉機能である口コミの投稿もお願いします🙏 保護者として、保育施設に口コミができます! 只今キャンペーン中で、豪華景品が当たるかも!?