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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  4. 列挙型が
    できること

    View full-size slide

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

    View full-size slide

  6. 不利
    有利












    ”タイプ相性”

    View full-size slide

  7. 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;
    // …
    }
    // …

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  10. 表にまとめてみた

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  13. 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:わざ

    View full-size slide

  14. 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:相性ダメージ倍率

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  17. 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 ○ ×

    View full-size slide