メニューを閉じる

テクノデジタルグループ

メニューを開く

2014.11.28

プログラミング

C# メソッドチェーンもどき

こんにちは、KTです。

C#でメソッドチェーンもどきの書き方を紹介します。(多分批判はいろいろあると思いますが、私がこういう書き方好きなのでということで)

改めて紹介するレベルじゃないかもしれないですが。。。

 

ご存知の通り、メソッドチェーンとは

hoge.MethodA().MethodB().MethodC();

 

のようにあるオブジェクトのメソッドを連続して呼ぶ方法のことですね。

これを実装するには

public class Hoge {
    public MethodA() {
        /**
         * メソッドAの処理
         */

        return this; // 最後に自身のインスタンスを返す。
    }
}

 

のように、メソッドの最後で自身のインスタンスを返すようにすることで実現出来ます。

 

話は変わって、こちらはJavaScriptのSocket.IOというライブラリを使う時のコードです。

socket.emit('msg push', 'data'); // 特定の相手に文字列を送信
socket.json.emit('msg push', data); // 特定の相手にJSONデータを送信
socket.json.broadcast.emit('msg push', data); // 全員にJSONデータを送信

メソッドチェーンと思いきや、jsonやbroadcastにメソッド呼び出しの()が付いてないですよね?

 

メソッドチェーンで

socket.json().broadcast().emit()

としてしまうと、json、broadcast、emitが全て同列に見えてしまいます。(jsonしてからbroadcastしてからemit。。というように)

 

socket.json.broadcast.emit()

と書いた方がjsonやbroadcastは、emitというメソッドの動作を指定するためのいわゆる形容詞的な存在であり、あくまでここで行いたいのはemitであるということが分かりやすくなりますよね。

 

さて、これをC#でも実現しましょう。

といっても実現するのはとても簡単です。

getterメソッドを使えば良いのです。(上述のSocket.IOのjson、broadcastも正体はgetterメソッドです)

getterメソッドは、その名の通り変数に値をセットするためのメソッドであり、特徴として()無しで呼び出すことが出来ます。これを利用して()無しで呼び出せるメソッドを作りましょう。

public class Socket {
    private isJson;
    private isBroadcast;

    // コンストラクタ
    public Socket() {
        isJson = isBroadcast = false;
    }

    public Socket json {
        get {
            isJson = true;
            return this;
        }
    }

    public Socket broadcast {
        get {
            isBroadcast = true;
            return this;
        }
    }

    public void emit(msg) {
        if (isJson) { 〜
        if (isBroadcast) { 〜
    }
}

 

このように、getterでフラグを変更して自身のインスタンスを返すようにすると

Socket socket = new Socket();
socket.emit("message");
socket.json.emit("messgae");
socket.json.broadcast.emit("message");

 

のように、json、broadcastを()なしで呼び出すことが出来るようになります。

 

冒頭にも書いた通り、今回の内容はおそらく批判される方が結構いると思います。

本来のgetterメソッドの用途とは全く異なる方法で使用していますし、濫用すれば途端に読みにくく、解読しにくいコードになる可能性が高いですしね。

ただ、それでも適切に使えばコードの可読性をあげることが出来る方法だと思います。

用法、用量をお守りくださいってやつですね。

 

この内容に批判的な方でも、こんな書き方をしてるコードに出会った時に「???」ってならないように、知っておいて損はないと思いますよ。

 


【記事への感想募集中!】

記事への感想・ご意見がありましたら、ぜひフォームからご投稿ください!
  • こんな記事が読んでみたい、こんなことが知りたい、調べてほしい!という意見も募集中!
  • いただいた感想は今後の記事に活かしたいと思います!

感想フォームはこちら


【テクノデジタルではエンジニア/デザイナーを積極採用中です!】

下記項目に1つでも当てはまる方は是非、詳細ページへ!
  • 自分でアプリを作ってみたい
  • ITで世の中にワクワクを生み出したい
  • 使いやすさ、デザインにこだわったWebサイトを開発したい

採用情報の詳細はこちら


Qangaroo(カンガルー)

  • 徹底した見やすさと優れた操作性で、テストの「見える化」を実現。
  • テストの進捗が見える。開発がスマートに進む。
  • クラウド型テスト管理ツール『Qangaroo(カンガルー)』

【テクノデジタルのインフラサービス】

当社では、多数のサービスの開発実績を活かし、
アプリケーションのパフォーマンスを最大限に引き出すインフラ設計・構築を行います。
AWSなどへのクラウド移行、既存インフラの監視・運用保守も承りますので、ぜひご相談ください。
詳細は下記ページをご覧ください。

https://www.tcdigital.jp/infrastructure/

最近の記事