Nobody
2015/11/28 16:11:10 投稿
4

ブロックを使って、繰り返し使うコードをメソッドに切り出す

Rubyでは、ブロックを使うことで コードのかたまり を引数のように扱うことができます。

この機能を利用すれば、 ほとんど同じなんだけど微妙に違うメソッド を多少すっきり書くことができます。

繰り返し使うコードがあるんだけど、デザインパターンほど仰々しくしたくないんだよなぁ、という時などにいかがでしょうか。

サンプルコードでは、SNSからの投稿取得を題材に、ブロックを利用して繰り返し使うコードをメソッドへと切り出しています。

Before

# fbのfeedを全て取得する
def get_fb_feeds(fb_api_client)
  option = {iam: 'fb'}
  response = fb_api_client.get_feeds(option)
  fb_feeds = response

  until response.empty?
    option[:max_id] = response.last.id
    response = fb_api_client.get_feeds(option)
    fb_feeds += response
  end

  fb_feeds.flatten
end

# twのtweetを全て取得する
def get_tw_tweets(tw_api_client)
  option = {iam: 'tw'}
  response = tw_api_client.get_tweets(option)
  tw_tweets = response

  until response.empty?
    option[:from_id] = response.last.id
    response = tw_api_client.get_tweets(option)
    tw_tweets += response
  end

  tw_tweets.flatten
end

After

def paginate(&block)
  response = yield(nil)
  sns_posts = response

  until response.empty?
    response = yield(response)
    sns_posts += response
  end

  sns_posts.flatten
end

# fbのfeedを全て取得する
def get_fb_feeds(fb_api_client)
  option = {iam: 'fb'}
  paginate do |response|
    option[:max_id] = response.last.id unless response.nil?
    fb_api_client.get_feeds(option)
  end
end

# twのtweetを全て取得する
def get_tw_tweets(tw_api_client)
  option = {iam: 'tw'}
  paginate do |response|
    option[:from_id] = response.last.id unless response.nil?
    tw_api_client.get_tweets(option)
  end
end

みんなのコメント

Nobody
fujimura
2015/11/29 23:49:56 投稿
-   option[:max_id] = response.last.id until response.nil?
+   option[:max_id] = response.last.id unless response.nil?

ですかね。

Nobody
teruki.shinohara
2015/12/01 23:04:28 投稿

ご指摘ありがとうございます! タイポしてたので修正しました…。