簡體   English   中英

將數據結構轉換為其他數據結構

[英]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 } }

但我想在不同的地方使用轉換。 所以我需要提供封裝的邏輯來實現和重用它。 三種方式浮現在腦海中:

  1. 使用輔助方法(將單個方法放入模塊中):

     module Converter extend self def convert(input) input.split(";").map{|s| { content: s, length: s.size } } end end module Caller Converter.convert(input) end
  2. 使用帶有參數的專用類:

     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
  3. 使用改進,使用猴子補丁在數據對象上創建一個方法,但讓調用者決定是否應該包含它。

     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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM