- PR -

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

投票結果総投票数:259
付ける 99 38.22%
付けない 66 25.48%
付けたり付けなかったり 94 36.29%
  • 投票は恣意的に行われます。統計的な調査と異なり、投票データの正確性や標本の代表性は保証されません。
  • 投票結果の正当性や公平性について、@ITは一切保証も関与もいたしません。
投稿者投稿内容
NABE
会議室デビュー日: 2007/07/11
投稿数: 2
投稿日時: 2007-07-12 09:09
> 「this.Foo」とあると、何となく、何故か、
> 「インスタンスの外部からもアクセス可能なメンバに内部からアクセス」っぽく感じる。

分かった、VB6を使っていたときのクセだった。

VB6では、Meで修飾すると、非公開メンバを呼び出せない。
VB 2005なら、非公開メンバも呼び出せる。
Tdnr_Sym
ぬし
会議室デビュー日: 2005/09/13
投稿数: 464
お住まい・勤務地: 明石・神戸
投稿日時: 2007-07-12 09:44
おはようございます。

引用:

nagiseさんの書き込み (2007-07-11 15:55) より:
■疑問点
C++では通常thisを書かないのはなぜか?



以下、完全に私のオレオレ理論ですが…


C++の場合、演算子のオーバーロードやコピーコンストラクタなどで
”自分自身のインスタンスと他のインスタンスを区別する必要があります。”

this, other, rhs(right hand side), lhs(left hand side)などのインスタンスのうち、
C++では暗黙の引数であるthisポインタは、キーワードにする必要があったかのかと…

#今でこそ無闇な演算子オーバーロードは悪という風潮ですが、
 初期のころのC++は、演算子オーバーロードの使用に積極的であったように思います。

なので、C++でthisを使用する場合は、”他のインスタンスとの区別をする”という
意味合いが強いのではないかと思います。
逆に言えば、自インスタンスと他インスタンスを区別する必要がないのなら
わざわざthisを書かなくてもいいんじゃないの…
という感じではないでしょうか。
#少なくとも私はそういう感じで使ってます。

未記入
常連さん
会議室デビュー日: 2007/02/21
投稿数: 29
投稿日時: 2007-07-12 12:37
for(int i = 0; i < 100 ; i++)
 Console.WriteLine("i = {0}", i);

これにthisを付けてみそ〜〜。

と言う訳で付けたり付けなかったり。
まりも
ベテラン
会議室デビュー日: 2006/08/19
投稿数: 77
投稿日時: 2007-07-13 00:07
thisをつけるメリットがたくさん上がっているようです。たいへん説得力がある意見も多く、私も徐々につけるのがよい派に変化してきています。少なくとも、「つけない」から、「付けたり付けなかったり」へは転向してしまっています。
しかし。とはいえ。つけないメリットがどうも理解されていないように感じるので、つけないメリットの説明もせねばと、孤軍奮闘ですがもう少し頑張ってみようと思います。

引用:
じゃんぬねっとさんの書き込み (2007-07-11 09:47) より:
実は coasm さんにも同様の返信をしようと思っておりました。 個人的には "愚行" とまで仰るからには説明して頂きたかったのですが、"上手く説明できないのですが" という前置きがありましたので控えさせて頂きました。



愚行ってのは確かにたいへん言葉がきついですね。すみません。
いや、そのきつい部分に賛同というわけではないのですが。
賛同ってのは、内容の部分です。

引用:
こちらでは "実装上の工夫" の話しかしていないと思いますよ。



ふむ。
その辺が今一つ伝わらない原因なのではないでしょうか。
少なくとも私が言っているのは、"実装上の工夫"の話ではないのですから。
coasmさんも、実装レベルまで引きずり落とす、と言ってますし。

詳しく説明しようとしたのですが、長く書くほどわかりにくくなるのなるべく簡潔に書くと。

つまるところ、コードを埋め尽くすのは抽象的なものであるべきだ、っていうことです。
悩むべきなのは、何を作りたいかであって、どう作りたいかではない。ということです。

アクセス範囲とかも重要なのは間違いないですが、先頭文字の大文字小文字くらいの目立ち具合が適切ではないのか?
また、大文字小文字は定義のときだけ気をつければインテリセンスに任せきりでいいですが、thisは書くとき、訂正するときに、常に人間が注意を払っていないといけない。

重要さに比較して、使うコストが大きすぎるのではないか、ということです。


設計については、やっぱり私がへぼなだけかもしれないような気もしてきました。
いずれにしても、実際にはわざわざ言うほど手間がかかるわけではないので、あまり関係なかったかもしれません。
やっぱり修正時の手間よりは、読む時に常に読みやすく、という方がメインとなると思います。

