我经常需要将某些类型的数据转换成其他数据(通常是字符串、数组和散列)。例如:
"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 } }但我想在不同的地方使用转换。因此,我需要提供封装逻辑来实现和重用这一点。脑海中闪现出三种方式:
我对其中任何一种都不满意,但第三种选择似乎是最干净的,因为如果您处理自定义对象,通常会这样做。但它也感觉不对,因为它是猴子修补光。你的想法是什么?
发布于 2015-07-22 00:15:51
从面向对象的角度来看,这是很好的。
我喜欢你的第二个建议的一个变化,有一个小的区别--使用一个对象,但是不要实例化它。
class StringConverter
def self.to_size_hash(string)
string.split(';').map { |s| { content: s, length: s.size } }
end
end
2.2.2 :001 > StringConverter.to_size_hash "a;simple;list"
=> [{:content=>"a", :length=>1}, {:content=>"simple", :length=>6}, {:content=>"list", :length=>4}]只要这个类只做一件事,一次,我就想不出有什么好的理由把它保存在内存中。
这种方法的好处是,您可以将逻辑封装在StringConverter类中,而无需编写另一个模块(问题中的第一个选项),也不需要更改String类的预期行为(第三个选项)。它是用于此转换的专用类,您可以在任何需要它的地方使用它。
https://stackoverflow.com/questions/30792078
复制相似问题