lambda 提取block重构
2010-09-30 22:44:01 来源:WEB开发网如果要写一个根据多个条件(type, group, category, code等)进行筛选的页面。
常见的做法是:在页面的最上面放几个ComboBox,对它们进行选择,进而生产页面内容。
具体实现,如下所示:
void cboTypes_SelectedIndexChanged(object sender, EventArgs e)
{
var value = cboTypes.SelectedValue;
if (value != null)
{
_presenter.TypeSelected(value);
}
}
void cboGroups_SelectedIndexChanged(object sender, EventArgs e)
{
var value = cboGroups.SelectedValue;
if (value != null)
{
_presenter.GroupSelected(value);
}
}
void cboCategories_SelectedIndexChanged(object sender, EventArgs e)
{
var value = cboCategories.SelectedValue;
if (value != null)
{
_presenter.CategorySelected(value);
}
}
void cboCodes_SelectedIndexChanged(object sender, EventArgs e)
{
var value = cboCodes.SelectedValue;
if (value != null)
{
_presenter.CodeSelected(value);
}
}
此时,你可能会发现,这4个事件处理方法遵循相同的pattern。
由于方法很小,也不复杂,代码虽有重复,但不严重!
从字面上看,重复的代码行只有:
if (value != null)
其他两行代码,虽有不同,但又有相同之处:
var value = cboXXX.SelectedValue;
_presenter.XXXSelected(value);
看似没有必要对之进行“Extract Method”重构,但也可以试试:
对付cboXXX:可以通过传入参数来搞定;
对付XXXSelected:也可以通过传入参数来搞定,只不过传入的是lambda表达式!
下面是重构后的代码:
private void ValueSelected(ComboBox comboBox, Action<value> presenterCall)
{
var value = comboBox.SelectedValue;
if (value != null)
{
presenterCall(value);
}
}
void cboTypes_SelectedIndexChanged(object sender, EventArgs e)
{
ValueSelected(cboTypes, v => _presenter.TypeSelected(v));
}
void cboGroups_SelectedIndexChanged(object sender, EventArgs e)
{
ValueSelected(cboGroups, v => _presenter.GroupSelected(v));
}
void cboCategories_SelectedIndexChanged(object sender, EventArgs e)
{
ValueSelected(cboCategories, v => _presenter.CategorySelected(v));
}
void cboCodes_SelectedIndexChanged(object sender, EventArgs e)
{
ValueSelected(cboCodes, v => _presenter.CodeSelected(v));
}
用lambda表达式,的确解决了代码重复的问题。
我个人认为,重构后的代码更清晰。
更多精彩
赞助商链接