前の記事に関連して
時刻オブジェクトをテストのため(だけ)にinject可能にしておくの正直言ってテストで設計を歪めてると思ってしまうタイプなのでハイジャックできる裏口用意しておいてほしい派です
— 猫型🐱蓄音機 (@shinpei0213) 2018年1月22日
時刻オブジェクトをハイジャックしちゃいけない理由、だいたいの場合グローバルに書き換えちゃうからスレッドセーフにできない問題はたしかにあるので、正しいとは思うんだけどね
— 猫型🐱蓄音機 (@shinpei0213) 2018年1月22日
実コードでハイジャックしたらそれは終わりなので,まあ自分の足を撃ち抜かないようにしましょうという話ではあり,そして足を撃ち抜くような人がいる場合は一律で禁止しましょう!! みたいな理屈は分からないではない……
— はいじゃないが (@moznion) 2018年1月22日
「実コードでハイジャックしたらそれは終わりなので,まあ自分の足を撃ち抜かないようにしましょうという話ではあり,そして足を撃ち抜くような人がいる場合は一律で禁止しましょう!!」が理解されるチームなら自分の足を撃ち抜くひといなそう
— 猫型🐱蓄音機 (@shinpei0213) 2018年1月22日
しかしここで「テストに時間がかかりすぎるので並列化したいです」って話が出てきた場合に「じゃあスレッドたくさん動かしましょう」「アッ時刻のテストがスレッドセーフじゃないから平行で動かすと落ちる!!」みたいな
— 猫型🐱蓄音機 (@shinpei0213) 2018年1月22日
「プロセス分ければいいじゃん」「まじかよJVMたくさん起動すんの!?」「やっぱり時刻をハイジャックしたらいけなかったんだ……」「ううむ」みたいなのはすごい理解できる
— 猫型🐱蓄音機 (@shinpei0213) 2018年1月22日
プログラミングは難しいのでやめましょう
— 猫型🐱蓄音機 (@shinpei0213) 2018年1月22日
だから副作用はむずかしいんだよ……
— 猫型🐱蓄音機 (@shinpei0213) 2018年1月22日
なんかねー、Perlの local 変数 (レキシカル変数ではない)欲しくなることあるんだよね。そのコールスタック内でのみ値が書き換わるやつ。それがあればグローバルにハイジャックされてしまって並行性に問題が出る件解決する気がするのん
— 猫型🐱蓄音機 (@shinpei0213) 2018年1月23日
でも「グローバルにハイジャックしちゃうと、テストを並行で動かしたいときに困るじゃん」は「テストのために実装を歪めたくない」に対する反論としては筋がずれてるんだよな
— 猫型🐱蓄音機 (@shinpei0213) 2018年1月23日
反論としては「現在時刻の取得は副作用なので、自由にいろんなところに書くんじゃなくて局所化すべき」とかのほうが全然納得行く
— 猫型🐱蓄音機 (@shinpei0213) 2018年1月23日
「副作用は局所化すべきだからいろんなところで現在時刻取得すべきではない」にはかなり説得力あって、「テストしにくいってことはそこは設計が歪んでいるんだ」って主張と整合性がある。
— 猫型🐱蓄音機 (@shinpei0213) 2018年1月23日
たとえば「ひとつのトランザクション内の複数の場所で"現在時刻"を取得したらバグったりしない?」とかあるので、それも考えると「現在時刻の取得は副作用でありハンドルしにくいので局所化して外からinjectすべき」はかなり説得力ある
— 猫型🐱蓄音機 (@shinpei0213) 2018年1月23日
とかそのへんのことを考えたので「テストのため(だけ)にinjectするの嫌い」という言い方になってる
— 猫型🐱蓄音機 (@shinpei0213) 2018年1月23日
結論、一般論としてはケース場合ケースですね、というところに落ち着くんだけど、上述のような問題点を理解した上で、個別のケースにおいては「今回雑でいいからXXで」「じゃあそれで」みたいに判断できると良いですよね。こちらからは以上です。