WEB开发网
开发学院软件开发C语言 lambda 提取block重构 阅读

lambda 提取block重构

 2010-09-30 22:44:01 来源:WEB开发网   
核心提示:如果要写一个根据多个条件(type, group, category, code等)进行筛选的页面,常见的做法是:在页面的最上面放几个ComboBox,lambda 提取block重构,对它们进行选择,进而生产页面内容,的确解决了代码重复的问题,我个人认为,具体实现,如下所示:voidcboTypes_Selected

如果要写一个根据多个条件(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表达式,的确解决了代码重复的问题。

我个人认为,重构后的代码更清晰。

Tags:lambda 提取 block

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接