Kouhei Sutou
kou****@clear*****
Fri Dec 20 11:13:13 JST 2013
> + method(sub_formatter_method_name).call(formatted_result)
これは、
__send__(sub_formatter_method_name, formatted_result)
でいいですね!
ところで、SUB_FORMATTERSを使ってメタプログラミングチックなこ
とをするのはオーバースペックな気がしました。
今回のケースでは、こんな感じでcase whenで十分だと思いました。
def format
formatted_result = {}
(@request.output || []).each do |name|
case name
when "count"
value = format_count
when "attributes"
value = format_attributes
when "records"
value = format_records
when "startTime"
value = format_start_time
when "elapsedTime"
value = format_elapsed_time
else
next
end
formatted_result[name] = value
end
end
formatted_result
end
というのは、SUB_FORMATTERSを導入しても変更箇所を局所化できて
いないからです。新しくsub formatを追加したいときは
* SUB_FORMATTERSに対応関係を追加
* 違う場所でフォーマット用メソッドを定義
としなければいけません。
もし、sub formatterがメソッドじゃなくて、クラスになっていて
class CountFormatter
RsultFormatter::SUB_FORMATTERS["count"] = self
def initialize(search_request, search_result)
@request = search_request
@result = search_result
end
def format
@result.count
end
end
class AttributesFormatter
RsultFormatter::SUB_FORMATTERS["attributes"] = self
def initialize(search_request, search_result)
@request = search_request
@result = search_result
end
def format
# ...
end
end
# ...
みたいに、自分のところで新しいsub formatを追加できて、
def format
formatted_result = {}
(@request.output || []).each do |name|
sub_formatter_class = SUB_FORMATTERS[name]
next if sub_formatter_class.nil?
sub_formatter = sub_formatter_class.new(@request, @result)
formatted_result[name] = sub_formatter.format
end
end
formatted_result
end
という感じになっているなら変更箇所を局所化できていて
SUB_FORMATTERSを導入するメリットはある気がします。
ただ、sub formatはこれからモリモリ追加されていくようなもので
はない(例えば、ユーザーがプラグインで自由に追加できるもので
はない)ので、SUB_FORMATTERSを導入するのはオーバースペックに
感じました。(つらつらと並べても割にあいそう。)
In <1b2230843ca7306f6e4c9bfbc07aca2a4b3b8bca �� jenkins.clear-code.com>
"[Groonga-commit] droonga/fluent-plugin-droonga �� 1b22308 [master] Use SUB_FORMATTERS map to iterate over formatters" on Thu, 19 Dec 2013 19:55:41 +0900,
Yoji Shidara <null+groonga �� clear-code.com> wrote:
> Yoji Shidara 2013-12-19 19:55:41 +0900 (Thu, 19 Dec 2013)
>
> New Revision: 1b2230843ca7306f6e4c9bfbc07aca2a4b3b8bca
> https://github.com/droonga/fluent-plugin-droonga/commit/1b2230843ca7306f6e4c9bfbc07aca2a4b3b8bca
>
> Message:
> Use SUB_FORMATTERS map to iterate over formatters
>
> Modified files:
> lib/droonga/searcher.rb
>
> Modified: lib/droonga/searcher.rb (+12 -18)
> ===================================================================
> --- lib/droonga/searcher.rb 2013-12-19 19:16:13 +0900 (8cd6782)
> +++ lib/droonga/searcher.rb 2013-12-19 19:55:41 +0900 (1a2f13a)
> @@ -325,6 +325,14 @@ module Droonga
> end
>
> class ResultFormatter
> + SUB_FORMATTERS = {
> + "count" => :format_count,
> + "attribtues" => :format_attributes,
> + "records" => :format_records,
> + "startTime" => :format_start_time,
> + "elapsedTime" => :format_elapsed_time
> + }
> +
> class << self
> def format(search_request, search_result)
> new(search_request, search_result).format
> @@ -339,24 +347,10 @@ module Droonga
> def format
> formatted_result = {}
>
> - if need_element_output?("count")
> - format_count(formatted_result)
> - end
> -
> - if need_element_output?("attributes")
> - format_attributes(formatted_result)
> - end
> -
> - if need_element_output?("records")
> - format_records(formatted_result)
> - end
> -
> - if need_element_output?("startTime")
> - format_start_time(formatted_result)
> - end
> -
> - if need_element_output?("elapsedTime")
> - format_elapsed_time(formatted_result)
> + SUB_FORMATTERS.each do |name, sub_formatter_method_name|
> + if need_element_output?(name)
> + method(sub_formatter_method_name).call(formatted_result)
> + end
> end
>
> formatted_result