Slide 1

Slide 1 text

他言語と比較して今こそ理解しよう! 目指せ、列挙型マスター! ~なりたいな ならなくちゃ 絶対なってやる ~ 2023/03/25 PHPerKaigi 2023 #phperkaigi #a

Slide 2

Slide 2 text

発表のアウトライン ● 対象聴者 ○ 列挙型を使う動機がわかない ○ 既存のコードを書き換えたほうがいいのか ● この発表のゴール ○ 列挙型の使い方のイメージができる ○ 列挙型でできること・できないことがざっくりわかる

Slide 3

Slide 3 text

そーく @soachr バックエンドエンジニア 2016年4月〜2023年2月:株式会社ラクス 自社サービスのワンストップ開発に従事 インターン講師やら社内技術発表会の運営などもしたことあり 2023年3月〜:Home Security Agent🏠👮 次に向けて”はねやすめ”中 趣味  パン作り/プラモデル組み(創作少女庭園、Chitoceriumも気になる)    どきっとする言葉 ”運用でカバー” created by VRoidStudio (ピクシブ様感謝)

Slide 4

Slide 4 text

列挙型が できること

Slide 5

Slide 5 text

”タイプ” enum Type { case FLAME; case WATER; case NORMAL; }

Slide 6

Slide 6 text

不利 有利 ふ つ う ふ つ う ふ つ う ふ つ う ”タイプ相性”

Slide 7

Slide 7 text

enum Type { case FLAME; case WATER; case NORMAL; public function compareTo(Type $target): TypeCompatibility { switch($this) { case Type::WATER: return match($target) { Type::FLAME => TypeCompatibility::ADVANTAGE, Type::WATER => TypeCompatibility::ACTUAL, Type::NORMAL => TypeCompatibility::ACTUAL, }; break; // … } // …

Slide 8

Slide 8 text

// 呼び出し側 $myMoveType = Type::WATER; $opponentType = Type::FLAME; $myMoveType->compareTo($opponentType)); // 有利

Slide 9

Slide 9 text

他言語と比較して できること・できないこと

Slide 10

Slide 10 text

表にまとめてみた

Slide 11

Slide 11 text

比較対象言語 ● 歴史がまあまあ長い ● 幅広い業界で利用されている ● 初めて学ぶ言語になることが多い(らし い)

Slide 12

Slide 12 text

できること・できないこと 列挙子自体がインスタンス (シングルトンオブジェクト) ○ ○ ○ 列挙子に単一の整数・文字列を割り当てる ○ ○ ○ 列挙子に任意の 整数・文字列以外を割り当てる × ○ ○ インスタンスメソッドを定義する ○ ○ ○ クラスメソッドを定義する ○ ○ ○ 自身を継承させる × × ○

Slide 13

Slide 13 text

enum Move { naminori("波にのる", Type.WATER, 90), kaenhosya("火炎を放射する", Type.FLAME, 90), hakaikousen("超光速で破壊する", Type.NORMAL, 150); private String moveName; private Type type; private int attackPoint; … PHPではできないこと - 例1:わざ

Slide 14

Slide 14 text

enum TypeCompatibility { ADVANTAGE(new AdvantageTypeDamageMultiplier()), DISADVANTAGE( new DisAdvantageTypeDamageMultiplier()), ACTUAL(new ActualTypeDamageMultiplier()); private TypeDamageMultiplier multiplier; //… } interface TypeDamageMultiplier { public double multiplier(); } class AdvantageTypeDamageMultiplier implements TypeDamageMultiplier { public double multiplier() { return 2; } } 0.5倍 2倍 1.0倍 PHPではできないこと - 例2:相性ダメージ倍率

Slide 15

Slide 15 text

まとめ ● 自分の値による振る舞いの違いを自分の中で定義することができる ○ 定数では別のところにロジックを書く必要があった ● 他の言語では列挙子のインスタンスにメンバを持つことができる ○ より凝縮度の高いコードになりそう ○ でもできることが増えるとスパゲッティにもなりがち(メンバ多すぎ問題) \列挙型を利用してより堅牢なコードを!/

Slide 16

Slide 16 text

ご清聴 ありがとうございました

Slide 17

Slide 17 text

PHP) What’s the difference Class and Enum ? can have/do Class Enum property(member) ○ × construct ○ × instance method ○ ○ class constant ○ ○ class method ○ ○ implement interface ○ ○ inherit ○ × clone ○ ×