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を見つけやすくて助かるのだけど。。。