【发布时间】:2015-06-11 21:51:41
【问题描述】:
我经常需要将某种数据转换成其他数据(通常是字符串、数组和散列)。例如:
- 输入:
"a;simple;list" -
expected_output:[ { content: "a", length: 1 }, { content: "simple", length: 6 }, { content: "list", length: 4 } ]
这可以通过以下方式完成:
input.split(";").map{|s| { content: s, length: s.size } }
但我想在不同的地方使用转换。所以我需要提供封装的逻辑来实现和重用这一点。三种方式浮现在脑海中:
-
使用辅助方法(将单个方法放入模块中):
module Converter extend self def convert(input) input.split(";").map{|s| { content: s, length: s.size } } end end module Caller Converter.convert(input) end -
使用带参数的专用类:
class Converter def initialize(input) @input = input end def convert @input.split(";").map{|s| { content: s, length: s.size } } end end module Caller Converter.new(input).convert end -
使用改进,使用猴子补丁在数据对象上创建一个方法,但让调用者决定是否应该包含它。
module Converter refine String do def convert self.split(";").map{|s| { content: s, length: s.size } } end end end module Caller using Converter input.convert end
我对其中任何一个都不满意,但第三个选项似乎是最干净的,因为如果您处理自定义对象,通常会这样做。但它也感觉不对,因为它是猴子修补光。你有什么想法?
【问题讨论】:
-
第三个选项基本上就是打算如何使用细化。
-
这些都不会给你
expected_output。 -
你说得对,我把
expected_output键都改成了符号,现在应该是对的
标签: ruby oop coding-style data-conversion