- PR -

現在のインスタンスを参照するthisキーワード、付ける? or 付けない?

投票結果総投票数:259
付ける 99 38.22%
付けない 66 25.48%
付けたり付けなかったり 94 36.29%
  • 投票は恣意的に行われます。統計的な調査と異なり、投票データの正確性や標本の代表性は保証されません。
  • 投票結果の正当性や公平性について、@ITは一切保証も関与もいたしません。
投稿者投稿内容
ネットクラゲ
会議室デビュー日: 2007/07/10
投稿数: 1
投稿日時: 2007-07-10 23:52
私の場合は、thisキーワードを使用せずに、インスタンス変数に
プレフィックス(_)をつけて区別します。

thisキーワードではなく、プレフィックスを使用する理由は、
(thisキーワードやプレフィックスの付け忘れを考慮した場合、)
事前にインスタンス変数が全てプレフィックス付きで定義されていることを
確認しておけば、プレフィックスの付いていない変数は全てローカル変数
であると判断できるからです(メソッド内での定義の有無を逐一確認せずに済む)。
# thisキーワードを使用する場合はこれができません。


よねKEN
ぬし
会議室デビュー日: 2003/08/23
投稿数: 472
投稿日時: 2007-07-11 00:02
引用:

nagiseさんの書き込み (2007-07-10 11:12) より:
ちょっと主張が後だしになってしまっていますが、お気を悪くなさらずに。

私がthisをつけろ、つまりフィールドと一時変数を区別せよ、というのは
オブジェクトのステータスの変更と言うものに対して特に注意を払え
ということがあります。



