【发布时间】:2021-12-28 17:58:57
【问题描述】:
应用程序具有具有重复模式的控制器操作方法。
本质上,在切换项目上添加或删除,计数器修改和切换状态改变。这些方法属于一个共同的关注点。
请注意,这些可能不一定是指同一类的对象
这是一种这样的方法:
def toggle_territory_criteria
if params[:criteria] == "none"
if params[:toggle].to_i == 0
@region_none_active = 0
@regional_total = params[:regional_total].to_i - params[:value].to_i
else
@region_none_active = 1
@regional_total = params[:regional_total].to_i + params[:value].to_i
end
else
if params[:toggle].to_i == 0
@active_regionminor_ids.delete(params[:criteria].to_i)
@regional_total = params[:regional_total].to_i - params[:value].to_i
else
@active_regionminor_ids = params[:regionminors] << params[:criteria].to_i
@regional_total = params[:regional_total].to_i + params[:value].to_i
end
end
end
这可以通过以下三种方法进行重构和完全抽象:
def toggle_state(attribute)
attribute = false
if params[:toggle].to_i == 0
attribute = true
end
end
def toggle_collection(id_collection, criteria_attribute)
id_collection << criteria_attribute
if params[:toggle].to_i == 0
id_collection.delete(criteria_attribute)
end
end
def toggle_sums(sum_value, original_sum, new_value)
sum_value = original_sum + new_value
if params[:toggle].to_i == 0
sum_value = original_sum - new_value
end
end
导致一个简洁的关注方法
def toggle_territory_criteria_too
if params[:criteria] == "none"
toggle_state(@region_none_active)
toggle_sums(@regional_total, params[:regional_total].to_i, params[:value].to_i)
else
toggle_collection(@active_regionminor_ids, params[:criteria].to_i)
toggle_sums(@regional_total, params[:regional_total].to_i, params[:value].to_i)
end
end
但是,在原始方法和视图中都无法访问结果变量(关注方法为此目的使用实例变量)。
执行此重构以服务于控制器操作的正确方法是什么?
【问题讨论】:
标签: ruby-on-rails