アプリ版:「スタンプのみでお礼する」機能のリリースについて

 こんにちは。c#初心者です。

 今回はデリゲート関連の命名についての質問です。

// ―――――――――――――――――――――――――――――――
// 簡素化のため、フィールド変数のまま書いています

public delegate int SampleDelegate();


public SampleDelegate SampleAction;


public int Value
{
  get { return SampleAction(); }
}

// ―――――――――――――――――――――――――――――――

 上記のようなコードを書いているのですが、「SampleDelegate」に当たる部分、「SampleAction」にあたる部分にはどのような名前をつければいいのかと迷っています。

 SampleDelegateは値を取得するメソッドを表すので「GettingValue」や、「ValueGetter」がいいのか、それとも「ValuePasser」みたいなのがいいのか、それ以外がいいのか、
 SampleActionも「ValueGetter」がいいのかそれとも、メソッドと同じように「GetValue」にするのがいいのかそれ以外がいいのかと悩んでいます。

 最初は「SampleDelegate」が「GettingValue」、「SampleAction」が「ValueGetter」になっているのですが、反対の方がいいような気がしたり、その他いろいろで困っています。

 どなたか詳しい方いらっしゃいましたら教えていただけませんか? できれば「『SampleAction』は動作自体だからGettingValueのように『~すること』 のように動名詞を使い方がいい」のように他の命名においても応用が利く教え方にしていただけるとありがたいです。

A 回答 (27件中21~27件)

>「__」および「_+大文字」で始まる識別子は~たぶんこの辺は C# でも同じなんじゃないでしょうか.



あ~!
なるほど、正確にはそういう風になっていたのですか。
それは大変失礼しました。

C++だと、連続して使うならちょー短い名前のローカルのポインタconst変数に移し替えることが多かったので「ぜってー使わん!」でも全然OKだったのですが。

C#だったらフィールドに前置き「_」使うとよさそうですね。



> 残念ながら、その、ライブラリを作っているのです。

なるほど、そういう御用件でしたか


>パブリック フィールドとプロテクト フィールドは適切にバージョン管理されず、またコード アクセス セキュリティ要求によって保護されません。 パブリックに参照可能なフィールドを使用する代わりにプライベート フィールドを使用し、それをプロパティを通じて公開してください。 


そのまんまだと思います。
内部的に適切にバージョン管理されないようになってしまうので(どうしてそうなるかはMSしか知らないブラックボックスでも、問題ない)

公開するクラスライブラリのフィールドは
全部privateにしとけ、ということでしょう



これは基本的なことですが

「局在性の高いもの」ほど
短い名前で済みやすいというのが挙げられます。

publicよりprotectedが、protectedよりprivateが
メンバよりローカル変数のが

作用する相手は少なくて済むので、より短い名前で十分、というのはC、C++、C#すべて共通で言えると思います。

ローカル変数なんて、その関数内で使う数が少ないなど「実装者が十分バグフィックス楽なら」小文字1つでもOKなこともあります。
    • good
    • 0
この回答へのお礼

 なるほど。勉強になりました。ありがとうございます。これから修正していきます。

お礼日時:2012/03/01 00:10

すみません, C# と関係ないところで 1点突っ込ませてください>#3.



「__」および「_+大文字」で始まる識別子は完全に処理系予約ですが, 「_」で始まるその他の識別子は
・C なら「ファイルスコープ」で予約
・C++ なら「グローバル名前空間」 (と ::std 名前空間) で予約
です. つまり, どちらにおいても構造体メンバや関数にローカルな変数 (引数を含む) 名には利用可能です. たぶんこの辺は C# でも同じなんじゃないでしょうか.

もっとも, 「ふつ~の識別子」を使っても規格が変わったらアウトだったりしますが.

戻って, と.

あ, 「delegate には命名規則がある」ということは, 逆に言えば
Func<ほにゃらら> なんかを使えば「自由な名前にできる」
かも. ただ, そうするとやっぱり「使う場面」を想定しておく必要があるんじゃないかな. もちろん delegate (相当) なので「使う場面」には
・その delegate (相当) を取り出す場面
・取り出した delegate (相当) を使ってメソッドなりなんなりを呼び出す場面
の両方を考えないといけないんでしょうね.
    • good
    • 0

Func<int>



delegate int デリゲート名();

とおんなじことですよ。
Actionは戻り値voidですが
Funcの場合、<>内が一個なら
Func<戻り値>で
二個以上だと

Func<引数1, 引数2, 戻り値>

等のようになります。



>実は、この「private」級のフィールド変数の命名には苦心しています。

もし大量に既に作ってしまっているなら
その部分については一端そのままでもいい、かもしれません。
(将来バージョンアップでコンパイルエラーが出たらそこだけ直す、など)


「これ以上ないシンプルかつ分かりやすい名前」というのは、その場の全体の構造の影響をうけますから

