Link
Embed
Share
Beginning
This slide
Copy link URL
Copy link URL
Copy iframe embed code
Copy iframe embed code
Copy javascript embed code
Copy javascript embed code
Share
Tweet
Share
Tweet
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 ○ ×