[Ruby] DecisionTable を簡単に作る

by tanabe on October 25, 2007

DecisionTable を書くのに全パターンを書くのはとても面倒。面倒なことはコンピュータにやらせよう。

ということで、Ruby で書いてみた。


class DecisionTable
  attr_accessor :patterns

  def initialize(patterns = [])
    @patterns = patterns
  end

  def horizontal
    rows
  end

  def vertical
    rows.transpose
  end

  def table
    format_table vertical
  end

  private
  def rows
    pattern_map(1, @patterns.dup)
  end

  def pattern_repeats(patterns)
    return 1 if patterns.empty?
    patterns.map {|r| r.size }.inject {|r, n| r * n }
  end

  def pattern_map(repeat, patterns)
    return [] if patterns.empty?
    pattern = patterns.shift
    return pattern.map {|p| [p] * repeat }.flatten * pattern_repeats(patterns), *pattern_map(repeat * pattern.size, patterns)
  end

  def format_table(table)
    table.map {|r| format_row r }.join("\n")
  end

  def format_row(row, separator="\t")
    row.map {|c| "\"#{c}\"" }.join(separator)
  end

end


if __FILE__ == $0
  patterns = [
    %w{m f},
    %w{5 10 15},
    %w{5 10 15},
    %w{0-10 11-45 45-60 60-65}
  ]

  dt = DecisionTable.new(patterns)
  puts dt.table
end


出力を Excel に貼って、各パターンの結果を書けばルールテーブルのできあがり。