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

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

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

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で導入された よね〜 ストラテジーパターンもいいよね!!