- - PR -
現在のインスタンスを参照するthisキーワード、付ける? or 付けない?
投票結果総投票数:259 | |||
---|---|---|---|
付ける | 99票 | 38.22% | |
付けない | 66票 | 25.48% | |
付けたり付けなかったり | 94票 | 36.29% | |
|
投稿者 | 投稿内容 | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2007-07-17 12:33
流し読みしかしていないし、こんなことで議論する気はまったくありませんが。書きたいことだけ書いておきます。ちなみに、私は this についてあまり意識したことがなかったので、付いていたり、付いていなかったりしてます。何かの基準で決めてるわけではなく、なんとなく付いてたり、付いてなかったり。こういうのが一番良くないのでしょうね。
変更ということであれば代入左辺値として現れるときだけ this を付ければ十分? 参照するだけならフィールド変数に this を付けなくてもよい?
Eclipse 大好きです。フィールド変数 hoge とローカル変数 fuga を使用しているメソッドが存在しているとき、フィールド変数 hoge をリファクタリングの一環として fuga に名前変更しようとすると、ローカル変数 fuga に隠されちゃうよ! という警告まで出してくれます。すばらしい。ここまでできるなら this いらないと思えるかも。(this を付けている場合は、fuga に隠されることがないので、この警告は出ません。) ただし、まだ不完全な部分もあります。フィールド変数 piyo を使用しているメソッドがあるとき、ここにローカル変数 piyo の宣言を追加すると、フィールド変数 piyo は隠されてしまいますが、Eclipse はこれを警告してくれません。このようなローカル変数の追加によってフィールド変数が隠されてしまう事故の可能性を考えると、フィールド変数には this を付けておいたほうが安全かもしれません。
Eclipse なら this を入力しなくても補完機能使えますよ。何もないところで、Ctrl + Space を押せば、ローカル変数、フィールド変数の順で一覧を出してくれます。 Eclipse ということで言えば、デフォルトの装飾が フィールド変数は青い細字、ローカル変数は黒い細字というのも区別が付きにくくていやです。設定変更すればいいだけの話ですがプロジェクト全体で統制をとるとなるとデフォルト設定を変更するのも結構大変で。 | ||||||||||||
|
投稿日時: 2007-07-17 12:42
鋭い突っ込みありがとうございます。 ご理解いただけているとは思いますが、参照はどうでもいいや、という意味ではありません。 更新のほうがより注意すべきだとは思いますが、オブジェクトの状態を参照しての処理というのも注意を払うべきです。 とくにオブジェクトの参照の場合、ローカル変数に代入した後にオブジェクト操作を行ってもやはり状態が変更されますので。 そうではない場合、どちらかといえば読み手に対しての配慮の意義が大きいかと思います。 オブジェクトの状態を参照してる箇所はオブジェクトの挙動としては重要な部分にあるだろうと思われます。 重要なポイントを読むにあたって誤読の可能性を極力減らすことが重要だというのは同意いただけるのではないでしょうか。 | ||||||||||||
|
投稿日時: 2007-07-17 13:33
ちょっと脱線気味になってしまうのですが...
Visual Studio でも同様の方法でインテリセンスは表示できます。 が、ローカル変数 > フィールド変数 > ... などのように優先的に表示ということはできないです。 Visual Studio でもこういったことができるようにオプションを付けてくれると嬉しいなと思いました。 (要望あげてみようかな)
一昔前しか使っていなかったので良く知らないのですが、Eclipse では 「設定のインポート / エクスポート」 はできないのでしょうか? Visual Studio 2005 であれば、.vssettings というファイルによって自動的にエクスポートされます。 また 「チーム設定ファイル」 を使うこともできます。 _________________ C# と VB.NET の入門サイト じゃんぬねっと日誌 | ||||||||||||
|
投稿日時: 2007-07-17 13:49
可能ですよ。 操作としては、「ファイル」→「エクスポート」→「一般 - 設定」となります。
インスタンスフィールド名とローカル変数が同じ場合、つまり、ハイディングしている場合だと思いますが、 デフォルトのコンパイル警告では無視かもしれませんね。 コンパイラの警告設定で検出できるようになります。 これにCheckstyleによるコーディング規約設定(命名ルールも正規表現で設定できる)と FindBugによる潜在的な危険のあるコードの警告をつけるとかなり強力です。 確かFindBugは各言語版が存在しましたよね? | ||||||||||||
|
投稿日時: 2007-07-17 14:18
いえ、ローカル変数による隠蔽警告とは微妙に意味合いが異なります。ローカル変数による隠蔽警告を設定すると、フィールド変数に this が付いていてローカル変数と区別できる(つまり実際には隠蔽されていない)場合でも、ローカル変数に警告が出てしまいます。 これはつまり「ローカル変数とフィールド変数に同じ名前を付けてはいけない」という規約を守るための設定です。(偏った規約なのでデフォルトではないのだと思います。) ローカル変数とフィールド変数に同じ名前を付けたい立場としては、この警告設定をすることはできません。 ただ、this を付けていなかったコードで、いままで、フィールド変数として認識されていたものが、ローカル変数宣言の追加によって、ローカル変数として認識されてしまう、対象変数の変化を警告して欲しいのです。 | ||||||||||||
|
投稿日時: 2007-07-23 11:20
thisキーワードは必ず付ける派だったのですが、囚人さんの発言(投稿日時: 2007-07-06 17:40)を読んで、ずっと悩んでました。
ふとこんなケースを思いつきました。
つまり、インスタンスフィールドを誤って静的フィールドにしてしまった場合に、thisキーワードを付けていればコンパイラが検出してくれるわけです。 |