社内共有用に英語化する前の下書き
どこで判定するの?
カスタムチェックを作りはじめると、すぐに「このクラスはチェックしたい」「private メソッドはチェックしなくていいや」と、チェックする/しないを切り分けたくなる。
そこで既存のチェックのコードを読んでみたり、使えそうなメソッドを探すと……なんだか色々ある。
いったいどうすればいいんだ?
結論
以下ふたつを使い分けよう。
- shouldVisit
- shouldVisitCode
概要
それぞれ以下の特徴がある。
shouldVisit | shouldVisitCode | |
---|---|---|
タイミング | クラス毎 | メソッド毎 |
skip visit(Field) | ○ | × |
skip visit(Method) | ○ | × |
skip sawOpcode | ○ | ○ |
shouldVisit が false を返すと、チェック処理全体がスキップされる。
一方 shouldVisitCode はバイトコード解析を行う sawOpcode 系をスキップする。
また、shouldVisit はクラス単位なのに対し、shouldVisitCode はクラス内の各メソッド毎に処理を制御できる。
その他
以下のメソッドで分岐しても構わない
beforeOpcode
false を返すと sawOpcode をスキップできる。それだけだと shouldVisitCode と同じだが、こちらは Opcode 系の情報が出揃ってから呼ばれるので、それを元に分岐したい場合に有効。
あるいは、sawOpcode 汎用チェックメソッドではなく、sawMethod や sawInt のような個別のチェックメソッドのみを使う場合も、beforeOpcode で false を返し、sawOpcode をスキップしても構わない。sawOpcode をスキップしても sawMethod などは呼ばれる。
(shouldVisitCode で false を返すと全部スキップされる)
ただし、super.beforeOpcode を先に呼んでチェックすること。
親クラスで false が返っているのに true を返すともちろん動かない。
visitJavaClass / visit(JavaClass)
チェックの入り口であり、ここでチェックしているサンプルも結構ある。
クラス情報はあるし、余計な処理が一切行われなくなるので早いが、shouldVisit と比べてメソッド名が明示的でなく気持ち悪い。
見通しという観点から shouldVisit / shouldVisitCode にチェックする/しないの判定を集約する事をおススメするが、絶対ではなく、ここにチェックを集約しても構わない。
(こちらを使うならここにチェックする/しないの判定を集めて欲しい)