- PR -

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

投票結果総投票数:259
付ける 99 38.22%
付けない 66 25.48%
付けたり付けなかったり 94 36.29%
  • 投票は恣意的に行われます。統計的な調査と異なり、投票データの正確性や標本の代表性は保証されません。
  • 投票結果の正当性や公平性について、@ITは一切保証も関与もいたしません。
投稿者投稿内容
nagise
ぬし
会議室デビュー日: 2006/05/19
投稿数: 1141
投稿日時: 2007-07-06 17:29
引用:

囚人さんの書き込み (2007-07-06 15:27) より:
それよりも、スコープで名前付けを工夫したら良いと思っているので。



似て非なる名前が多種あるというのは認識のしやすさという点でデメリットがありませんか?
アンダーバーの付け方とかで一貫したルールを用意するとか言い始めると逆に煩雑になりますし。
言語でスコープを明示できる機能がついた流からすると、それを命名で代替しようというのは逆行しているような気がします。
囚人
ぬし
会議室デビュー日: 2005/08/13
投稿数: 1019
投稿日時: 2007-07-06 17:40
引用:

似て非なる名前が多種あるというのは認識のしやすさという点でデメリットがありませんか?


ちょっと意味がわかりませんが、逆にわかりにくいという意味でしょうか?
似て非なる方がいいと思いますが。全く同じ名前で非より。

下のコードはバグがあるのですが、パッと見てすぐにわかりますか?
アンダーバーを付けてればすぐにわかるのですが。

コード:
class Sample
{
	private string naem;

	public Sample(string name)
	{
		this.naem = naem;
	}
}



_________________
囚人のジレンマな日々
よねKEN
ぬし
会議室デビュー日: 2003/08/23
投稿数: 472
投稿日時: 2007-07-06 17:49
私はじゃんぬねっとさんが挙げた過去スレでも言ってますが、
基本的にどっちでもいい派です。
#でも、個人的には全部に付けるというはやはりくどいなと思っています。

Pythonのクラスなんかだと
インスタンスメソッドの第一引数に自身のインスタンス用の引数(self)を
書かないといけなくて、インスタンス変数は強制的に
self.〜で書かないといけないのですが、
エディタのみでプログラミングしているとこの仕様はなかなか面倒です。

開発環境の充実と共に補完もしてくれるんだから、
thisくらい付けとけって派が多くなるのでしょうね。

ちなみにstatic変数/メソッドはクラス名を明示する派です。
クラス名を変更したときには一緒に修正しないといけなくなりますが、
どのクラスの所属かがはっきりし、かつ、static変数/メソッドだとはっきりするので明示します。
インスタンス変数/メソッドのthisは省略してもいいけど、
static変数/メソッドのクラス名は省略して欲しくないですね。

つまり、static変数/メソッドのクラス名は省略しないから、
インスタンス変数/メソッドのthisは省略したっていい、という発想なんですね。
別のクラスのインスタンスなら「インスタンス変数.」が必須ですから、
残りのものはローカル変数、インスタンス変数、インスタンスメソッドなので、
どの種類かは名前を見ればわかるように命名されているはず。

もちろんプロジェクトのルールがあればそれに従いますので、
上記の基準は個人的にプログラミングするならといったところでしょうか。
nagise
ぬし
会議室デビュー日: 2006/05/19
投稿数: 1141
投稿日時: 2007-07-06 18:55
引用:

囚人さんの書き込み (2007-07-06 17:40) より:
引用:

似て非なる名前が多種あるというのは認識のしやすさという点でデメリットがありませんか?


ちょっと意味がわかりませんが、逆にわかりにくいという意味でしょうか?
似て非なる方がいいと思いますが。全く同じ名前で非より。



先の私の発言は、ネームスペースで分断された時点で別空間なんだから、
ネームスペースが無かった時代の言語みたいに自力で名前がかぶらないように
する必要はないだろう、必然性はないだろう、という主張だったのですが、

引用:

下のコードはバグがあるのですが、パッと見てすぐにわかりますか?
アンダーバーを付けてればすぐにわかるのですが。


