2025.08.29
Laravelで空判定にif文を使うとハマる理由
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つでも当てはまる方は是非、詳細ページへ!Qangaroo(カンガルー)
【テクノデジタルのインフラサービス】
当社では、多数のサービスの開発実績を活かし、
アプリケーションのパフォーマンスを最大限に引き出すインフラ設計・構築を行います。
AWSなどへのクラウド移行、既存インフラの監視・運用保守も承りますので、ぜひご相談ください。
詳細は下記ページをご覧ください。
最近の記事
1
2025.08.29
Laravelで空判定にif文を使うとハマる理由
2

2025.08.29
Git SSH接続でfetch/pullができなくなった時の対処法
3

2025.08.28
【体験談】Amazon Linux 2でMySQLインストール時のOpenSSL・GPG key エラーにハマった話
4
2025.08.28
【AWS】SSMポートフォワーディングとInstance Connectを利用したプライベートEC2へのSSH接続手順
5
2025.07.24
Log::info()が使えない!?Laravel.logのPermission denied エラーを解決する(Docker環境)
タグ検索