WEB开发网      婵犻潧鍊婚弲顐︽偟椤栨稓闄勯柦妯侯槸閻庤霉濠婂骸浜剧紒杈ㄥ笚閹峰懘鎮╅崹顐ゆ殸婵炴垶鎸撮崑鎾趁归悩鐑橆棄闁搞劌瀛╃粋宥夘敃閿濆柊锕傛煙鐎涙ê鐏f繝濠冨灴閹啴宕熼鍡╀紘婵炲濮惧Λ鍕叏閳哄懎绀夋繛鎴濈-楠炪垽鎮归崶褍妲婚柛銊ュ缁傚秹鏁撻敓锟� ---闂佹寧娲╅幏锟�
开发学院软件开发C语言 lambda 提取block重构 阅读

lambda 提取block重构

 2010-09-30 22:44:01 来源:WEB开发网 闂侀潧妫撮幏锟�闂佸憡鍨电换鎰版儍椤掑倵鍋撳☉娆嶄沪缂傚稄鎷�婵犫拃鍛粶闁靛洤娲ㄩ埀顒佺⊕閵囩偟绱為敓锟�闂侀潧妫撮幏锟�  闂佺ǹ绻楀▍鏇㈠极閻愬搫绾ч柕濠忕細閼割亜顪冪€n剙浠ф繛鍫熷灥椤曘儵顢欓悡搴ば�
核心提示:如果要写一个根据多个条件(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

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