グローバル状態をstatic APIで触りたくない
まとめ
依存してるグローバル状態はDIで表したい。
グローバル状態を触るstatic API
業務でPlayを使ってるんだけど、 プロジェクト中でフラッシュスコープを扱う際には、 staticメソッド詰め込んだ自作ラッパを使ってる。
これ、最初見たときグローバルな状態を操作してるAPIだって分からなかったし、 今でも他のチームメンバーの書いたソースを読む時は隅から隅まで注意して読まないと、privateメソッドのどっかでグローバル状態が書き換わってたりするのに気付かなかったりする。
public SomeClass someMethod() { ... otherMethod(); ... } private void otherMethod() { ... StaticApi.someApi(); // ここでglobal stateが書き換わる ... }
グローバル状態に依存…依存と言えば
static APIが呼ばれてるかどうかなんて基本的にメソッドの定義を読みに行かないと分からないし (grepしたり呼び出し階層を調べたりするのも調べる手間が掛かるという点で同義)、 メソッドを一目見ただけで何のグローバル状態に依存してるか分かれば楽なのに…と思った所で、思い至る。
あ、これDIやん。
メソッド引数にAPIオブジェクト渡すなり、 アノテーション付けてコンテナにDI任せるなり、 方法は何でもいいけど依存性を明記した方が圧倒的に分かりやすい。
public SomeClass someMethod(DynamicApi api) { ... otherMethod(api); ... } private void otherMethod(DynamicApi api) { ... api.someApi(); ... }
Static APIの非推奨化
で、実際Play公式も同じようにstatic APIを非推奨にして、 DIを使った同機能のAPIを使うように推奨してたりする。
既存プロジェクトをPlay 2.5に移行しようとした時にたっぷりと非推奨警告が出て焦ったり、 「何でこれ置き換える必要あるんだよこれ」とか思ったりしたけど、 要するにこういうことなんだと理解した。
グローバル状態は無くしたいし、グローバル状態を変な所で操作されたくないってことですね。