我有n次类似的陈述
if trigger_data.tt_closed
unless trouble_ticket.changes.key?(:status)
@run = 0
break
end
unless trouble_ticket.changes[:status][1] == "Closed"
@run = 0
break
end
end
if trigger_data.tt_assignee
unless trouble_ticket.changes.key?(:assigned_to)
@run = 0
break
end
unless trouble_ticket.changes[:assigned_to][1] == trigger_data.tt_assignee
@run
break
end
end如何重构代码?可能是动态语句生成,并将一些散列传递到输入。我是元编程新手。请给我建议
发布于 2012-05-26 23:14:11
你在圈里吗?下面是一种可能的方法
def check(td, tt, trigger, key, ticket_changes)
if td.send(trigger)
unless tt.changes.key?(key)
@run = 0
return true
end
unless tt.changes[key][1] == ticket_changes
@run = 0
return true
end
end
return false
end
def metacheck(td, tt)
[[:tt_closed, :status, "Closed"],
[:tt_assignee, :assigned_to, td.tt_assignee]].each do |k|
return if check(td, tt, k[0], k[1], k[2])
end
end
metacheck(trigger_data, trouble_ticket)我用了一组三胞胎来检查条件。检查可以进一步简化为
def check(td, tt, trigger, key, ticket_changes)
return false unless td.send(trigger)
if !tt.changes.key?(key) or (tt.changes[key][1] != ticket_changes)
@run = 0
return true
end
return false
end我们可以把所有的条件结合起来。但我认为这最好地抓住了最初的内涵。
https://codereview.stackexchange.com/questions/12100
复制相似问题