

現在,[qiita-markdown](https://github.com/increments/qiita-
markdown)というライブラリを使用して，自分のブログにソースコードを表示したいと考えています．しかし，出力結果が気にくわなかったので，内部のソースコードを自分でいじろうと読んでみたら，やや冗長な書かれ方をしている箇所があったため質問しました．  
気になった箇所は以下です.

[code]

    class Highligher
      def initialize(default_language: nil, node: nil, specific_language: nil)
        @default_language = default_language
        @node = node
        @specific_language = specific_language
      end
    
      def self.call(*args)
        new(*args).call
      end
    
      def call
        outer = Nokogiri::HTML.fragment(%Q[<div class="code-frame" data-lang="#{language}">])
        frame = outer.at("div")
        frame.add_child(filename_node) if filename
        frame.add_child(highlighted_node)
        @node.replace(outer)
      end
    
    
    ### ソースコード内では以下のような使われ方をしていた
    Highlighter.call(
      default_language: default_language,
      node: node,
      specific_language: timeout_fallback_language,
    )
    
[/code]

なぜ，わざわざ，Highligherのクラスメソッドであるcallを呼び出し，Highligherクラスのインスタンスを生成しているのでしょうか？

普通は以下のような書き方になると思います．

[code]

    class Highligher
      def initialize(default_language: nil, node: nil, specific_language: nil)
        @default_language = default_language
        @node = node
        @specific_language = specific_language
      end
    
    
      def call
        outer = Nokogiri::HTML.fragment(%Q[<div class="code-frame" data-lang="#{language}">])
        frame = outer.at("div")
        frame.add_child(filename_node) if filename
        frame.add_child(highlighted_node)
        @node.replace(outer)
      end
    
    
    Highlighter.new(
      default_language: default_language,
      node: node,
      specific_language: timeout_fallback_language,
    ).call
    
    
[/code]

このような，やや冗長な書き方をしているのには，何か理由があると思います．  
どのような理由があると考えられるか教えていただけると幸いです．


CC BY-SA 4.0
2019-01-16T09:14:53.097
52018
2019-01-16T13:29:43.393
2019-01-16T09:32:07.673
31805
31805
question
ruby-on-rails ruby
クラスメソッド内でインスタンスを作成するような冗長な書き方をしている理由


単純に、毎回 Highlighter オブジェクトを作成するのが、手間だからではないでしょうか。 new してから call する、という動作と、おもむろに
Highlighter を呼び出したら( call
したら)、いい感じにハイライトされて返ってくるのでは、利用側からしたら、後者の方が幾分か手間が少なく感じられるのではないかと思います。


CC BY-SA 4.0
2019-01-16T13:29:43.393
52032
2019-01-16T13:29:43.393
754
52018
answer