とんちむ日記

RubyとJavaScriptと猫が好きです

privateメソッドは共通化するべき?

久しぶりのブログ・・。もうすぐエンジニアになって2年経ちます。以前に比べたら少しはスキル上がったのかなぁ?

さてRailsで、似たようなモデルを扱うコントローラーがあってprivateメソッドが割と似たような処理をしていたのでせっかくだしActiveSupport::Concernで共通化しようと思った。

module Concerns
  module Common
    extend ActiveSupport::Concern

    included do
      private :method_a
    end

    def method_a
      puts 'i am method_a'
    end

    def method_b
      puts 'i am method_b'
    end
  end
end

class Hoge
  include Concerns::Common

  def call_a
    method_a
  end
end

hoge = Hoge.new

hoge.mehtod_a
#=> NoMethodError: private method `method_a' called for #<Hoge:0x007fb7f705d258>

hoge.call_a
#=> i am method_a

hoge.method_b
#=> i am method_b

Concerns::Commonをincludeした時にmethod_aはprivateメソッドとしてmethod_bはpublicメソッドとしてinclude先で扱うことができる。

ただ・・・やってて思ったんだけれど、そもそもprivateな状態のメソッドを共通化するべきなんだろうか? 「似た操作をするけど直接関係のないクラス」が無駄に結びついてしまったような気もする・・。

僕はprivateメソッドを使うときはpublicメソッドの重複を排除するときに使うことが多いと思っているんだけれど、そのprivateメソッドが別のクラスにもあって重複してる場合ってどうするのがいいんだろう??