- PR -

変数名に変数の型のプレフィックスを付けることに関しての質問および投票です

投票結果総投票数:128
賛成 23 17.97%
反対 84 65.62%
機能限定なら賛成 17 13.28%
その他 4 3.12%
  • 投票は恣意的に行われます。統計的な調査と異なり、投票データの正確性や標本の代表性は保証されません。
  • 投票結果の正当性や公平性について、@ITは一切保証も関与もいたしません。
投稿者投稿内容
あぶぽん
大ベテラン
会議室デビュー日: 2005/10/20
投稿数: 205
投稿日時: 2008-02-12 11:02
引用:

じゃんぬねっとさんの書き込み (2008-02-12 09:30) より:
プロパティ変数は慣例的にはアンダーバーをつけることになっていますね。(今回は '型' に限った話ですので、ここに関して異論はないと見ていますが念のため...)



プロパティ変数というのはメンバー変数のことですね?

僕もメンバー変数には「_(アンダーバー)」をつけます。
アクセサ(プロパティ)のほうにはつけません。

理由は慣例であるということもありますが、

.NETの場合、プロパティという仕様があり、大文字で始めるのが
定石ですね?(メソッドも同じく…)

そこで、メンバー変数のほうは小文字で始めて、プロパティのほうは
大文字で始めるという意見もあるようですが、

VBでは大文字小文字の区別がなく、同様にするとコンパイルエラーに
なるそうで、

僕はVBを使いませんが、他の開発者が僕のモジュールを再利用(変換など…)
することも考えると、大文字小文字のみで判断するような規約にはしない
ほうが良いかと感じています。

という訳で、仕方なく「_(アンダーバー)」をつけます。
一部意見で「見やすい」「分かりやすい」とあったりしますが、
それには同意しません。

なぜ、アンダーバーかというと、
英語だと何か意味があるかととられてしまう可能性があるからです。

また、なぜ、メンバー変数だけプレフィックスをつけるかというと、
僕の場合は、メンバー変数はすべてプライベートにして、必ず、
アクセサ(プロパティが主)を使ってアクセスするからです。

だから、メンバー変数が現れるのは、アクセサ内、もしくは、
場合によってはコンストラクタ内のみということになります。

また、.Net Framework3.0では、プロパティに変数名が必要なくなる
(自動的に用意される)と聞きますので、
これからは、アンダーバーも必要なくなるかと思っています。

因みに、Javaであれば、大文字小文字を意識しない環境から使われること
は(たぶん)なく、アクセサは「getXXX()」「setXXX()」が一般的ですので、
アンダーバーを使うことはありません。

じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2008-02-12 11:44
引用:

未記入さんの書き込み (2008-02-12 09:56) より:

プロパティはアンダーバーを付けることに異論はありません。
ですが、アンダーバー+プレフィックス+変数名となります。


これはさすがに頂けないですね。 プロパティ変数は直接扱わないので型のプレフィクスがついていても意味がありません。 あ! プロパティ名さえ型を示すプリフィクスがついているから、プロパティ変数も同様になるというオチっぽいですね。

引用:

ただ開発規約で強制されるのは、開発者にとってすごくストレスに感じませんか?


嫌いなものを押し付けられれば誰でもストレスは溜まると思いますよ。 ハンガリー記法に限った話ではなく、私も某 S 社の規約には泣かされてきました。

引用:

会社によりStringのプレフィックスがstrだったり、sだったり・・・
いちいちプレフィックス一覧からプレフィックスを探して・・・面倒ですよね!?


会社によって切り替えることに慣れちゃったのであまり苦にはならなくなりましたが、当初は確かに混乱しました。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2008-02-12 11:51
引用:

あぶぽんさんの書き込み (2008-02-12 11:02) より:

プロパティ変数というのはメンバー変数のことですね?


プロパティの実体になるフィールド メンバのことです。

"メンバ変数" だと、状態を示す単なるフィールド メンバなども含まれる (この場合はアンダーバーではなく Camel 形式の表記になりここでは別物です) ので誤解を避けるためにプロパティ変数という言葉を使ってしまいました。 一般的な言葉ではありませんね。(VB6 時代の雛形コードに記載はあります) 申し訳ありません。

引用:

僕もメンバー変数には「_(アンダーバー)」をつけます。
アクセサ(プロパティ)のほうにはつけません。

理由は慣例であるということもありますが、


ガイドラインでは明示はされていませんが、NCL ではそうなっている (すべてではない) ようなので、私もそれに倣っています。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
あぶぽん
大ベテラン
会議室デビュー日: 2005/10/20
投稿数: 205
投稿日時: 2008-02-12 12:08
それよりも、意見を頂戴したいことがあるのですが、

1.「.NETではプロパティは大文字で始めるのが定石」
(これは、間違いないですよね?)

2.「クラス名には「C」などプレフィックスは付けない」
(マイクロソフトが推奨していると聞きました)

1、2から、

クラスAのプロパティとしてクラスBのインスタンスを持つとき、
クラスBのクラス名とプロパティ名がぶつかることってないですか?

コード:
例)
※仮コードです

// レンタカーの車ID
Class CarID {
    // 省略
}

// レンタカーの客情報
Class CustomerInfo {
    public uint ID {get; set;}  // 客ID
    public CarID CarID {get; set;}  // 車ID
}



