thisるぜ、超thisるぜ

 ともくんコードのお話 - プログラミングお勉強きろくブコメで勝手にthisつけるつけない議論が繰り広げられてたのだけど、自分の意見を少々。*1

 自分が新人や、オブジェクト指向慣れしていない人に教える際はthisをつけるところは全てつけるように教えている。これは可読性の話とはちょっと視点が違う。現代のIDE構文解析した上でのシンタックスハイライトが当たり前だから、thisの有無でstaticなものとインスタンスのものを見分ける必要性がない。というか、インスタンスのメンバへのアクセス全てにthisをつけろと言う方がそもそもヒューマンエラーが起きやすいわけで、信頼できない。

 可読性の話じゃないとすれば何か、ということなのだけど、オブジェクト指向慣れさせるためにthisをつけさせている。

 このメソッド、あるいはフィールドへのアクセスは、どのオブジェクトに対するものなのか?それを意識させる効果があると僕は考えている。thisなしの、時にはstaticな、時にはインスタンスの、時にはローカル変数の、みたいな変化をするものを文脈で読み解く方が初心者を混乱させる。冗長な表現を省略なしでわざと書かせることで、ここはthisオブジェクトへのメソッド呼出しだな、ここはthisオブジェクトのフィールド参照だな、ということを意識させる。

 この修行法はわりと効果が高い。

 さらに言えば、Hogeクラスの中のPiyoクラスというエンクロージング型の内部クラスのインスタンス間の関係とか、ややこしい話になるとさらに効果が出る。Hoge.this.xxxとthis.xxxの違いを理解させるには非省略記法をまず覚えさせるほうがいい。省略記法を前提に、シャドーイングしてたらコレで、してなかったらコレで、みたいな話をするより理解が早い。

 慣れないうちはthisを付けておいた方がいい。何に対して操作を行おうとしているのか意識する癖をつけておくといい。無意識にオブジェクトを操作できるようになったらthisる必要はないけど、後に読む他の人の為に、ここはthisに対して操作しているんだよってことを強調したければ、thisを明示した方がいい。

*1:元記事と関係ない方向で話題が盛り上がるのは、ねじれの位置のような話だと思うがどうか。