気を悪くするとかは特にありませんが(^^;
「thisを付けることで誤認を防ぐ」という主張と一緒に
「同じものは同じ名前で付けたい」ということも主張されていたので、
セットでの主張だと考えていました。

オブジェクトのステータスの変更に注意が払えればよい
(平たく言えば、インスタンス変数が目立てばよい、でよいですよね?)
ということであれば、好み的なことを抜きにすれば、
thisでなくプレフィックスを付けるというのも場合によって"あり"ということでしょうか。

引用:

nagiseさんの書き込み (2007-07-10 11:12) より:
ただ、私見では冗長なのはm_の方ではないかな、と思いました。
言語仕様で用意されているthis.の記法と
命名ルールによるm_のどちらを優先するか?ということになるのかな?



インスタンス変数を目立たせるという点ではどちらにも同様の効果はありますね。
ところで、「インスタンス変数の使用にthisを必ず付けること」
というルールにした場合、どうやってチェックされるのでしょうか?
(FxCopは使ったことがないのですが、この辺でチェックできるのでしょうか?
JavaでEclipseの場合でもCheckStyleにそういう定義があったか覚えがありません)

プレフィックスを付けるルールの場合は、インスタンス変数の定義部分を
チェックすれば守られているかどうかを判断できます。
#CheckStyleならチェック可能ですが、FxCopについてはこれまた知りません。
#が、このくらいなら目検で大丈夫かと思います。
よねKEN
ぬし
会議室デビュー日: 2003/08/23
投稿数: 472
投稿日時: 2007-07-11 00:27
引用:

じゃんぬねっとさんの書き込み (2007-07-10 11:43) より:
うちの場合は 'm_' に限らずプリフィクスを嫌うメンバが多かったです。 その理由はと聞くと 「(m_ の場合ですが) Shift キーが面倒」 「this は打ち慣れているぜ」 「文字の色が変わるからわかりやすい」 というものでした。 これに関しても 「その程度の理由か」 という意見もきっとあるでしょう。



そういうメンバーなら、プレフィックス案でなくthisを付ける案にする方が合理的だと思います。
十分な理由だと思いますよ。

引用:

じゃんぬねっとさんの書き込み (2007-07-10 11:43) より:
nagise さんがすでに書かれているので多くは割愛しますが、この姿勢はないです。 強いていうならば、どうせ少ないのだから明示しようよ。 目立たせようよ。です。



じゃんぬねっとさんは、「インスタンス変数とローカル変数を同名で扱いたい」というような主張はされていなくて、
「あくまでインスタンス変数だと明示できるから」という主張と理解しています。

引用:

この時点でも個人差がありますね。 C#, J#, C++/CLI では this、VB では Me の方が視覚的にわかりやすいと感じる人も多いでしょう。 色に関してはエディタによる前提が必要です。 あとは 「見慣れ」 とか本当に個人差でしかないと思います。「直感でわかる人の数」 を重点に this なのかプリフィクスなのか決めれば良いとは思います。



そうですね。"「直感でわかる人の数」 を重点に"という部分は特に重要だと思います。
あくまで私見ですが、なちゃさんが、
「ところで。
 開発者の感じる、うざい、くどいって
 結構重要だと思うのですよ。」
とコメントされた理由もこういうことだと思っています。

↓以下は前から考えていたことというより、どちらかというと
このスレを何度か読み直して、「うざい」「くどい」の理由を考えた流れで出てきた考えです。

私の場合、Java、C#、VBでthisやMeを必ず付けるか/付けないかについて
どちらかに統一すべきでは?と何度か考えました。で、今までプログラミングしてきて、
結局、一貫してどちらに統一するのもなんかしっくりこないんですよね。
その結果で今はどっちでもいい派なんですが。
これは完全に感覚的なもので、あまり合理性はないと思います

プロジェクトとしてルールで決まっていれば、それに従いますが、
どちらの方針にしても、それに合わせるためにそれ相応の工数がかかり、
かつ、(個人的にどちらでもよいと思っている部分に労力がかかることが)ストレスにもなる
なぁと思っていました。そして、それは他のプログラマにも少なからず当てはまるのではないかなと。
nagise
ぬし
会議室デビュー日: 2006/05/19
投稿数: 1141
投稿日時: 2007-07-11 00:42
引用:

よねKENさんの書き込み (2007-07-11 00:02) より:
インスタンス変数を目立たせるという点ではどちらにも同様の効果はありますね。
ところで、「インスタンス変数の使用にthisを必ず付けること」
というルールにした場合、どうやってチェックされるのでしょうか?
(FxCopは使ったことがないのですが、この辺でチェックできるのでしょうか?
JavaでEclipseの場合でもCheckStyleにそういう定義があったか覚えがありません)


JavaでEclipseの場合はCheckStyleでいけますね。
このような機械チェックによって全てにthisが付いていることを保障できるという前提の場合と、
機械チェックが出来ない環境という前提では結論は大きく違うとも思います。
ネットクラゲ氏の意見も機械チェックがない環境での結論ですよね。

また、thisを付け忘れて
コード:
public setHoge(int hoge) {
  hoge = hoge;
}


としてしまった場合なども警告がでますので、このIDE下では
名前が同じであるが故の実用上の問題はありません。

「オブジェクトのステータスの変更と言うものに対して特に注意を払え」
という理由はインスタンス変数を目立たせる理由としては十分すぎると思いますが、
さて、命名規約で目立たせようか、this(あるいはMe)で目立たせようか、となれば
言語規約の機能であるthisやMeのほうが誤解がないと思います。

thisやMeは本来つけることができないものには付けられないわけですから、
言語の機能としてサポートされているキーワードの強みがありますね。
また、こういった標準キーワードであれば多くのエディタでハイライトされることが
期待できるわけですから、あえてプリフィックスを採用する積極的な理由はないと思います。
まりも
ベテラン
会議室デビュー日: 2006/08/19
投稿数: 77
投稿日時: 2007-07-11 00:43
引用:
coasmさんの書き込み (2007-07-10 02:29) より:

せっかく抽象度の高いレベルで思考していたのを実装レベルまで引きずり落とす愚行、ではないかと。



ちょっと抽象的なようにも思えますが、私もまさに、こういうことが言いたいのだと思います。

引用:
じゃんぬねっとさんの書き込み (2007-07-10 10:10) より:

ただ (あくまでも私の場合になってしまいますが) this をすべて付けるとしても、そのメンバの数はそれほど多くないことが多いです。 むしろ多くなった場合は、Private 以上のアクセス修飾子を持つメンバが多すぎやしないかとクラス設計を見直すかもしれません。(今のところはないですが)



これは大変説得力がありますね。確かにあんまり数はないはずです。結構見にくいような気がしたものだが。気のせいだったのか。

気のせいの可能性も高いですが、もし気のせいでないとするなら。
「必ず」つけるということになると、「thisが付いている」ということが意味を持つと同時に、「thisが付いていない」ということも一つの記号となり、その意味を見るたびに読み取る必要が出てきます。
その辺ともども、頭に負荷をかけているような気がします。

引用:
"一度に考えなくてはならないことを狭くするために" とありますが、これはちょっとおかしくないでしょうか? this を付けるという場面 (位置) は、そのメソッドのローカル変数にもインスタンス内の Private メンバにもアクセスできますよね。



この局面だけを考えれば、その通りなのですが。
ただ、インスタンスやらスコープやらアクセス修飾子やら、変数を使える範囲を指定する数多くの手段があり、きめ細かな指定ができるようになっているのは、総じて思考を節約するためですよね?

だから総じて、その辺の機能の使い方の指針としては、宣言するときに極力考えて、使う時にはなるべく何も考えない、というのが理にかなっていると思うのです。

引用:
"可読性" は個人の主観なのでともかくとして、this を付ける / 付けないが "保守性" や "拡張性" にどのように直結しているとお考えなのでしょうか?



すみません。わかりにくかったですね。
基本的には単に、可読性というと単にプログラマーが楽をしているだけのように聞こえるけれども、それはつまり保守性や拡張性に結びつくものだから品質に大きくかかわる、と言いたかっただけなのです。

あと。
ひょっとしたら、私の設計が下手なだけなのかな、と思い前回は書きませんでしたが。
リファクタリングなんかしていて。
クラス全体で制御しようとした値が、一メソッド内に収まってしまったとか、
静的クラスにしようとしていたのだが、やっぱり継承とか使いたくなったのでインスタンスを利用することに変えたとか、そういうことはないでしょうか?

結構そういうことがあるので、
「this」とかのアクセス範囲はあくまで実装上の工夫であり、
本当に不変な意味を持つのは変数名などの抽象的なものなのかなあという感覚で、
「this」は書かないほうがよい、と思っていたのです。
かるあ
ぬし
会議室デビュー日: 2003/11/16
投稿数: 1190
お住まい・勤務地: センガワ→ムサシノ
投稿日時: 2007-07-11 00:51
僕は this(Me) はつけません。

確か最初に Java をやった時は無理にでもつけていたような気がするんだけれど、いつの間につけなくなったんだろう。。。

この頃 Javascript をよく触るんですが、こいつは this がないと別物として新しく束縛されたりするのでなれないとハマりますね。
Microsoft Ajax Library だと private は "_"プレフィクス であらわしていますね。
まぁこの場合は言語としてアクセス修飾子が無い所からきているかも知れませんが。

#コーディング規約があれば従いますよ。

引用:

よねKENさんの書き込み (2007-07-11 00:27) より:

プロジェクトとしてルールで決まっていれば、それに従いますが、
どちらの方針にしても、それに合わせるためにそれ相応の工数がかかり、
かつ、(個人的にどちらでもよいと思っている部分に労力がかかることが)ストレスにもなる
なぁと思っていました。そして、それは他のプログラマにも少なからず当てはまるのではないかなと。


これは確かにそうかもしれない。
unibonさんが言っているリファクタ(?)ツールがあるといい気がするなー

_________________
かるあ のメモ
http://karua.at.webry.info/

[ メッセージ編集済み 編集者: かるあ 編集日時 2007-07-11 00:53 ]
よねKEN
ぬし
会議室デビュー日: 2003/08/23
投稿数: 472
投稿日時: 2007-07-11 02:28
引用:

nagiseさんの書き込み (2007-07-11 00:42) より:
引用:

よねKENさんの書き込み (2007-07-11 00:02) より:
インスタンス変数を目立たせるという点ではどちらにも同様の効果はありますね。
ところで、「インスタンス変数の使用にthisを必ず付けること」
というルールにした場合、どうやってチェックされるのでしょうか?
(FxCopは使ったことがないのですが、この辺でチェックできるのでしょうか?
JavaでEclipseの場合でもCheckStyleにそういう定義があったか覚えがありません)


JavaでEclipseの場合はCheckStyleでいけますね。
このような機械チェックによって全てにthisが付いていることを保障できるという前提の場合と、
機械チェックが出来ない環境という前提では結論は大きく違うとも思います。



機械チェックができるかどうかは結論に影響が大きいのはその通りだと思います。

ちなみに"HiddenField"の設定でしょうか?
  http://www.limy.org/program/java/checkstyle/coding.html
  (上記サイトより引用)
  >「同一クラス内で定義されたフィールドと同名の
  >ローカル変数やメソッドパラメータが存在するかどうかチェックします。」

引用:

また、thisを付け忘れて
コード:
public setHoge(int hoge) {
  hoge = hoge;
}


としてしまった場合なども警告がでますので、このIDE下では
名前が同じであるが故の実用上の問題はありません。



実用上問題ないとのことですが、必ずしもそうとは言えないのではないでしょうか。

コード:
private int hoge1;
private int hoge2;

private void func1(int hoge1){
	hoge2 = func2(hoge1);
}



このコードの場合、
hoge2 = func2(hoge1)
の行が警告されると思いますが、警告を見て鵜呑みにして修正すると
this.hoge2 = func2(this.hoge1);
と直されるかもしれません。
それで正しいかもしれないし、間違いかもしれませんが、最初に書いた人にしかわかりません。
さらに、
this.hoge2 = func2(hoge1);
というコードが意図に沿うものだった場合、
ツールの警告が出っぱなしになりますよね。
警告は場合によって無視してよい、という運用になりませんか?
(消えない警告があるとツールの存在がデメリットにさえなります)

こういった判断はツールの得意でない部分で、
hoge1がパラメータかインスタンス変数かはツールには判断できません。

環境がないので、CheckStyleを通しての実験はしていませんので、
私の想定した通りの警告にならないかもしれませんが、
私の言おうとしていることは、要するにツールは万能ではないので、
ツールが対応しているからそれでよいとは簡単に判断できないということです。
#この件に関して言えば、JavaやC#の言語仕様で
#人から見た場合には曖昧な記述が許されるケースのため
#ツールとしては警告を出すのが精一杯なので仕方ないところです

引用:

「オブジェクトのステータスの変更と言うものに対して特に注意を払え」
という理由はインスタンス変数を目立たせる理由としては十分すぎると思いますが、
さて、命名規約で目立たせようか、this(あるいはMe)で目立たせようか、となれば
言語規約の機能であるthisやMeのほうが誤解がないと思います。



「言語規約の機能であるthisやMeのほうが誤解がない」という発想は概ね同意します。
ですが、同様に言語仕様としてthisやMeを付けることは強制していないので、
上記でコメントした通り、this、Meを付ける(コーディング規約通り)、
thisやMeを付けなくても怒られない(言語仕様通り)という問題が発生します。
(ツールである程度は確かに対応できるのですが)

プレフィックス案だと命名ルールに関するツールの機能で対応できるので
この件に関する曖昧さは特にありません。

引用:

thisやMeは本来つけることができないものには付けられないわけですから、
言語の機能としてサポートされているキーワードの強みがありますね。
また、こういった標準キーワードであれば多くのエディタでハイライトされることが
期待できるわけですから、あえてプリフィックスを採用する積極的な理由はないと思います。



言語の機能としてサポートされているキーワードの強み、
エディタでハイライトされるだろうという辺のメリットについてその通りだと思います。

>ALL
FxCopについて情報をお持ちの方、情報提供お願いします。
Error401
常連さん
会議室デビュー日: 2007/03/12
投稿数: 39
投稿日時: 2007-07-11 09:38
ちょっと目先を変えます。

C++でもthisを使えますし、Microsoft製のIDEであればハイライトもされるしインテリセンスも使用できます。Emacs系エディタのことは知りませんが、Vimではハイライトされますし、インテリセンスもどきの補完も使えます。

しかしC++でthisを使う人はほとんどいません。(もちろん私の知る限りにおいてですが)
これは一体なぜなんでしょう?

thisを付けることによって、可読性があがったり保守性が高まったりするのであれば、C++コミュにもいくらかは波及すると思うんですが、今のところそのような予兆は感じられません。

PythonではOO機能を実装するときに、this相当のself必須という選択をしました。メソッドの仮引数でさえ、selfを記述しなければなりません。
しかし今でも「なぜselfは必要なの?」というPython newbieからの疑問(不満?)が後を絶ちません。Python FAQに「なぜselfが必要なのか」というエントリがあるくらいです。

thisをつけることによって「可読性があがったり保守性が高まったり」と感じる人がC#コミュには多いのかもしれませんが、C++やPythonの例を見ると、それは普遍的な感じ方ではないような気がします。

@ITで投票を行うC#ユーザの中では、圧倒的にthisを付ける人が多いようですが、全世界的に見てC#でthisを付ける人がやはり圧倒的に多いとすると、それは「可読性があがったり保守性が高まったり」ではない何かがあるような気がします。
じゃんぬねっとさんの「自動生成されたコードにthisがあったから」という理由が、いまのところ最もしっくり来る説だと私は思います。

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