- PR -

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

投票結果総投票数:259
付ける 99 38.22%
付けない 66 25.48%
付けたり付けなかったり 94 36.29%
  • 投票は恣意的に行われます。統計的な調査と異なり、投票データの正確性や標本の代表性は保証されません。
  • 投票結果の正当性や公平性について、@ITは一切保証も関与もいたしません。
投稿者投稿内容
Error401
常連さん
会議室デビュー日: 2007/03/12
投稿数: 39
投稿日時: 2007-07-09 12:34
現時点でthisを付ける派が多数であることに、ちょっと驚いています。
私自身は「つけなければ正しく動かない場所」以外にはつけません。見た目うっとおしいからです。
IDEを使ってコーディングしているときも、thisを入力してインテリセンスを使ってから、thisを削除するという念の入れようです。

ところで、「thisを付けた方が可読性が上がる」などの理由で、それを推奨している書籍や記事などはどこかにありますでしょうか。今までに見たことがありませんので…。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2007-07-09 13:35
引用:

未記入さんの書き込み (2007-07-09 12:34) より:

ところで、「thisを付けた方が可読性が上がる」などの理由で、それを推奨している書籍や記事などはどこかにありますでしょうか。今までに見たことがありませんので…。


公式な記事はなさそうです。 「"this" 明示」 などで検索しても、非公式で 「誰が見てもインスタンス メンバだということがわかる」 とか 「どの位置のメンバなのか考えなくて良い」 的なコトしか書かれていないかもしれません。 しかも例として挙がっているコードがコンストラクタだったりプロパティだったりするので. . .  .   .

私は MSDN ライブラリのサンプルコード、Visual Studio が自動生成するコード (InitializeComponent メソッド) の多くに this (Me) が付いていたから、という単純な理由で付け始めたような気がします。

MSDN ライブラリに 「名前付けのガイドライン」 がありますが、ここでは this や Me については触れられていません。 私の場合は明記されていないものは MSDN ライブラリのサンプルコードなど Microsoft が提供しているコードが基本形なのだと見て、それになるべく合わせるというポリシを持っています。(それでも "ゆらぎ" はあるので、いろんなページを閲覧しまくっていました)

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

じゃんぬねっとさんの書き込み (2007-07-09 12:24) より:
囚人さんの意見というか抜粋したコードに関しては本人が書かれているとおり、アンダースコアで解決できると思います。 囚人さんは最初からそういうつもりで発言していたようにも見えます。> "似て非なる方がいい"

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



私はスコープの違いで似て非なる名前を付けたくはないのですね。
スコープといった(広義の)名前空間が違う場合に同名でも違うものとして認識するように
わざわざ言語が対応しているんだから、人間がそこを変える対応をするというのが腑に落ちない。
しかし、このあたりは感情的なものなのかもしれません。

もともと思っていたのは命名規約が複雑になればプロジェクトを回す際に実効性に疑問がでてくる、と。
人間が多くなった場合にうまくやっていくためのルールとしては

1.単純であること
2.機械的なチェックが可能であること

が重要なのだと思っています。
もっとも、今の時代だとアンダースコアをつけるとかつけないとかも機械でチェックできてしまうので、
そういう意味でも、感情的な理由以上に反対するうまい理由を挙げれません。
何かひっかかるので論理的な理由があるのかもしれませんが、出てこないので保留ということで。

# アンダースコア始まりの変数名はJavaの一般的な命名規約では推奨されないんですよね。
Error401
常連さん
会議室デビュー日: 2007/03/12
投稿数: 39
投稿日時: 2007-07-09 14:51
引用:

じゃんぬねっとさんの書き込み (2007-07-09 13:35) より:
公式な記事はなさそうです。 「"this" 明示」 などで検索しても、非公式で 「誰が見てもインスタンス メンバだということがわかる」 とか 「どの位置のメンバなのか考えなくて良い」 的なコトしか書かれていないかもしれません。 しかも例として挙がっているコードがコンストラクタだったりプロパティだったりするので. . .  .   .



なるほど。
ということは、書籍なり雑誌なりWeb上の情報なりで「thisはMeを明示しましょう」運動は無かったのにもかかわらず、トリプルスコアで「付ける派」が多いということですね。

ちなみに私は「mMenber」派です。今ではこの一派も少なくなったのでしょうか…。
なちゃ
ぬし
会議室デビュー日: 2003/06/11
投稿数: 872
投稿日時: 2007-07-09 14:58
ところで。
開発者の感じる、うざい、くどいって
結構重要だと思うのですよ。

※何も考えてないようなのはまあ別ではありますが。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2007-07-09 15:07
引用:

未記入さんの書き込み (2007-07-09 14:51) より:

なるほど。ということは、書籍なり雑誌なりWeb上の情報なりで「thisはMeを明示しましょう」運動は無かったのにもかかわらず、トリプルスコアで「付ける派」が多いということですね。ちなみに私は「mMenber」派です。今ではこの一派も少なくなったのでしょうか…。


プロパティ変数に関して言えば、私も VB6 では 'm' を先頭に付けますよ。 というよりアンダースコアが先頭に付けられないので... Private フィールドは Camel ですね。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2007-07-09 15:09
引用:

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

もっとも、今の時代だとアンダースコアをつけるとかつけないとかも機械でチェックできてしまうので、そういう意味でも、感情的な理由以上に反対するうまい理由を挙げれません。何かひっかかるので論理的な理由があるのかもしれませんが、出てこないので保留ということで。


たとえば、静的なメンバにアクセスする場合はグローバル解決演算子を使ったりして、明示的に分けている言語 (C++/CLI、PHP... etc) もありますが、これはこれで意見が分かれると思います。 そしてこれもやはり感情的な理由が大きいと思います。

引用:

# アンダースコア始まりの変数名はJavaの一般的な命名規約では推奨されないんですよね。


確か Sun のコーディング規約にありましたね。 .NET というか CLS でも protected 以上のアクセス修飾子を持つメンバにアンダースコアから始まる名前を付けると CLS 違反になります。 そうなると、「private メンバで直接触らせたくないもの == プロパティ変数に使う」 ということになっているのだと思います。(ただの private フィールドは Camel)

個人的には 「プロジェクトで統一」 とは言わず、全世界で統一されていた方が良いような気がします。 そういう意味でも Microsoft さんが公式なものを提供してくれるとありがたいですね。(そういうフィードバックをしたようなしていないような...)

# 「うざい」「くどい」 については私も少し考える必要があると思えてきました。

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

なちゃさんの書き込み (2007-07-09 14:58) より:
開発者の感じる、うざい、くどいって
結構重要だと思うのですよ。



心理的なストレスは確かに重要な考慮事項ではありますが、
誤認するほうがよほど問題なのでそこは理由あって譲りません。

いえね、個人でプログラムしているんならなんでもいいんです。
thisをつけることが何より嫌いだという人も中にはいるかもしれない。
ただ、やはり職業プログラマの方が多いでしょうから、
「みんなでプログラム」する場合にどういうルールが合理的?という観点で考えて貰いたい。

医療現場では薬品の取り違え対策でカラーリングをしたりしているわけですね。
こういうのって根性論じゃ駄目なんですよ。
根性でよく確認すればインスタンスなのかローカルなのか分かるだろ!
って言ってしまうとそこで対策はおしまいになってしまう。

インスタンスに付随するものだよ、ということを目立つ形で主張するという
コーディングルールをなぜ採用するのかといえば、thisをつける「鬱陶しさ」より
インスタンス変数であることを確認させることのほうが重要だと捉えてるからですね。

大人数の開発をすれば、中には初心者もいることでしょう。
インスタンスという概念がいまひとつ分かっていない人もいるかもしれない。
「スコープのことはよくわからないが、staticで宣言すればどこでも使えてコンパイルが通る」
とか言っている人がいたら、はたかないといけないわけです。

機械チェックでthisをつけることを強制する。するとthisをつけなければ警告される。
カラーリング機能の付いたエディタで開発していれば、
ローカル変数とインスタンス変数とスタティック変数は全て違う表示のされかたをする。
「見えないものはないものだ」では困るので、「見える化」しているんですね。
そういう開発のインフラとして私はthisをつけるように、と主張しているわけです。

面倒くさいからでCVSやSubversionのバージョン管理を使わない奴がいたら困るでしょう?
この辺は「うざい、くどい」より優先される事柄ですよね。

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