パンくず
書籍 Refactoring to Patterns
Accumulation
Move Accumulation to Collecting Parameter
概要
Move Accumulation to Collecting Parameterについて
使用する場面
一つのローカル変数に対する変更をまとめて行なっている一つのメソッドがあるなら、
このパターンで分割する。
対応方法
Collecting Parameterでリファクタリングする。
利点と欠点
利点
・単位を小さく、シンプルに、読み易くする。
・コードを早く読める
欠点
・なし
サンプル
SQL文を取得する機能を実装します。
リファクタリング前
# encoding: Windows-31J require "pp" class SqlCreator attr_accessor:sql def getSql(columns, table, condition) sql = "select " columns.each{|column| sql << "#{column.column_name}," } sql.chop! sql << " from #{table}" sql << " where key='#{condition}'" end end class Column attr_accessor:column_name def initialize(column_name) @column_name = column_name end end columns = [Column.new("column1"), Column.new("column2"), Column.new("column3")] puts SqlCreator.new.getSql(columns,"table", "key")
リファクタリング後
# encoding: Windows-31J require "pp" class SqlCreator attr_accessor:sql def getSql(columns, table, condition) getSelect(columns) getFrom(table) getWhere(condition) return @sql end private def getSelect(columns) @sql = "select " columns.each{|column| @sql << "#{column.column_name}," } @sql.chop! end def getFrom(table);@sql << " from #{table}";end def getWhere(condition);@sql << " where key='#{condition}'";end end class Column attr_accessor:column_name def initialize(column_name) @column_name = column_name end end columns = [Column.new("column1"), Column.new("column2"), Column.new("column3")] puts SqlCreator.new.getSql(columns,"table", "key")
出力内容
select column1,column2,column3 from table where key='key'