上記はレンタカー・システムの一部で、
車IDは当初uintでしたが、IDの中に意味を持たせるという要求のため、
クラスに変えました。

客IDのほうを変更するなら、クラス名はCustomerIDで、プロパティ名は
IDでOKかと思いますが、

車IDのほうは、そうはいきません。
意味をもとに考えてもやっぱりCarIDかな? と。。。

現状は、CurrentCarIDとか、OwnCarIDとか考えまして、
最終的に、RentalCarIDとしていますが、

全体がレンタカーシステムですから、冗長な気もします。

Javaなら、
コード:
private CarID carID;
public CarID getCarID();
public void setCarID(CarID id);


とするところですが、

.NETの定石はどうなんでしょうか?

上記は一例ですので、一般的にどうなのか?
そんなことになること自体がおかしい(設計が悪い)のか?
あぶぽん
大ベテラン
会議室デビュー日: 2005/10/20
投稿数: 205
投稿日時: 2008-02-12 12:14
すみません。
別スレッドにすべきでした。。。が、これから会議が(^_^;;

新スレッド先に作ってもらっても結構です。。。って、ぉぃ!
あぶぽん
大ベテラン
会議室デビュー日: 2005/10/20
投稿数: 205
投稿日時: 2008-02-12 12:35
会議中。。。気になったので。。。

引用:

じゃんぬねっとさんの書き込み (2008-02-12 11:51) より:
引用:

あぶぽんさんの書き込み (2008-02-12 11:02) より:

プロパティ変数というのはメンバー変数のことですね?


プロパティの実体になるフィールド メンバのことです。

"メンバ変数" だと、状態を示す単なるフィールド メンバなども含まれる (この場合はアンダーバーではなく Camel 形式の表記になりここでは別物です) ので誤解を避けるためにプロパティ変数という言葉を使ってしまいました。 一般的な言葉ではありませんね。(VB6 時代の雛形コードに記載はあります) 申し訳ありません。



「プロパティの実体になるフィールド メンバ」というのが公式名称でしょうか?

また、「状態を示す単なるフィールド メンバ」とは、何でしょう?
フィールド メンバとしては存在するけれど、プロパティは定義しないということ
でしょうか?

つまり、private, protected(internalも?)なフィールド メンバと。。。

もし、そうなら、僕はソレも必ずプロパティにしています。
OO的にはそうすべき理由がたくさんありますが、
.NET的になにか不味いことってありますか?

あと、Camel形式は、大文字始まりですか?
だとすると、インテリセンスなどでプロパティ名とかぶって見辛いことが。。。


責めるつもりは全然ありませんので。。。まじめな質問と受け取ってください(^_-)-☆

# いつか、「どっとねっとふぁん」さんを「じゃんぬねっとふぁん」さんと
# 書き間違えたという爆笑スレッドがありましたが、
# その方と同様、僕も、じゃんぬねっとさんのファンですから(笑)

あぶぽん
大ベテラン
会議室デビュー日: 2005/10/20
投稿数: 205
投稿日時: 2008-02-12 14:33
一部を自己レス

引用:

あぶぽんさんの書き込み (2008-02-12 12:35) より:
あと、Camel形式は、大文字始まりですか?
だとすると、インテリセンスなどでプロパティ名とかぶって見辛いことが。。。



Camel 形式

識別子の最初の文字は小文字にし、後に続いて連結されている各単語の最初の文字を大文字にします。次に例を示します。

backColor
http://msdn.microsoft.com/library/ja/default.asp?url=/library/ja/cpgenref/html/cpconpropertynamingguidelines.asp

とありました。すみません<m(__)m>
この質問は忘れてください<m(__)m>

じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2008-02-12 19:02
引用:

あぶぽんさんの書き込み (2008-02-12 12:35) より:

会議中。。。気になったので。。。


会議に集中しましょうw

引用:

「プロパティの実体になるフィールド メンバ」というのが公式名称でしょうか?


私なりに説明じみた言葉で書いてみただけですので、公式名称ではないと思われます。 公式名称らしい名称は私は聞いたことがないです。 VB6 では 「プロパティ変数」 で通用すると思います。

引用:

また、「状態を示す単なるフィールド メンバ」とは、何でしょう?
フィールド メンバとしては存在するけれど、プロパティは定義しないということでしょうか?


簡単に言えばそういうことになります。 クラス内でのスコープで宣言されている以上、'クラスの状態を示す (管理する) 何か' という見方で差し支えないと思います。

引用:

つまり、private, protected(internalも?)なフィールド メンバと。。。


アクセス修飾子はあまり関係ないですね。 フィールドはフィールドですから。

引用:

もし、そうなら、僕はソレも必ずプロパティにしています。
OO的にはそうすべき理由がたくさんありますが、
.NET的になにか不味いことってありますか?


ないですよ。 仮に Private なプロパティであっても推奨したいくらいです。

引用:

あと、Camel形式は、大文字始まりですか?
だとすると、インテリセンスなどでプロパティ名とかぶって見辛いことが。。。


大文字始まる単語ごとに大文字始まりは Pascal 形式です。 Camel は小文字始まり単語ごとに大文字始まりです。 らくだ (Camel) のコブの如しですね。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌

スキルアップ/キャリアアップ(JOB@IT)