内部で現在日時を取得してそれによってなにか判断したてたりするやつが好きではない。
結構よく見かける。
例えば以下のような年齢を求めるロジック。
class human() def age() today = Date.today() age =# (todayと生年月日で年齢を計算) return age end end
なにが悪いか?
処理が現在時刻に依存している。
依存はできるだけ排除したい。
依存していることで起こるめんどくさい事としては、、
実行するたびに結果が変わるから(実行するたび時間がちがうから)テストしづらい。
実行結果がどうなるか一意に決まらないのでテストコードをかけない。
融通がきかない
例えば、本日の年齢ではなく「特定の時点での年齢」が必要になった時に使えない。
(ある過去データをその時点の年齢とともに表示する必要が発生した等)
内部で現在時刻を取得していると、つねに現在時刻で算出してしまうので使えない。
どうしたい?
こんな感じにしたい。
class human() def age(date) age =# (dateと生年月日で年齢を計算) return age end end
これで、現在の年齢も過去のある時点での年齢も算出できる。テストも書きやすい。
現在の年齢を算出する機会が圧倒的に多くてdateを渡すのがめんどくさい等のときは、
class human() def current_age() return age(Date.today()) end def age(date) age =# (dateと生年月日で年齢を計算) return age end end
こんな感じで便利メソッドとして用意してもいいと思う。
他にも
時間だけでなくて、処理メインロジックの内部から外部にデータを取りに行くのはできるだけやりたくない(DBにデータを取りに行くとか)。
必要なデータは明示的に渡してやるようにすると、テストもしやすいし応用が効くと思う。