0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

カスタムチェックの作り方 - チェックする/しないの判定

Last updated at Posted at 2015-04-02

社内共有用に英語化する前の下書き

どこで判定するの?

カスタムチェックを作りはじめると、すぐに「このクラスはチェックしたい」「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 にチェックする/しないの判定を集約する事をおススメするが、絶対ではなく、ここにチェックを集約しても構わない。
(こちらを使うならここにチェックする/しないの判定を集めて欲しい)

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?