この例は非常に説得力を持っていますね。
たしかに、ハイライトやコード補完、細やかなエラー警告がでるような高機能なIDEでの
開発ではこういったミスは即刻警告されるのでなんら問題とはならないのですが、
単なるテキストエディタでソースを開いたときには見過ごしてしまうでしょうね。

ネームスペースが別だといっても出来るだけユニークな命名にしたほうがよいのかな…。
話題が大分逸れました。申し訳ない。
ガルマ・ザビ
ベテラン
会議室デビュー日: 2007/06/07
投稿数: 55
お住まい・勤務地: ジオン公国
投稿日時: 2007-07-09 09:08
皆様、たくさんの投稿ありがとうございました。

付けないという方が私の予想以上にいらっしゃって、驚きましたが、
その方々の投稿を読ませていただいているうちに、少し見方が変わりました。

今後もまた、よろしくお願いします。



じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2007-07-09 10:04
たぶんオフトピですが...

引用:

nagiseさんの書き込み (2007-07-06 18:55) より:

先の私の発言は、ネームスペースで分断された時点で別空間なんだから、
ネームスペースが無かった時代の言語みたいに自力で名前がかぶらないように
する必要はないだろう、必然性はないだろう、という主張だったのですが、


ネームスペースとは .NET における名前空間を指していますか? もともとそのクラスのインスタンスそのもののお話だったので、スコープの強さのお話なのかと思いましたが...

引用:

ネームスペースが別だといっても出来るだけユニークな命名にしたほうがよいのかな…。
話題が大分逸れました。申し訳ない。


ユニークにして可読性というか使用感を損ねるくらいならやめた方が良いと思われます。

たとえば完全修飾名の一部だけをずらすことによって Action を示す名前の統一を図った方が "同じような使い方をする" という予想がつきます。サービス指向と呼ばれるものでしょうか。

このように同名の方がわかりやすいパターンも多くありますので、ユニークの方が望ましいということは一概に言えないと思います。

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

じゃんぬねっとさんの書き込み (2007-07-09 10:04) より:
ネームスペースとは .NET における名前空間を指していますか? もともとそのクラスのインスタンスそのもののお話だったので、スコープの強さのお話なのかと思いましたが...


とくに.NETの、というわけではないですね。
同一名称だけど空間が違うから別物扱いだよ、って意味合いで(多分かなり広義で)使っています。
.NETの名前空間、Javaのパッケージの概念に加え、ここでは
インスタンス変数とローカル変数も「別の空間」として論じています。
(ん?もしかしてフィールドのハイディング限定の話なのか?これは)

いずれも、完全名を使うことで識別はできるが、通常は修飾部分を省略して
同一名のように見えるわけですね。

引用:

たとえば完全修飾名の一部だけをずらすことによって Action を示す名前の統一を図った方が "同じような使い方をする" という予想がつきます。サービス指向と呼ばれるものでしょうか。

このように同名の方がわかりやすいパターンも多くありますので、ユニークの方が望ましいということは一概に言えないと思います。


えぇ、一概に言えない、というのが現状の結論です。
個人的には修飾部が違うことで区別できるのだし、ユニークにする必要はないという
意見だったのですが、囚人氏の意見で存外難しい話題だと思わさせられました。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2007-07-09 12:24
引用:

nagiseさんの書き込み (2007-07-09 11:10) より:

個人的には修飾部が違うことで区別できるのだし、ユニークにする必要はないという
意見だったのですが、囚人氏の意見で存外難しい話題だと思わさせられました。


囚人さんの意見というか抜粋したコードに関しては本人が書かれているとおり、アンダースコアで解決できると思います。 囚人さんは最初からそういうつもりで発言していたようにも見えます。> "似て非なる方がいい"

たとえば、アンダースコアはプロパティ変数 (Private フィールド) を示すとかそういう工夫全般を指しているのではないでしょうか? > "スコープで名前付けを工夫したら良い"

コード:

    private string name;

    public Sample(string name) {
        this.name = name;
    }

コード:

    private string _Name;

    public Sample(string name) {
        _Name = name
    }


ちなみに、2007-07-06 15:27 にある囚人さんの投稿は、「this あり + アンダースコアなし」 対 「this なし + アンダースコアあり」 で比較しているように見えるので少々フェアでないと感じました。

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

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