【C#】メソッドをつなげる

メソッドをつなげることはメソッドチェーンと呼ばれています。メソッドチェーンは、複数のメソッド呼び出しを一つの式に連結できるため、コードの可読性と簡潔性が向上します。オブジェクトの操作を流れるように記述できることで、プログラムの意図が明確に伝わり、保守性も高まります。連続的な操作が直感的になるため、開発効率が改善される利点があります。

基本的なコードサンプル

メソッドチェーンを使っていない場合

プレイヤーのHp状態管理のサンプル

class Player
{
    // プレイヤーのヒットポイントを保持する変数
    int hp;

    // プレイヤーのヒットポイントを増やすメソッド
    public void AddHp(int hp)
    {
        // 渡されたhpの値で現在のhpを増加させる
        this.hp += hp;
    }

    // プレイヤーの現在のヒットポイントを表示するメソッド
    public void ShowHp()
    {
        // 現在のhpをコンソールに表示
        Console.WriteLine(hp);
    }
}

このコードは、Playerクラスのインスタンスを生成し、プレイヤーのヒットポイント(HP)を段階的に増加させています。具体的には、初めに1増やし、次に2増やし、さらに3増やしています。最終的に、プレイヤーの現在のHP合計をコンソールに表示しており、表示結果は6となります。この処理によって、プレイヤーのHPが初期状態から順に増加していく様子を確認できます。

// プレイヤーのインスタンスを生成
Player player = new Player();

// プレイヤーのHPを1増やす
player.AddHp(1);

// プレイヤーのHPをさらに2増やす
player.AddHp(2);

// プレイヤーのHPをさらに3増やす
player.AddHp(3);

// プレイヤーの現在のHPを表示
player.ShowHp(); // 表示結果 6

やりたいこと

次のように続けて書くことはできないでしょうか?

このような書き方をメソッドチェーンと言います(メソッドを鎖のように繋いでいることからこのように呼ばれています)

ただし、気をつけなければならないのは、このメソッドチェーンが最適解とは限らないことです

あくまでメソッドチェーンの仕組みについての学習になることを忘れないでください

// Playerクラスの新しいインスタンスを作成
Player player = new Player();

// playerにHPを追加して、表示します
player.AddHp(1) // HPに1を追加
      .AddHp(2) // HPに2を追加
      .AddHp(3) // HPに3を追加
      .ShowHp(); // 現在のHPを表示

または(まとめルト・・)

Player player = new Player(); // プレイヤーオブジェクトを作成
player.AddHp(1).AddHp(2).AddHp(3).ShowHp(); // プレイヤーのHPを1, 2, 3ずつ追加し、表示する

メソッドチェーンでやりたいことを実現する方法

実際にこの呼び出しができるように更新していきます

メソッドチェーンを実現するには、各メソッドがオブジェクト自体を返すように設計する必要があります。AddHpメソッドがPlayerオブジェクトを返し、連続してメソッドを呼び出せるようにすることで、メソッドチェーンが可能になります。以下のようにPlayerクラスを修正します:

class Player
{
    // プレイヤーのヒットポイントを保持する変数
    int hp;

    // プレイヤーのヒットポイントを増やすメソッド
    public Player AddHp(int hp)
    {
        // 渡されたhpの値で現在のhpを増加させる
        this.hp += hp;

        // メソッドチェーンを可能にするために自身を返す
        return this;
    }

    // プレイヤーの現在のヒットポイントを表示するメソッド
    public void ShowHp()
    {
        // 現在のhpをコンソールに表示
        Console.WriteLine(hp);
    }
}

この変更により、以下のようにPlayerクラスのインスタンスでメソッドチェーンを使用することができます:

Player player = new Player();  // プレイヤーオブジェクトを作成
Player player1 = player.AddHp(1); // HPを1追加
Player player2 = player1.AddHp(2); // HPを2追加
Player player3 = player2.AddHp(3); // HPを3追加
player3.ShowHp(); // HPを表示
Player player = new Player(); // プレイヤーオブジェクトを作成
player.AddHp(1).AddHp(2).AddHp(3).ShowHp(); // プレイヤーのHPを1, 2, 3ずつ追加し、表示する

このコードは、新しいPlayerオブジェクトを生成し、HPを順に追加して最終的に現在のHPをコンソールに表示します。各AddHpメソッドはPlayerインスタンスを返すため、連続してメソッドを呼び出すことが可能です。

このコードの良さは、メソッドチェーンによる直感的で読みやすい構造にあります。AddHpメソッドが自身のインスタンスを返す設計により、複数の操作を一行で簡潔に連続して行うことができ、コードの可読性と保守性が向上します。また、HPの変更と表示をスムーズに実行できる点も魅力です。

C#

Posted by hidepon