[英]Converting data structures to other data structures
我經常需要將某種數據轉換為其他數據(通常是字符串、數組和哈希)。 例如:
"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
我對它們中的任何一個都不滿意,但第三個選項似乎最干凈,因為如果您處理自定義對象,這通常是您要做的。 但它也感覺不對,因為它是猴子修補燈。 你怎么看?
很高興您從面向對象的角度來解決這個問題。
我喜歡你的第二個建議的變化,有一點不同——使用一個對象,但不要實例化它。
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
類的預期行為(第三個選項)。 這是用於此轉換的專用類,您可以在任何需要的地方使用它。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.