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

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

sorch
March 25, 2023

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

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

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

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

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 ◦ ×