何がどうなってるのかが見せていただくことが出来れば
(オブジェクト指向的な構造化というのはC++でもC#でも十分通じるところがあると思うので)

もうちょい方法を考えれる、かもしれません。
    • good
    • 0
この回答へのお礼

 ご指摘ありがとうございます。
> なので、koumei000さんがライブラリ作成時の話をされているのならこの通りでしょうが
 残念ながら、その、ライブラリを作っているのです。
 先ほどフィールドのデザインを見たのですが、それによると「protected」なフィールドはダメと在るのですが、具体的にはどうダメなのでしょうか?
(パブリック フィールドとプロテクト フィールドは適切にバージョン管理されず、またコード アクセス セキュリティ要求によって保護されません。 パブリックに参照可能なフィールドを使用する代わりにプライベート フィールドを使用し、それをプロパティを通じて公開してください。 → ???)


> Func<int>はdelegate int デリゲート名();とおんなじことですよ。

 お恥ずかしいことに
 「delegate void Fanc<TResult>(out TResult result)」
 と見間違えていたようです。


 また、以前

https://github.com/mono/mono/blob/master/mcs/cla …

などmonoのサンプルを見たので、フィールド変数の頭にアンダースコアをつけるようになったのですが、参考にしないほうがよかったのでしょうか? あと、アンダースコアを使わないとすれば、どうするのがよいでしょうか?

お礼日時:2012/02/29 16:30

て#2さんのリンク先って


「クラス ライブラリ開発のデザイン ガイドライン」

じゃないですかw
どうも規則(書かれ方)がかつかつすぎないかと思ったらw

これは「後で別のアセンブリから使いまわされるライブラリ」を開発するなら、こういうガイドラインに沿った方がいいだろう
という提案なので


http://msdn.microsoft.com/ja-jp/library/ms229042 …

>一貫性のないライブラリ デザインは、開発者の生産性を損なうだけでなく、ライブラリを採用する意欲を失わせます。

「採用する意欲」という言葉からわかるように、これは自分だけで使うものとはちょっと事情が異なります。


なので、koumei000さんがライブラリ作成時の話をされているのなら
この通りでしょうが

exeに入るinternalな感じのクラスとかだったら、もうちょっと自由でいいと思います。
    • good
    • 0

なるほど、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#でも、前方に付けるのは避けた方が良いんじゃないでしょうかね。
    • good
    • 0
この回答へのお礼

 ご指摘ありがとうございます。

> 個人的にはGettingValueActionで引数が空でintが戻ってくるというイメージがしにくい(「インスタンス.動作名(とくに~Action)」だと、どっちかっていうと引数をとってそれをもとにインスタンスの内部状態が変わって、引数は関知しない(つまりvoid)っていうイメージ)っていうのがあります。

 慌てすぎました。「GettingValueFanc」の間違いです。

> 同じようなことをやるんならFunc<int>で行けませんか?
 戻り値を持たないくせに引数を増やされるのは速度の面からもよくありませんし、(今回は)コードの見た目も悪くなるので避けています。

> この「_」ですが、CやC++だと前方に付けるのは「予約語やdefine等々とのかぶり」の危険が付きまといます。(将来の拡張もかんがえて)

 実は、この「private」級のフィールド変数の命名には苦心しています。Camel方式ではどうしてもローカル変数とかぶることが多く、自動プロパティの
puclic int Aaa { get; set; } で生成されるフィールド変数、「__aaa」を真似ていた時期もあったのですが、何せ、見た目が汚いので止めました。
 そんなこんなでフィールド変数の形式の模索とリファクタリングで悠に2~3週間累計で消費しおります。
 こちらに関しても、もう少しご意見いただけたら幸いです。

お礼日時:2012/02/29 15:44

デリゲートの名前については


・イベント用の場合,EventHandlerをサフィックスに付ける
・イベント用以外の場合,Callbackをサフィックスに付ける
というのがMSDNに書いてあります。
http://msdn.microsoft.com/ja-jp/library/ms229040 …

ただし,EventHandler<T>,ActionやFuncといった汎用のデリゲートがあるため,
outパラメータやrefパラメータを使う場合を除くと,デリゲートを定義する必要性が乏しいのも事実です。


デリゲート型のプロパティ,というのはあまり例がないのですが,プロパティ自体は基本的に,「名詞・名詞句・形容詞」を付ける,ということになっています。
http://msdn.microsoft.com/ja-jp/library/ms229012 …

一応,探すと
MSDN: ServicePointManager.ServerCertificateValidationCallback プロパティ (System.Net)
http://msdn.microsoft.com/ja-jp/library/system.n …
というものが出てきます。信頼できない証明書を受け入れるかどうかを決定するためのコールバックです。
これをプロパティとするのはどうかとは思うのですが,デリゲート型のプロパティを作るのであれば上記のようにサフィックス「Callback」を追加するのはよいと思います。
    • good
    • 0
この回答へのお礼

 解答ありがとうございます。

> ・イベント用以外の場合,Callbackをサフィックスに付けるというのがMSDNに書いてあります。

 はい。すっかり忘れていました。これに従えば「ValueChangedHandler」を見習って、「ValueGettingCallback」(この場合は動名詞じゃなくて、未来の意味を含むing形です)ということになりますよね?
 あと、Actionを参考にして、「ValueGettingAction」、「GettingValueAction」などの型名も思いついたのですが、いかがでしょうか? よろしければ添削をお願いします。

お礼日時:2012/02/29 13: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をそのまま呼び出す、のではだめな状況でしょうか?
    • good
    • 0
この回答へのお礼

 ご意見、ご指摘ありがとうございます。参考にさせてもらいます。
> 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」などの型名も思いついたのですが、いかがでしょうか? よろしければ添削をお願いします。

お礼日時:2012/02/29 13:50

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!