ClassX::ValidateでHashをチェックする

http://d.hatena.ne.jp/rubikitch/20080710/1215641240

メソッドの引数にHashをとるのはいっぱいあるときでもきれいに書けるので個人的にはあまり嫌いではない。

classXを使うとHashのチェックが柔軟にできるよというおはなし。

require 'classx/validate'

class YourClass
 include ClassX::Validate

 def run params
   validate params do
     has :x
     has :y, :default => proc { {} }, :kind_of => Hash
   end

   # do something with params

 end
end

classXのアクセサの宣言の仕方でHashをチェックできる。メソッドに渡すべきオプションを宣言的に書くことでコードも読みやすくなるはず。

実は内部ではブロックで指定したアクセサを持つclassXベースの無名クラスを作りclassXのアクセサのValidateをさせているだけ。戻り値はその無名クラスのインスタンスなのであまりかっこよくはないけど使う方が堅実に書ける。

require 'classx/validate'

class YourClass
 include ClassX::Validate

 def run params
   validated_params = validate params do
     has :x
     has :y, :default => proc { {} }, :kind_of => Hash
   end

   p validated_params.x
   validated_params.y = '' # => raise ClassX::InvalidAttrArgument
   # do something with params

 end
end

classXはhttp://github.com/walf443/classx/tree/masterで公開してます

RubyCocoaでFluent Interfaceはどうか

http://subtech.g.hatena.ne.jp/secondlife/20080709/1215530958のFluent InterfaceはRubyCocoaの呼びだしで使えたらうれしいかもと思った。

今はobjc_sendをつかって、

    NSTimer.objc_send(:scheduledTimerWithTimeInterval, 120,-
      :target, self,
      :selector, 'update',
      :userInfo, nil,
      :repeats, true
    )

なふうに書いているのだけど、

NSTimer.objc_send_fluent(:scheduledTimerWithTimeInterval, 120).target(self).selector('update').userInfo(nil).repeats(true).execute

とか書けるのはどうかなと思ったけど、Cocoaに投げるまでメソッドがないかどうかは結局わからないのであまりうれしくもない気がする。

間違ったメソッドを実行した時点でエラーになってくれるとtypoを見つけやすくて助かるのだけど。。。