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

他言語と比較して今こそ理解しよう! 目指せ、列挙型マスター!

Avatar for sorch sorch
March 25, 2023

他言語と比較して今こそ理解しよう! 目指せ、列挙型マスター!

列挙型がPHP8.1でリリースされて約1年が経ちました。
みなさんの現場で列挙型はうまく活用されていますか?

Java, pythonなど、他言語の列挙型の仕様と比較しながら、
PHPにおける列挙型の役割や使い方を示します。

列挙型を使いこなしてより楽しく、そして安全なシステム作りをしていきましょう!

Avatar for sorch

sorch

March 25, 2023
Tweet

More Decks by sorch

Other Decks in Technology

Transcript

  1. 発表のアウトライン • 対象聴者 ◦ 列挙型を使う動機がわかない ◦ 既存のコードを書き換えたほうがいいのか • この発表のゴール ◦

    列挙型の使い方のイメージができる ◦ 列挙型でできること・できないことがざっくりわかる
  2. 不利 有利 ふ つ う ふ つ う ふ つ

    う ふ つ う ”タイプ相性”
  3. 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; // … } // …
  4. できること・できないこと 列挙子自体がインスタンス (シングルトンオブジェクト) ◦ ◦ ◦ 列挙子に単一の整数・文字列を割り当てる ◦ ◦ ◦

    列挙子に任意の 整数・文字列以外を割り当てる × ◦ ◦ インスタンスメソッドを定義する ◦ ◦ ◦ クラスメソッドを定義する ◦ ◦ ◦ 自身を継承させる × × ◦
  5. 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:わざ
  6. 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:相性ダメージ倍率
  7. 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 ◦ ×