我經常需要將某種數據轉換爲其他數據(通常是字符串,數組和散列)。例如:將數據結構轉換爲其他數據結構
- 輸入:
"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'。 – sawa
你說得對,我把'expected_output'全部改爲符號,現在應該是對的 – leifg