ただ、具体例を質問されたのがありましたので、それだけでも簡潔に。

引用:
これもないですね。 ところで、こちらはどのようなパターンであり得るのでしょうか? "結構そういうことがある" と書かれていらっしゃいますので、参考までに事例を挙げて頂けないでしょうか?



機能のみの提供なので静的クラスの方が使いやすいかと思って作っていたら、ポリモーフィズムを使う必要が出てきたのでインスタンスを利用するように書き換えた、ことがあります。内部で分割していて、かつ外から見えないからいいやとprivateフィールドを使っていてちょっと面倒だったことが確か数度。thisと言っても、メソッドの呼び出しの話になりますね。


引用:
読み違いの臭いがしましたので、"きめ細かな指定" と "思考を節約できる" 事例を提示して頂けないでしょうか?



具体例としては、
フィールドやメソッドをprivateで指定しておけば、クラス外や継承先ではその存在を忘れていられる。
メソッド内変数でも、スコープを工夫することにより、離れた場所では忘れていることができる。
とかそういうことですね。

あとは。

引用:
つまり 「this を付けない」 と主張している方の根本の理由ということですね。 同じように 「this を付ける」 と主張している方もそういう理由で主張しているのだと思います。 ですので、別の意図があるのだと思い込んでおりました。



thisをつける派の方が、趣味でやっているなら自由だけど、などと言っていたので、thisをつけない派としてもちゃんと業務のことを考えているのだと明記しておく必要を感じて書きました。
それを見て、thisをつけない派が自分たちだけが業務のことを考えていると解釈されたなら。
なかなか皮肉で不毛なことですね。

ひょっとして、お互いに同じことを感じあっているだけなのでしょうか。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2007-07-13 09:40
引用:

まりもさんの書き込み (2007-07-13 00:07) より:

その辺が今一つ伝わらない原因なのではないでしょうか。
少なくとも私が言っているのは、"実装上の工夫"の話ではないのですから。
coasmさんも、実装レベルまで引きずり落とす、と言ってますし。
詳しく説明しようとしたのですが、長く書くほどわかりにくくなるのなるべく簡潔に書くと。
つまるところ、コードを埋め尽くすのは抽象的なものであるべきだ、っていうことです。
悩むべきなのは、何を作りたいかであって、どう作りたいかではない。ということです。


実装と設計を自分の定義したルールに合わせるという意味を持ちますから、そちらのルールと異なるというだけだと思います。 手段が異なるだけでどちらも同じところを目指しているのだと思います。

引用:

アクセス範囲とかも重要なのは間違いないですが、先頭文字の大文字小文字くらいの目立ち具合が適切ではないのか?
また、大文字小文字は定義のときだけ気をつければインテリセンスに任せきりでいいですが、thisは書くとき、訂正するときに、常に人間が注意を払っていないといけない。


これは同名を使う場合の話ですね。 私の場合は、プロパティ変数ではアンダースコアをつけているため頭 1 文字を除けば同名になりますが、上記の問題にはヒットしません。 コンストラクタは同名を使うパターンが多いですが、これは "絶対的に明示すべき" だと考えているので問題なしと判断しています。

大文字小文字だけとなると、VB の場合はそれ以外の場面で注意が必要になりますね。 同名がある前提だと C# も気を付けるという点では同じかもしれませんが。

引用:

機能のみの提供なので静的クラスの方が使いやすいかと思って作っていたら、ポリモーフィズムを使う必要が出てきたのでインスタンスを利用するように書き換えた、ことがあります。内部で分割していて、かつ外から見えないからいいやとprivateフィールドを使っていてちょっと面倒だったことが確か数度。thisと言っても、メソッドの呼び出しの話になりますね。


なるほどです。 今のところはそういった経験はありませんが、あり得る話ではあると思います。 ご説明ありがとうございます。

引用:

具体例としては、フィールドやメソッドをprivateで指定しておけば、クラス外や継承先ではその存在を忘れていられる。メソッド内変数でも、スコープを工夫することにより、離れた場所では忘れていることができる。とかそういうことですね。


(ひとつ前の投稿で書こうとした内容のままになってしまいますが)
そもそもそのためのアクセス修飾子なわけですが、"this" は、インスタンス内での話なのでクラス外は関係ないのではないでしょうか? 「プライベート メンバにすればそのクラスの中では忘れても良い」 なんてことにはなりません。 それだったらローカル変数やブロック変数にするべきでしょう。 どこから隠蔽したいがために Private なのかという前提を考えるとどうも私とはクラス設計思想さえも異なっているのかもしれません。

