Tbpgr Blog

Employee Experience Engineer tbpgr(てぃーびー) のブログ

Ruby | Delivering Result | Write total functions

概要

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]
[]