任何人都有这些嵌套If语句的DRYer解决方案?

时间:2014-04-10 21:13:44

标签: if-statement dry

此方法的目的是标记用户参加活动。您可以按如下方式阅读:如果今天有事件发生,如果用户存在,如果他的状态是订阅或确认,并且如果现有用户尚未签入,则将用户添加到事件的用户阵列。

有关更优雅解决方案的任何建议吗?

def mark_attendance(user)
  if current_event(current_merchant)
    if user
      if user.status == 'subscribed' || user.status == 'confirmed'
        if current_event(current_merchant).users.where(id: user.id) == []
          current_event(current_merchant).users << user
        end
      end
    end
  end

2 个答案:

答案 0 :(得分:0)

我可能会写这样的东西:

def mark_attendance(user)

  event = current_event(current_merchant)
  attending = ['subscribed', 'confirmed']

  event.users << user if (event && user) &&
      attending.include?(user.status) &&
      event.users.where(id: user.id).any?

end

没有多少短缺,但更清晰的IMO。

答案 1 :(得分:0)

我的方法是:

def mark_attendance(user)

  if !user
    return
  end

  current_merchant_event = current_event(current_merchant)

  if !current_merchant_event
    return
  end

  if (user.status != 'subscribed' && user.status != 'confirmed')
    return
  end

  if current_merchant_event.users.where(id: user.id) == []
        current_merchant_event.users << user

  end

但是,时间更长,执行效率更高,更容易确定进入“肉类”的必要条件。功能。

current_event只被调用一次,这也是louis所说的。

在原始代码中,无论用户如何,都会调用current_event函数,如果用户无效,则无需执行额外的代码执行。

相关问题