ブロックってお手軽だけど
Rubyを使ってプログラムを書いてると、ブロックを使って普段(Java)とかで絶対に書かないようなとこまで細分化して書ける。何もしないブロックを渡すことで if 文が1つ減ったりするのでうれしい。
ただ、ブロックってのは便利なので安易に使いがちなんだけどpublicなメソッドだと注意が必要ぽい。
ブロックを受けとるか受けとらないかチェックしたほうがいいぽい
これは、ブロックを受けとらないメソッドでありがち。アクセサメソッドに続いてブロックをとるときに、たまにアクセサメソッドの方にブロックを与えてしまう。テスト書いてれば気付くんだけどテストコードにこれが書いてあるとタチがわるい。全然気付かない。
そんな風に書けてしまうAPIに問題があるのかもしれんが。
yieldの後ろのコードはensureに持ってくるべきか考える必要があるぽい
例外設計した時点で気付くかこれは。
ブロックの中では何が起きてもおかしくないので例外のことも考えてないといかん。
例外なんてもうシステムが死ぬときだからどうでもいいやって思ってたこともあったけど全然ダメ。できるだけそのメソッドを呼び出す前に戻すように努力して書かなきゃいかん。
Java だとチェックされる例外とそうでないのでコンパイラが怒る。ただ、興味のない例外も全部投げなきゃいかんから面倒なんだな。
Rubyは実行しないとわかんないからそんなのないな。
で、Rubyだとensureの中身が前処理と同じインデントレベルで書けるからとてもいい。
def method(*args, &block) ...前処理... yield ensure ...後処理... end
前処理、後処理って仰々しいイメージだけどRubyの場合、ちょっとしたことで書くのでだとそんなでもない。
とはいえ、たいてい副作用を伴う処理に必要なんだけど。