概要
Write total functions
前提
Confident Rubyではメソッド内の処理を次のように分類しています。
・Collecting Inputs(引数チェック、変換など)
・Performing Work(主処理)
・Delivering Output(戻り値に関わる処理)
・Handling Failure(例外処理)
当記事は上記のうち、Delivering Outputに関する話です。
詳細
状況
メソッドは0,1,または多くの結果を持つかもしれない
概要
すべてのケースでコレクションを返却する
理由
Arrayを返却することを保証することで、特別な条件をハンドリングせずに
コードを呼ぶことができる。
サンプルコード仕様
対象クラスのpublicインスタンスメソッドのうち、任意の名前に一致するメソッドを取得します。
ケース1では、
・複数結果:Array
・単一結果:String
・結果なし:nil
を返却します。
ケース2では
・複数結果:Array
・単一結果:Array(要素1)
・結果なし:Array(empty)
を返却します。
サンプルコード(その1)
class Hoge def hoge1;end def hoge2;end def hige;end end module Kernel def grep_instance_method(regexp, all = true) ret = self.new.public_methods(all).grep(regexp) case ret.size when 0 nil when 1 ret.first else ret end end end [/hoge/, /hige/, /hage/].each do |regexp| ret = Hoge.grep_instance_method regexp, false # String,nilの際にエラーになってしまう # p ret.map(&:upcase) # String, nilをArrayに変換する必要がある p Array(ret).map(&:upcase) end
出力
[:HOGE1, :HOGE2] [:HIGE] []
サンプルコード(その2)
class Hoge def hoge1;end def hoge2;end def hige;end end module Kernel def grep_instance_method(regexp, all = true) self.new.public_methods(all).grep(regexp) end end [/hoge/, /hige/, /hage/].each do |regexp| ret = Hoge.grep_instance_method regexp, false # Arrayの返却値が保障されているので、特に変換の必要なく次の処理を行うことができる p ret.map(&:upcase) end
出力
[:HOGE1, :HOGE2] [:HIGE] []