リフレクションやメタプロ的な機能は避けような
リフレクションとかメタプロ的なものを触るのは楽しい。わかる、わかるよ。
もちろん知識としては知っておくべきだし、知っておくとフレームワークやライブラリの裏側が想像できてトラブルシューティングのときに便利だ。
メタプロ的機能の辛いところ
まず静的型な言語やIDEの推論がいいかんじに働く言語の場合、あるコードの呼び出し箇所が分からなくなってしまう。静的型の言語の場合はコンパイルエラーが出せなくなってしまうので、コンパイル時に防げた不具合をランタイム時まで持ち込んでしまう。コンパイラやIDEに仕事をさせたいと思ったときにメタプロ的機能は邪魔になってしまう。
次に互換性の問題。privateメソッドを呼び出したりモンキーパッチなどで振る舞いを変えたりした場合は、ライブラリの意図から外れた使い方をしているので互換性が壊れてしまっても文句を言えない。大体のライブラリは破壊的変更をChangeLogあたりに書いてくれるが、モンキーパッチやprivateメソッドを呼び出して書き換えていた場合はコードの変更にもっと敏感にならなければいけない。簡単に壊れてしまう。
バグを見つけたならPRを投げたりしてコミュニティに貢献しよう。バグ修正を取り込んでもらえたら他のコントリビューターがいい感じに保守してくれたりいい感じにしてくれるしみんな幸せになれる。
判断基準
上に挙げた辛いところを受け入れた上でコードが宣言的になるほどのメリットがあるかを考える。大体の場合は不要なはず。
ロギングみたいな横断的関心事を扱うときにAOP的機能を使うことがあるのかなくらい。それでもFilterでなんとかなったりするけど。
結論としては、メタプロ的機能は楽しいけど保守するコードで使うなら相応の覚悟を持ってやってねということ。