- まいるどきゃっと
- 大ベテラン
- 会議室デビュー日: 2004/08/12
- 投稿数: 135
- お住まい・勤務地: 群馬
|
投稿日時: 2006-02-14 11:48
メンバ変数とローカル変数を見分けやすくするためにプリフィックスをつけるという人がいますが、そのためにプリフィックスつけるくらいならmeやthisをつけるほうがスマートだと感じます。
そんなわけで、私はメンバ変数にはかならずmeやthisをつけてます。
冗長さを気にしているようですが、昔のVBやVCのプログラムであった意味不明なプリフィックスに比べたら全然ましです
|
- じゃんぬねっと
- ぬし
- 会議室デビュー日: 2004/12/22
- 投稿数: 7811
- お住まい・勤務地: 愛知県名古屋市
|
投稿日時: 2006-02-14 12:03
引用: |
|
囚人さんの書き込み (2006-02-14 11:42) より:
さっきのは「Me、thisを使うとしたら」というただの例です^^;
|
このあたりって、プロパティにも関連するので、ちょっとだけ。
VB の方が良いと判断して VB で書きます。
コード: |
|
Public Class Shuujin
#Region " MemberCode プロパティ "
Private _MemberCode As Integer
Public ReadOnly Property MemberCode() As Integer
Get
Return Me._MemberCode
End Get
End Property
#End Region
#Region " MemberName プロパティ "
Private _MemberName As String
Public ReadOnly Property MemberName() As String
Get
Return Me._MemberName
End Get
End Property
#End Region
#Region " インスタンスの状態を返すメソッド "
Public Function ToString() As String
' 自身のインスタンス メンバであると明示化できる
Return Me.MemberCode.ToString() & " : " & Me.MemberName
' 静的メンバなのか、ローカルなのか "この 1 ステートメント" だけではわからない
'Return MemberCode & " : " & MemberName
End Function
#End Region
#Region " 何かしろの静的メソッド "
Private Shared nanika As String
Private Shared korekore As String
Public Shared Function NanikaMethod() As String
' 皆さん、自身の静的メンバはどうしてます?
Return Shuujin.nanika & Shuujin.korekore
End Function
#End Region
End Class
|
まあ、請負とかやるとポリシとか決められちゃうので、完全に実施できていない現実がありますが。
それと、まいるどきゃっとさんの意見に大賛成。
スコープに関してハンガリー記法を使わなければならないのは、
メンバの範囲がうまく切り分けられていない証拠ですね。
そもそも、今の言語ではそんな広範囲な変数はたくさん使うことはないですよね。(^^)
_________________ C# と VB.NET の入門サイト
じゃんぬねっと日誌
|
- 囚人
- ぬし
- 会議室デビュー日: 2005/08/13
- 投稿数: 1019
|
投稿日時: 2006-02-14 13:14
スコープによって名前を特別扱いしないというのは賛成だけども、次のような事があるからメンバ変数は何かつけますね。
コード: |
|
class Class1
{
private string prefixIsFloccinaucinihilipilification;
public Class1( string prifixIsFloccinaucinihilipilification )
{
this.prefixIsFloccinaucinihilipilification = prefixIsFloccinaucinihilipilification
}
}
|
上記は非常に分かりづらいバグにです。(こんな長い名前をつけるのは馬鹿げていますが^^;)
コンパイルエラーにもならないし、実行時に例外をスローしてくれるわけでもありません。
どこかで prefixIsFloccinaucinihilipilification を使うときに何故か値が入っていないのです。何故値が入っていないのか、すぐには分かりません。
コード: |
|
class Class1
{
private string _prefixIsFloccinaucinihilipilification;
public Class1( string prifixIsFloccinaucinihilipilification )
{
_prefixIsFloccinaucinihilipilification = prifixIsFloccinaucinihilipilification
}
}
|
引用: |
|
' 皆さん、自身の静的メンバはどうしてます?
|
Me、this つけない派だから、当然何もつけない…かな。
コード: |
|
Public Shared Function NanikaMethod() As Boolean
Return ReferenceEquals( nanika, korekore )
End Function
|
_________________ 囚人のジレンマな日々
|
- R・田中一郎
- ぬし
- 会議室デビュー日: 2005/11/03
- 投稿数: 979
|
投稿日時: 2006-02-14 14:05
引用: |
|
じゃんぬねっとさんの書き込み (2006-02-14 11:31) より:
引数とインスタンス メンバの名前の衝突は明示化すれば問題になりませんが、
ややこしいので、私は明示的に名前をわけることにしています。
|
引用: |
|
囚人さんの書き込み (2006-02-14 11:42) より:
真似しないでぇ。私も名前を分ける方を推奨します。
さっきのは「Me、thisを使うとしたら」というただの例です^^;
|
良く見たら「使うとしたら」って確かに書いてありました。
今修正を終えたばかり orz
なるほど囚人さんのサンプルコードでは、コンパイラを通っちゃいますね。
丁寧にご説明いただいてありがとうございました。
早速、Ctrl+Z します。
コード: |
|
Public Sub New(ByVal 番号初期値 As Integer, ByVal 名前初期値 As String)
Me.番号 = 番号初期値
Me.名前 = 名前初期値
If (Not Me.番号の値は有効値()) Then
Throw (New ArgumentOutOfRangeException("番号値が無効です"))
End If
End Sub
|
ちなみに、上記の「番号初期値」,「名前初期値」は、皆さんどんな風につけていますか?
引用: |
|
まいるどきゃっとさんの書き込み (2006-02-14 11:48) より:
メンバ変数とローカル変数を見分けやすくするためにプリフィックスをつけるという人がいますが、そのためにプリフィックスつけるくらいならmeやthisをつけるほうがスマートだと感じます。
|
確かに、その通りですね。
それと型にプリフィックス付けるのも、僕はあまり好きじゃなかったです。
dim intCode as Integer : intCode = 5
dim strName as String : strName = "R.Tanaka.Ichiro"
但し、どちらも優れている点として、変数名をつけるのに悩まなくて済むというものがありますw
str を取ると、コンパイラに蹴られるし、New で初期値をとるのも、○○初期値とするのも長くなるし・・・
どうでもいいところかもしれないけど変数名つけるのは結構悩む方なんです。
引用: |
|
じゃんぬねっとさんの書き込み (2006-02-14 12:03) より:
' 皆さん、自身の静的メンバはどうしてます?
|
さすがじゃんぬねっとさん、確かに悩みどころのツボです。
でも付けないのが正しいように思いますが。
|
- まいるどきゃっと
- 大ベテラン
- 会議室デビュー日: 2004/08/12
- 投稿数: 135
- お住まい・勤務地: 群馬
|
投稿日時: 2006-02-14 14:14
メンバ変数にプリフィックスをつける利点として大きいものは、囚人さんが挙げているような理由ですよね。
ふと気になったのですが、メソッドの引数の方にプリフィックスを付けても対応できるわけですが、なぜかそういう意見ってほとんど聞いたことない気がします。なぜなんでしょ?
# じつはこの間、ボケてこんな感じの失敗しちゃいました。
# 何故かメンバのプリフィックスと引数のプリフィックスよく間違えちゃうんです
コード: |
|
class Foo {
private string _bar;
public Foo(string _bar) {
_bar = _bar;
}
}
|
|
- Blue
- 大ベテラン
- 会議室デビュー日: 2005/09/12
- 投稿数: 230
- お住まい・勤務地: 知っている人は知っている
|
投稿日時: 2006-02-14 14:24
引用: |
|
R・田中一郎さんの書き込み (2006-02-14 14:05) より:
引用: |
|
まいるどきゃっとさんの書き込み (2006-02-14 11:48) より:
メンバ変数とローカル変数を見分けやすくするためにプリフィックスをつけるという人がいますが、そのためにプリフィックスつけるくらいならmeやthisをつけるほうがスマートだと感じます。
|
確かに、その通りですね。
それと型にプリフィックス付けるのも、僕はあまり好きじゃなかったです。
dim intCode as Integer : intCode = 5
dim strName as String : strName = "R.Tanaka.Ichiro"
|
ここでいうプリフィックスは
メンバ変数は
m_Code や m_Name、
グローバル変数は
g_Code や g_Name
というもので、その変数の型を表すものではないのでは?
(ハンガリアンなんてコーディング規約になっていない限り書かないほうがいい。)
# この話は、探せばスレがありますね。
私はなるべく this をつける派です。
[ メッセージ編集済み 編集者: Blue 編集日時 2006-02-14 14:27 ]
|
- 囚人
- ぬし
- 会議室デビュー日: 2005/08/13
- 投稿数: 1019
|
投稿日時: 2006-02-14 14:26
引用: |
|
ふと気になったのですが、メソッドの引数の方にプリフィックスを付けても対応できるわけですが、なぜかそういう意見ってほとんど聞いたことない気がします。なぜなんでしょ?
|
外面(そとづら)は良く見せたいからです。
公開(public、外から見える)ものは美しく、内では多少汚れても構わないからでしょうね。
_________________ 囚人のジレンマな日々
|
- じゃんぬねっと
- ぬし
- 会議室デビュー日: 2004/12/22
- 投稿数: 7811
- お住まい・勤務地: 愛知県名古屋市
|
投稿日時: 2006-02-14 14:53
R・田中一郎さんの建てるスレはコーディング標準系... _φ(。。)
引用: |
|
R・田中一郎さんの書き込み (2006-02-14 14:05) より:
ちなみに、上記の「番号初期値」,「名前初期値」は、皆さんどんな風につけていますか?
|
"この場合の" 初期値だけに関して言えば、.NET 的には、
コード: |
|
Public Sub New(ByVal code As Integer)
Me.Code = code
End Sub
|
だったり、
コード: |
|
Public Sub New(ByVal newCode As Integer)
Me.Code = newCode
End Sub
|
なんでしょうけど、メソッドになると、
プロパティの Setter が Value になるというのと合わせて、
コード: |
|
Public Sub SetCode(ByVal Value As Integer)
Me.Code = Value
End Sub
|
米圏では、
コード: |
|
Public Sub SetCodeAndName(ByVal aCode As Integer, ByVal aName As String)
Me.Code = aCode
Me.Name = aName
End Sub
|
などもありますね。
さらに VB6 以前だと、
コード: |
|
Public Sub SetCodeAndName(ByVal iCode As Integer, ByVal stName As String)
Me.Code = iCode
Me.Name = stName
End Sub
|
などとプリフィクスを付けることもあります。
引用: |
|
さすがじゃんぬねっとさん、確かに悩みどころのツボです。
でも付けないのが正しいように思いますが。
|
はい、私は付けていません。(外部クラスに見えちゃうので)
VB の場合、インスタンス メソッドの呼び出しに関しては、
Call をつけて明示化していた時期がありましたが、今では Call すら付けていません。
中には、MyStatic みたいな名前にして、エイリアス チックに対応している人もいます。
_________________ C# と VB.NET の入門サイト
じゃんぬねっと日誌
|