Upgrade to Pro — share decks privately, control downloads, hide ads and more …

まっちすいっち戦争 / match vs switch

まっちすいっち戦争 / match vs switch

Avatar for Takuya Katsusa

Takuya Katsusa

March 07, 2024
Tweet

More Decks by Takuya Katsusa

Other Decks in Programming

Transcript

  1. 自己紹介 勝佐 拓也(かつさ たくや)   BABY JOB 株式会社(2023 年 2 月入社)

    保育園探し 「えんさがそっ♪」 の 開発・保守 バックエンドエンジニア 3 年 筋トレ大好き / ニコニコ大好き 3歳になる娘がいます PHPカンファレンス関西のスタッフやってました!! 2 @kitkattsun0531
  2. まっち ちゃん のキャラクター紹介 • PHP 8 から参戦! • 計算が好き ◦

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

    他の式や文と協力して、アクションする • 複雑なことが好き ◦ 他のケースも見る • 細かいところは気にしない性格 ◦ 値を緩やかに(==)比較する ◦ 条件に合わない場合はエラーにならない やる気スイッチ 僕のはどこにあるんだろ〜♪
  4. まっち $description = match ($service) { 'ensagaso' => '保育園・幼稚園探しサイト', 'tebura'

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

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

    $description = '保育園・幼稚園探しサイト'; break; case 'tebura': $description = 'おむつを保育施設に届けるサブスク'; break; default: $description = 'その他'; }
  7. $service = match ($sellingPoint) { 'おむつ', '食事用エプロン・手口ふき ' => '手ぶら登園',

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

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

    switch ($sellingPoint) { case 'おむつ': case '食事用エプロン・手口ふき ': $service = '手ぶら登園'; break; case '口コミ': case '見学予約': $service = 'えんさがそっ♪'; break; default: $service = 'その他'; break; }
  10. $song = match ($event) { 'クリスマス' => function() { //

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

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

    ($event) { case 'クリスマス': // 曲を検索する処理があって ... $song = 'あわてんぼうのサンタクロース '; break; case 'ひな祭り': // 曲を検索する処理があって ... $song = 'うれしいひなまつり'; break; default: // 曲を検索する処理があって ... $song = '該当なし'; }
  13. match式は PHP 8 未満で 使えない とはいえ PHP は 8.0 まで

    サポート切れてるんですけどね (煽り)
  14. こんな処理があったとします 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; }
  15. ストラテジーパターンもいいよね!! 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時くらいをお知らせします '; } } すとらちゃん ふっ… ふつくしいっ…!
  16. 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で導入された よね〜 ストラテジーパターンもいいよね!!