- ベストアンサー
c#デリゲート関連の命名について
- c#デリゲート関連の命名についての質問です。SampleDelegateとSampleActionにはどのような名前をつければいいのか悩んでいます。
- SampleDelegateは値を取得するメソッドを表すので、'~すること'を表す動名詞を使用するのが適切です。SampleActionも同様に、値を取得することを表す名前にするとよいでしょう。
- 例えばSampleDelegateは'GetValue'、SampleActionは'ValueGetter'という名前を使うことができます。しかし、最終的な命名はコードの読みやすさや一貫性を保つことが重要です。
- みんなの回答 (27)
- 専門家の回答
質問者が選んだベストアンサー
>結局、setとAddは結局同じ動作を含んでいたことに気づいて~ >何もデリゲートを使わなくてもやりたかったことの一部が出来たんです。 はい、そういう事ですね。 >_sampleAction( ←ここまで入れるとツールチップで変数名が表示されるので 或いはカーソルをかざしたりしても出てきますね。 こういうのをひっくるめてインテリセンス(Intellisense)というんですが VC++2008ではこいつがC#に比べてかなり貧弱なんですよw ずっと前にVC++で同じようなことしようと試みた事があるんですが、結局その時は どうあがいても、カーソルをかざすのか、キー入力だったかの、どっちか片方だけしか反映できないという結果だったように思いました。 (まぁ、「貧弱」というのはそれだけの理由では決してありませんが) 次のバージョンでは強化されたと小耳にはさんだので(もうさらにその次が既に触れられるのかな?)幾分期待はしていますが。 ・<>について たぶん見つかりました。 コレっぽい感じではないですか? http://d.hatena.ne.jp/saiya_moebius/20090129/1233243475 html上でのあれとおんなじみたいですね < と > 使えば出来るっぽい感じです List<T> ↓ List<T> で、リンク先の方はこれだと書いてる側は分かり辛いってんで {}をかわりに使ってらっしゃる提案をされてますが それから、<include>使って別ファイルに置き変え出来るっぽいですね http://msdn.microsoft.com/ja-jp/library/9h8dy30z.aspx これを使えば、日英別々にxml作っといて、後で簡単に切り替えるといったことが出来るかもしれません。 私のとこでは dllにビルドしといて 別のC#アセンブリから 参照設定して(xmlファイルも運んどいて)呼び出したら 表示出来ました が 自分自身のアセンブリのとこに /// <include file='xml_include_tag.doc' path='MyDocs/MyMembers[@name="test"]/*' /> とかをやっただけでは出ず。 うーむ これが自分のとこでも反応してくれれば最強なんですが これは出来ないのかな?
その他の回答 (26)
- Tacosan
- ベストアンサー率23% (3656/15482)
すみません, C# と関係ないところで 1点突っ込ませてください>#3. 「__」および「_+大文字」で始まる識別子は完全に処理系予約ですが, 「_」で始まるその他の識別子は ・C なら「ファイルスコープ」で予約 ・C++ なら「グローバル名前空間」 (と ::std 名前空間) で予約 です. つまり, どちらにおいても構造体メンバや関数にローカルな変数 (引数を含む) 名には利用可能です. たぶんこの辺は C# でも同じなんじゃないでしょうか. もっとも, 「ふつ~の識別子」を使っても規格が変わったらアウトだったりしますが. 戻って, と. あ, 「delegate には命名規則がある」ということは, 逆に言えば Func<ほにゃらら> なんかを使えば「自由な名前にできる」 かも. ただ, そうするとやっぱり「使う場面」を想定しておく必要があるんじゃないかな. もちろん delegate (相当) なので「使う場面」には ・その delegate (相当) を取り出す場面 ・取り出した delegate (相当) を使ってメソッドなりなんなりを呼び出す場面 の両方を考えないといけないんでしょうね.
- LongSecret
- ベストアンサー率68% (22/32)
Func<int> は delegate int デリゲート名(); とおんなじことですよ。 Actionは戻り値voidですが Funcの場合、<>内が一個なら Func<戻り値>で 二個以上だと Func<引数1, 引数2, 戻り値> 等のようになります。 >実は、この「private」級のフィールド変数の命名には苦心しています。 もし大量に既に作ってしまっているなら その部分については一端そのままでもいい、かもしれません。 (将来バージョンアップでコンパイルエラーが出たらそこだけ直す、など) 「これ以上ないシンプルかつ分かりやすい名前」というのは、その場の全体の構造の影響をうけますから 何がどうなってるのかが見せていただくことが出来れば (オブジェクト指向的な構造化というのはC++でもC#でも十分通じるところがあると思うので) もうちょい方法を考えれる、かもしれません。
お礼
ご指摘ありがとうございます。 > なので、koumei000さんがライブラリ作成時の話をされているのならこの通りでしょうが 残念ながら、その、ライブラリを作っているのです。 先ほどフィールドのデザインを見たのですが、それによると「protected」なフィールドはダメと在るのですが、具体的にはどうダメなのでしょうか? (パブリック フィールドとプロテクト フィールドは適切にバージョン管理されず、またコード アクセス セキュリティ要求によって保護されません。 パブリックに参照可能なフィールドを使用する代わりにプライベート フィールドを使用し、それをプロパティを通じて公開してください。 → ???) > Func<int>はdelegate int デリゲート名();とおんなじことですよ。 お恥ずかしいことに 「delegate void Fanc<TResult>(out TResult result)」 と見間違えていたようです。 また、以前 https://github.com/mono/mono/blob/master/mcs/class/corlib/System.Collections.Generic/List.cs などmonoのサンプルを見たので、フィールド変数の頭にアンダースコアをつけるようになったのですが、参考にしないほうがよかったのでしょうか? あと、アンダースコアを使わないとすれば、どうするのがよいでしょうか?
- LongSecret
- ベストアンサー率68% (22/32)
て#2さんのリンク先って 「クラス ライブラリ開発のデザイン ガイドライン」 じゃないですかw どうも規則(書かれ方)がかつかつすぎないかと思ったらw これは「後で別のアセンブリから使いまわされるライブラリ」を開発するなら、こういうガイドラインに沿った方がいいだろう という提案なので http://msdn.microsoft.com/ja-jp/library/ms229042.aspx >一貫性のないライブラリ デザインは、開発者の生産性を損なうだけでなく、ライブラリを採用する意欲を失わせます。 「採用する意欲」という言葉からわかるように、これは自分だけで使うものとはちょっと事情が異なります。 なので、koumei000さんがライブラリ作成時の話をされているのなら この通りでしょうが exeに入るinternalな感じのクラスとかだったら、もうちょっと自由でいいと思います。
- LongSecret
- ベストアンサー率68% (22/32)
なるほど、C#(というか.NET)は名前のガイドラインまでMSにあるとは どっぷりMSの管轄って感じですねw 実際には MS以外の人のサンプルコードではDelegate何々とかよく見かけましたが MSDNが >イベント ハンドラーではないデリゲートの名前には、サフィックス Callback を追加します。 >サフィックス Delegate は、デリゲートに追加しないでください。 と書いている、ということは、「Delegate」その物に関しては 将来の拡張予定かなんかがあるのかもしれません。 ネイティブC++にしょっちゅう触っているのでCallbackと言われるとWindowsAPIの事を連想してしまいますが、.NETではイベントハンドラ以外のdelegateで前衛的に使われてる、って感じなんでしょうか。 もちろん、会社とかで独自のやり方があるならそっちの方に優先して合わせた方が良いと思いますが、特に現状そう言う事はないのであれば、MSDNに従っとけば.NETっぽく合わせられるし、将来的な危険も少ないってことでしょうね。(MSの気まぐれは分からんので、「おそらくは」ですが) 個人的には GettingValueActionで 引数が空でintが戻ってくるというイメージがしにくい(「インスタンス.動作名(とくに~Action)」だと、どっちかっていうと引数をとってそれをもとにインスタンスの内部状態が変わって、引数は関知しない(つまりvoid)っていうイメージ)っていうのがあります。 実際System.Actionデリゲートは戻り値voidですよね >ただし,EventHandler<T>,ActionやFuncといった汎用のデリゲートがある そうでした。「ああ、C#」 この場合ですと 戻り値がvoidじゃなくEventHandlerじゃないと仮定して 同じようなことをやるんならFunc<int>で行けませんか? ↓例えばこんなイメージ using System; //上の方で ・ ・ ・ sealed class BBB { //たとえなので名前は適当ですが public Func<int> geti; public BBB(int i) { geti = () => { return i; }; } } class AAA { protected readonly BBB bbb; public int Value { get { return bbb.geti(); } } public AAA( BBB bbb_ ) { bbb = bbb_; } } どっかで BBB bbb = new BBB(111); AAA aaa = new AAA( bbb ); なんちゃら = aaa.Value… などなど ただ、これが今回適切なのかどうかはもうちょっと広い範囲のコード見ないと何とも言えないです。 もひとつ protected SampleBox _sampleBox; この「_」ですが、CやC++だと前方に付けるのは「予約語やdefine等々とのかぶり」の危険が付きまといます。(将来の拡張もかんがえて) C#だとどうなんでしょう。 と思ってやってみたら 早速 System._AppDomain うーん、やな予感w C#でも、前方に付けるのは避けた方が良いんじゃないでしょうかね。
お礼
ご指摘ありがとうございます。 > 個人的にはGettingValueActionで引数が空でintが戻ってくるというイメージがしにくい(「インスタンス.動作名(とくに~Action)」だと、どっちかっていうと引数をとってそれをもとにインスタンスの内部状態が変わって、引数は関知しない(つまりvoid)っていうイメージ)っていうのがあります。 慌てすぎました。「GettingValueFanc」の間違いです。 > 同じようなことをやるんならFunc<int>で行けませんか? 戻り値を持たないくせに引数を増やされるのは速度の面からもよくありませんし、(今回は)コードの見た目も悪くなるので避けています。 > この「_」ですが、CやC++だと前方に付けるのは「予約語やdefine等々とのかぶり」の危険が付きまといます。(将来の拡張もかんがえて) 実は、この「private」級のフィールド変数の命名には苦心しています。Camel方式ではどうしてもローカル変数とかぶることが多く、自動プロパティの puclic int Aaa { get; set; } で生成されるフィールド変数、「__aaa」を真似ていた時期もあったのですが、何せ、見た目が汚いので止めました。 そんなこんなでフィールド変数の形式の模索とリファクタリングで悠に2~3週間累計で消費しおります。 こちらに関しても、もう少しご意見いただけたら幸いです。
- Yune-Kichi
- ベストアンサー率74% (465/626)
デリゲートの名前については ・イベント用の場合,EventHandlerをサフィックスに付ける ・イベント用以外の場合,Callbackをサフィックスに付ける というのがMSDNに書いてあります。 http://msdn.microsoft.com/ja-jp/library/ms229040.aspx ただし,EventHandler<T>,ActionやFuncといった汎用のデリゲートがあるため, outパラメータやrefパラメータを使う場合を除くと,デリゲートを定義する必要性が乏しいのも事実です。 デリゲート型のプロパティ,というのはあまり例がないのですが,プロパティ自体は基本的に,「名詞・名詞句・形容詞」を付ける,ということになっています。 http://msdn.microsoft.com/ja-jp/library/ms229012.aspx 一応,探すと MSDN: ServicePointManager.ServerCertificateValidationCallback プロパティ (System.Net) http://msdn.microsoft.com/ja-jp/library/system.net.servicepointmanager.servercertificatevalidationcallback.aspx というものが出てきます。信頼できない証明書を受け入れるかどうかを決定するためのコールバックです。 これをプロパティとするのはどうかとは思うのですが,デリゲート型のプロパティを作るのであれば上記のようにサフィックス「Callback」を追加するのはよいと思います。
お礼
解答ありがとうございます。 > ・イベント用以外の場合,Callbackをサフィックスに付けるというのがMSDNに書いてあります。 はい。すっかり忘れていました。これに従えば「ValueChangedHandler」を見習って、「ValueGettingCallback」(この場合は動名詞じゃなくて、未来の意味を含むing形です)ということになりますよね? あと、Actionを参考にして、「ValueGettingAction」、「GettingValueAction」などの型名も思いついたのですが、いかがでしょうか? よろしければ添削をお願いします。
- LongSecret
- ベストアンサー率68% (22/32)
C#にくわしくはありませんが(自分自身の勉強も兼ねて) C++はよくやるので、そこから判断すると デリゲートはざっくり言うと関数ポインタみたいなものですから public delegate int SampleDelegate(); これは、引数なしでint型の変数を戻す、単なる「型」です。 なので、あまり具体的な名前が必要というわけではないというのが普通です。 「この用途で、この辺でだけ使いたい」という事ならpublicにはしないと思いますし もちろん、GettingValueなどなどは抽象的な名前だと思いますがw むしろ、「ぱっと見delegateと分かることの方が」ウエイトは大きいかもしれません。 delegateでintをGetするから DelegGetIntとかでもいいかと。(あくまで例え) あるいは大文字小文字を自分なりに使い分けて 変数の場合はこういうパターンが多い、クラスの場合はこういうパターンが多い というのを揃えることは結構大事です。 私がC++で関数ポインタをtypedefするときは全部大文字ってのが多めで、単なる変数は全部小文字にしがちなので、C#にそのまま当てはめると例えばこうでしょうか private delegate int DELEG_GETINT(); private DELEG_GETINT getvalue; public int Value { get { return getvalue(); } protected set { getvalue = () => { return value; }; } } この辺の流儀は自由でしょうが 本当にこだわるなら、色々なサイトや書籍で「概してこうなってるパターンが多い」というものを採用していけば、誰かが見たときも見やすくなる可能性が高いと思います。 少なくともC++では動名詞ってのはそんなに見ない気がしますね。 もちろん全くではないですが 十分クラスごとに機能分割してれば、単なる動詞一個だけでも挙動がだいたい予測できることもありますし。 ただ getやsetって、通常はこういう感じで使いませんか? internal sealed class AAA { readonly string name; int state; //プロパティを使わない場合は毎回こうなる恐れがあるので internal string GetName() { return name; } internal int State { //stateをprivateにしてState経由でget,set get { return state; } set { state = value; } } internal void IncrementState(){ ++state; } internal AAA(string name_) { name = name_; state = 0; } } あるいは http://ufcpp.net/study/csharp/oo_property.html とかでも ※単なる物のたとえという事ならいいですが public SampleDelegate SampleAction; という風に、敢えてSampleActionをpublicにするのなら SampleActionをそのまま呼び出す、のではだめな状況でしょうか?
お礼
ご意見、ご指摘ありがとうございます。参考にさせてもらいます。 > DelegGetIntとかでもいいかと。(あくまで例え) プレフィックスはなんだか悪いイメージなので「Callback」などのサフィックスにします。 > getやsetって、通常はこういう感じで使いませんか? 実は初期化時にデリゲート変数入りのオブジェクトを渡してもらって、そのオブジェクトごと「protected」フィールドに代入。そのプロパティ内でオブジェクトからデリゲート変数を読み出して使用、という形を取っているのですが、本項とは直接関係が無いと思い、かなり端折って書かせていただきました。 // ―――――――――――――――――――――――――――― // デリゲート変数を格納 protected SampleBox _sampleBox; public int Value { get { return _sampleBox.SampleAction(); } } public SampleClass(…, SampleBox sampleBox, …) { …… _sampleBox = sampleBox; …… } // ―――――――――――――――――――――――――――― > SampleActionをそのまま呼び出す、のではだめな状況でしょうか? 「ptotected」の間違いでした。 「Callback」のサフィックスに従えば「ValueChangedHandler」を見習って、「ValueGettingCallback」(この場合は動名詞じゃなくて、未来の意味を含むing形です)ということになりますよね? あと、Actionを参考にして、「ValueGettingAction」、「GettingValueAction」などの型名も思いついたのですが、いかがでしょうか? よろしければ添削をお願いします。
お礼
ありがとうございます。おかげさまで大助かりです。 インテリセンスってオートコンプリートの事だけかと思っていました。あのツールチップもそうだったのですね。c#に慣れてきてたころに一度VC2010Expressに挑戦してみたのですが、「this->」の時点で意味が分からなくなった上、全然インテリセンスが表示されないのでいったん諦めて、しばらくはc#一本に絞ることにした覚えがあります。 「<include>」、覚えておきます。 初心者の長い質問に付き合ってくださって、ありがとうございました。