これは以前にも、不具合の元となったことで、
./lib/stats.rbで言うと、
def profits
@profits ||= @trades.map {|trade| trade.profit}
end
このやり方です。
profitsにまだ値が設定されてなければ、計算する。
既に値が設定されていれば、その値を返す。
ってことですが、
こんなやり方してるのは、毎回計算するのがムダだからです。
問題もあり、
ここではtrades、計算の元となるデータが差し替えられると、
再計算が必要ですが、このやり方では再計算されず、
古い値を返してしまいます。
そういう可能性が無いことを確認した上で、
計算回数を減らすというメリットを享受しなければなりません。
後から機能追加したときに、
思わぬ不具合を起こしたりしかねないですから、
私はこのやり方反対です。
コンストラクタでしか、tradesを設定する可能性が無いなら、
コンストラクタで一度計算してその結果を常に返すようにしますね。
他にも設定のタイミングがあるのなら。
設定するタイミングで計算結果も格納するという原則にしときます。
どうせ、Rubyは遅いのに、そこだけ微々たる処理速度向上させてもね。
毎回計算でもいいです。焼け石に水ですから。
私は推奨しないやり方ですし、
ヤルには充分注意が必要です。リスクのわりにメリット少ない。
話変わりますが、今年の日本シリーズ第一戦古田が解説してました。
一三塁で広島がダブルスチールしかけて、
キャッチャーはピッチャーカットのサイン出してて返球。
しかし、大谷はスルーしてセカンドにボールが、、
ピッチャーカットで、ホームに返す予定ですから、
野手は戸惑い、三塁ランナーはホームイン。
古田曰く、
このプレーはピッチャーよくサイン見落とす。
ピッチャーカットしても、首尾よく三本間で挟めるとも限らないから、
あまりメリット大きくない。
最悪、ポールはセンターまで転がる可能性もあり、
リスクのわりにオイシくない。
「ボクなら、セカンドへ投げない。たとえ一塁ランナーが二塁に進んでも。」
と名捕手は解説してました。
野球知らないとなんのこっちゃですが、
まあ、そんな感じです。
質問コーナー、お問い合わせは、sanpome.net@gmail.com まで。