classのインターフェイスについて


RubyでClassを作っているのですが、どちらのインターフェイスの方が良いのか悩んでいます。

パターンA

[code]

    class Hoge
      def piyo=(piyo_data)
        #do_something
        @piyo = piyo_data
      end
    
      def fuga=(fuga_data)
        #do_something
        @fuga = fuga_data
      end
    
      def send
        Api.call({
          piyo: @piyo,
          fuga: @fuga
        })
      end
    end
    
    # Usage
    hoge = Hoge.new
    hoge.piyo = piyo
    hoge.fuga = fuga
    hoge.send
    
[/code]

パターンB

[code]

    class Hoge
      def send(piyo_data, fuga_data)
        Api.call({
          piyo: piyo(piyo_data),
          fuga: fuga(fuga_data)
        })
      end
    
      private
      def piyo(piyo_data)
        #do_something
        piyo_data
      end
    
      def fuga(fuga_data)
        #do_something
        fuga_data
      end
    end
    
    # Usage
    hoge = Hoge.new
    hoge.send(piyo, fuga)
    
[/code]

パターンAは、いちいち各メソッドでデータをセットしていくのが使う側からすると面倒くさそうに見えます。パターンBは、引数が増えてきたときにわかりにくそうに見えます。




ライブラリとして提供するのであれば、あらゆる手段を用意するというのがRubyの文化に近いと思います。

[code]

    class Hoge
      def initialize(piyo_data = nil, fuga_data = nil)
        piyo = piyo_data if piyo_data
        fuga = fuga_data if fuga_data
      end
    
      def piyo=(piyo_data)
        @piyo = piyo(piyo_data)
      end
    
      def fuga=(fuga_data)
        @fuga = fuga(fuga_data)
      end
    
      def send(piyo_data = nil, fuga_data = nil)
        Api.call({
          piyo: (piyo_data ? piyo(piyo_data) : @piyo),
          fuga: (fuga_data ? fuga(fuga_data) : @fuga)
        })
      end
    
      private
      def piyo(piyo_data)
        #do_something
        piyo_data
      end
    
      def fuga(fuga_data)
        #do_something
        fuga_data
      end
    end
    
    # Usage
    # 初期化時に設定
    hoge = Hoge.new(piyo, hoge)
    hoge.send
    # 後から設定
    hoge.piyo = piyo
    hoge.fuga = fuga
    hoge.send
    # 呼び出し時に設定
    hoge.send(piyo, fuga)
    
[/code]

