- PR -

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

投票結果総投票数:259
付ける 99 38.22%
付けない 66 25.48%
付けたり付けなかったり 94 36.29%
  • 投票は恣意的に行われます。統計的な調査と異なり、投票データの正確性や標本の代表性は保証されません。
  • 投票結果の正当性や公平性について、@ITは一切保証も関与もいたしません。
投稿者投稿内容
nagise
ぬし
会議室デビュー日: 2006/05/19
投稿数: 1141
投稿日時: 2007-07-06 13:56
私はじゃんぬねっと氏が挙げた過去スレでの発言で概ね言い尽くしてしまった感がありますが…。採録ということで。

自分は教育的観点から、thisをつけるように指導しています。
オブジェクト指向経験の浅い人には常に「何のインスタンスに対して」操作を行っているのかを意識してもらうためです。

変数の種類を理解し使い分けられるようになるまでには相応の訓練が必要です。
初心者にとってはstatic変数もinstance変数もローカル変数も同じに見えます。
単にスコープの違いぐらいにしか見えません。
一時変数をstatic変数で宣言するとかやってくれます。
「こっちだと宣言が一回で済むから」いえね、それよりもっと大事なことがあるんだよ、と。

とくにインスタンス変数の意味というか、インスタンスの概念を身に付けさせるのが大変です。
この部分、thisをつけさせることで、何のオブジェクトに対する操作かということを常に意識させることは効果的です。
見えないものは存在しないわけではない、ということが分かるまでは省略しないほうがいいと思っています。

なお、インナークラスの説明をするときは
クラス名.this.変数名
という完全に省略なしの記述方式で説明しますし、
インスタンス.new インナークラス();
といったように、エンクロージング型のインナークラスはnewの前の
インスタンスも省略しないで書かせるようにしています。
このあたりも、理解したのなら省略しても構わないと思いますね。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2007-07-06 14:07
引用:

ガルマ・ザビさんの書き込み (2007-07-06 11:53) より:

あるコントロールのプロパティに連続で何かを設定したりするときは、
thisが続くことになるので、そういう辺りが「くどい」みたいです。


(ガルマ・ザビさんの返信ではなくなってしまうかもしれませんが...)
これも反論にしては弱いでしょうね。「くどい」 は理由にならないです。くどいということは 『ああ、もうわかったわかった』 ということですよね。これは相手に伝わっているということです。(読むことができている)

「くどい」 を 「面倒」 に読み替えたとしても素直にコピペで済むのではないかというレベルですよね。With だったりカスケードみたいなものを言語仕様に加えると途端に (VB によくありますが) ひどいコードが増えてきそうで怖いですし、中継となる参照を格納しておくのもバグの温床になることがあります。

--

皆さんで決めることですからどちらでも納得さえできれば良いとは思いますが、少なくとも上記の理由では反論は必至でしょうね。そういう議論の場を設けて意見を出すだけ出してもらってから決定で良いと思います。あとは生産性を考えると大人数の方の意見が採用されるのは当たり前だと納得して頂くくらいですね。ただ 「くどいと感じる人がいる」 と 「読みにくいと感じる人がいる」 だと重要度が明らかに違いますから難しいかもしれません。何はともあれ今からでも早めに統一しておいて損はないと思います。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
Tdnr_Sym
ぬし
会議室デビュー日: 2005/09/13
投稿数: 464
お住まい・勤務地: 明石・神戸
投稿日時: 2007-07-06 14:16
こんにちは。

this付ける派が意外に多いんですね。

私の場合は、(C++ですが)thisキーワードはほとんどつけないですね。必要な場合を除き。
他人の公開ソースコードを見ても付けてないほうが多い気がします(注意してみてないので主観的ですが)。

今私が確認できる公開ソースコード(Java6 VMや sscli2.0[.NETのVM]のコード)をみても
むやみにthisは使用していないように見えます。#一応grepしてみました。

ただし、下記のような場合はもちろんthisは使います。
・同名のメソッドの仮引数とインスタンス変数がある場合の区別。
・thisポインタ/参照を関数の引数で渡す。
・thisポインタ/参照を戻り値で返す。

コード:
 ・・・
 this->lock = lock;
 ・・・
 Notify(this);
 ・・・
 return this;


ガルマ・ザビ
ベテラン
会議室デビュー日: 2007/06/07
投稿数: 55
お住まい・勤務地: ジオン公国
投稿日時: 2007-07-06 14:43
皆様、ご返信ありがとうございます。
勉強になります。m(_"_)m

nagiseさんの観点は違った角度からの考え方で、
なるほどと思います。

thisを全く利用しないということは無いですよね?
つまり、基本的には付けないスタンスでも、
似た名前によって隠ぺいされるメンバを修飾する場合など、
適所にはthisを付ける。

しかし、このようなことを新人に教えてもピンと来ないでしょうし、
基本的には付けませんよ、と教えるのに説得力を持たせ辛いですね、、。

じゃんぬねっとさんの仰るとおり、俺流にならないように
早めにルール化していきたいなと思います。

ちなみに.Net Framework をReflectorで覗いてみたら、
thisを結構つけていました。



[ メッセージ編集済み 編集者: ガルマ・ザビ 編集日時 2007-07-06 14:44 ]
Tdnr_Sym
ぬし
会議室デビュー日: 2005/09/13
投稿数: 464
お住まい・勤務地: 明石・神戸
投稿日時: 2007-07-06 14:50
こんにちは。

引用:

ガルマ・ザビさんの書き込み (2007-07-06 14:43) より:
ちなみに.Net Framework をReflectorで覗いてみたら、
thisを結構つけていました。



Reflectorで見るソースコードはリバースエンジニアリングによって”生成”されたコードですよね!?
ガルマ・ザビ
ベテラン
会議室デビュー日: 2007/06/07
投稿数: 55
お住まい・勤務地: ジオン公国
投稿日時: 2007-07-06 15:03
引用:

Tdnr_Symさんの書き込み (2007-07-06 14:50) より:

Reflectorで見るソースコードはリバースエンジニアリングによって”生成”されたコードですよね!?




本当だぁ、そうですね、、、Y(>_<、)Y
べる
ぬし
会議室デビュー日: 2003/09/20
投稿数: 1093
投稿日時: 2007-07-06 15:19
まったくもってどっちでもいい派です。
人のコード直すときに、どこにもかしこにもthisがついていればつけるかもしれないし、
プロジェクトのルールとして決まっていれば当然つけるし、
あとインテリセンス出したくてthis.ってうつことはあります。

ところで、メンバ変数の場合はつけるけどメソッドの場合はつけないって人は多いんじゃないでしょうか。
私もメソッドの場合はまずつけません。
囚人
ぬし
会議室デビュー日: 2005/08/13
投稿数: 1019
投稿日時: 2007-07-06 15:27
this を付けないに一票。でも、別に付けてもいいのでどっちでも良いっちゃあいいですが。

それよりも、スコープで名前付けを工夫したら良いと思っているので。
this を付ける付けないはフィールドの事だけ言ってるのでしょうか?プロパティやメソッドも?

正直 this を付けたらクドイかな、思ってます。
(下記の Func1() を比較)

コード:
class Sample
{
	private string _name;

	public Sample(string name)
	{
		_name = name;
	}
	
	public String Name
	{
		get{ return _name; }
		set{ _name = value; }
	}
	
	public void Func1()
	{
		string n1 = _name;
		string n2 = Name;
		Func2();
	}
	
	public void Func2()
	{
	}
}


class Sample
{
	private string name;

	public Sample(string name)
	{
		this.name = name;
	}
	
	public String Name
	{
		get{ return this.name; }
		set{ this.name = value; }
	}
	
	public void Func1()
	{
		string n1 = this.name;
		string n2 = this.Name;
		this.Func2();
	}
	
	public void Func2()
	{
	}
}



_________________
囚人のジレンマな日々

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