1. 変数を定義しない
# bad
def count_blogs(users)
result = {}
users.each do |user|
next unless user.active?
result[user.id] = uesr.blogs.size
end
result
end
14
Slide 15
Slide 15 text
1. 変数を定義しない
# good
def count_blogs(users)
{}.tap do |result|
users.each do |user|
next unless user.active?
result[user.id] = uesr.blogs.size
end
end
end
15
Slide 16
Slide 16 text
2. Array(Enumerable)のメソッドを駆使する
• if/unlessよりselect/reject
# good
def count_blogs(users)
# active_users = users.select { |user| user.active? } ͱಉ͡
active_users = users.select(&:active?)
{}.tap do |result|
active_users.each do |user|
result[user.id] = uesr.blogs.size
end
end
end
16
3. クラスを抽出する
# app/models/user/ranking.rb
class User
class Ranking
def initialize(user)
@user = user
end
end
def rank
score = calculate_score
# ུ
end
private
def calculate_score
# ུ
end
end
20
Slide 21
Slide 21 text
モジュールにするのは
# app/models/concerns/rankingable.rb
module Rankingable
def rank
# ུ
end
private
def calculate_score
# ུ
end
end
class User
include Rankingable
end
User.new.private_methods.include?(:calculate_score)
#=> true
21
Slide 22
Slide 22 text
ここから追記
発表に間に合ったのはここまでだった...
22
Slide 23
Slide 23 text
Class vs Module
• Classのprivateメソッドのスコープは狭い
• リファクタリングしやすい
• Moduleだと影響範囲の調査が少し面倒
• Moduleは少ないメソッドに依存させるべき
• Enumerableは each のみに依存してる
• Moduleを上手く使うのは難しい
23