引用:

ひょっとして、お互いに同じことを感じあっているだけなのでしょうか。


もちろんそうなのでしょう。 最初にも書きましたが目指しているところは同じで、趣が個人によって依存しているから分かれているにすぎません。

# 予想どおり、「付けたり付けなかったり」 が急に増えてきましたね。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
nagise
ぬし
会議室デビュー日: 2006/05/19
投稿数: 1141
投稿日時: 2007-07-13 11:59
引用:

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

ひょっとして、お互いに同じことを感じあっているだけなのでしょうか。


もちろんそうなのでしょう。 最初にも書きましたが目指しているところは同じで、趣が個人によって依存しているから分かれているにすぎません。



「感じていること」の解釈が合っているか自信はないのですが…
先のまとめでも強調しておきましたが、
引用:

業務での多人数開発を念頭に置く

インスタンス変数の扱いは、クラスの状態遷移である。
十分に気をつける必要があり、注意喚起のために目立たせる必然性がある。



という目的は概ね同意が取れているのだと思います。
この目的に限って言えば、this派とプレフィックス派がいて、そのどちらでもない
という主張の人はいませんね。系統は違えど目的は同じことの証左ではないでしょうか。

よりメタな目的で言えば「生産性の向上」という話で、
インテリセンスの利用や教育の効果といった話題も同じ方向を見ているのだと思います。
まりも
ベテラン
会議室デビュー日: 2006/08/19
投稿数: 77
投稿日時: 2007-07-14 23:58
引用:
nagiseさんの書き込み (2007-07-13 11:59) より:

この目的に限って言えば、this派とプレフィックス派がいて、そのどちらでもない
という主張の人はいませんね。



どちらでもないという主張です。

私のほかにも二人くらい見かけたような覚えが。
はっきりと明言していたわけではないですが。

私も明言していなかったかな?
意思の疎通というのは非常に難しいものです。


とにかく、私はどちらでもない派です。

理由としては。
適切な変数名を付けていれば、紛らわしいことはあまりないと思うのです。

クラス全体で話題となっている「もの」を示すものを呼ぶ名前が、
メソッド内で使う「もの」を呼ぶためにつけられた名前と全く同じになるってことは、
あまりないのではないでしょうか?

もしそれであえて同じ名前をつけたくなるようなら、
メソッド内の出来事とクラス全体にかかわる出来事は全く別に扱うという認識でそのメソッドは書かれているということで、
その場合はthisをつけるべきでしょうし、またつけないとバグになるわけですが。

クラスフィールドが存在したかしないか覚えきれないほど多量のクラスフィールドがある状況があるとしたら、クラスが大きすぎるんじゃないか、とも思えますし。

日本語でも、たとえば母親を示す時に、会社なんかでいう時や、家に友達を読んだときには「うちの母親」(myFamiry.Motherとかthis.mother)なんて表現を使わないとわけがわかりますが、家の中でその意味を伝えようとすると、お母さん(何もつけないmother)とかになるでしょう。
家の中で家族相手にいちいち、我が家の母親(this.mother)って言っていたら、話が伝わりやすいかというと。
くだくだしくってかえって分かりにくいだけじゃないでしょうか。


とはいえ。よく自分の経験を考えてみたら。
多人数での開発も、クラス設計もやったことはありますが。
一つのクラスを複数の人間でいじるってことは、あまり経験がないのですよね。

実際、そんなに混乱するものなのでしょうか?
人のプログラムを見ていて、メソッド変数とクラスフィールドが同じ名前になっていて、
どっちを書いているかわからなくて困ったということはそんなにあることなのでしょうか?

特にVSを使っていると、クラスフィールドではXMLコメントが表示されたりもするので、混乱するようには思えなかったりするのですが。

実際やってみると、混乱するものですか?

[ メッセージ編集済み 編集者: まりも 編集日時 2007-07-14 23:59 ]
ラフィン
ぬし
会議室デビュー日: 2002/05/23
投稿数: 809
お住まい・勤務地: 外野
投稿日時: 2007-07-15 02:42
引用:

まりもさんの書き込み (2007-07-14 23:58) より:

とにかく、私はどちらでもない派です。

理由としては。
適切な変数名を付けていれば、紛らわしいことはあまりないと思うのです。


 プレフィックスではない適切な変数名、ということですね?

 変数名に限れば私はプレフィックス派。
 理由は、複数言語を使うので、プレフィックスは言語依存が少なくルールとして身に付きやすいから。

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