2011-10-06 51 views
0

这里是我的代码简短的样本:DRY - 多行代码执行相同的更新功能

def update_records! 

    # Teams. 
    home_team_record = PoolRecord.for_recordable_and_user(event_home_team, user) 
    home_team_record.update_for!(self) 

    away_team_record = PoolRecord.for_recordable_and_user(event_away_team, user) 
    away_team_record.update_for!(self) 

    # Division(s). 
    home_team_div_record = PoolRecord.for_recordable_and_user(event_home_team_division, user) 
    home_team_div_record.update_for!(self) 

    # Create/update PoolRecord for away_team division if they're in a different division. 
    unless event_away_team_division == event_home_team_division 
    away_team_div_record = PoolRecord.for_recordable_and_user(event_away_team_division, user) 
    away_team_div_record.update_for!(self) 
    end 

    # User. 
    user_record = PoolRecord.for_recordable_and_user(user, user) 
    user_record.update_for!(self) 

end 

DRY'ing这段代码实际上是相当简单的,如果不是因为需要的条件检查away_team部门。我可以创建一个传入的第一个参数的字符串数组,并传送给对象#。但是,就像我说的,我需要在一种情况下检查一个条件。你会如何推荐DRY'ing?

回答

4

一个简单的助手将减少噪音:

def update_records! 
    update_one(event_home_team) 
    update_one(event_away_team) 
    update_one(event_home_team_division) 
    update_one(event_away_team_division) unless event_away_team_division == event_home_team_division 
    update_one(user) 
end 

private 

def update_one(team) 
    PoolRecord.for_recordable_and_user(team, user).update_for!(self) 
end 

如果因为某些原因,你想利用它的另一个步骤,你可以做这样的事情:

def update_records! 
    [ 
     [ event_home_team,   true ], 
     [ event_away_team,   true ], 
     [ event_home_team_division, true ] 
     [ event_away_team_division, event_away_team_division != event_home_team_division ], 
     [ user,      true ] 
    ].each do |team, do_it| 
     if(do_it) 
      PoolRecord.for_recordable_and_user(team, user).update_for!(self) 
     end 
    end 
end 

或者,根据在您的数据上,这可能工作:

def update_records! 
    [ 
     event_home_team, 
     event_away_team, 
     event_home_team_division, 
     event_away_team_division, 
     user 
    ].uniq.each do |team| 
     PoolRecord.for_recordable_and_user(team, user).update_for!(self) 
    end 
end 

这最后一个替换单个unless a == b条件在您的原始与一个简单的uniq过滤器。

我不知道你的数据的确切属性或你想要采取多远,所以我提供了一些想法。我认为最后一个最接近“说出你的意思”,但也许不是。

+0

非常优雅。谢谢您的帮助。 – keruilin