我想从以下方法中提取guard语句
private void CreateProxy()
{
//extract the following guard statement.
Host selected = this.comboBox1.SelectedItem as Host;
if (selected == null)
{
return;
}
this.SearchProxy = ServiceProxy.ProxyFactory.CreateSearchProxy(GetSelectedIP().ToString());
this.StreamProxy = ServiceProxy.ProxyFactory.CreatePlayerProxy(GetSelectedIP().ToString());
}
//extracted guard method
public bool IsHostSelected()
{
Host selected = this.comboBox1.SelectedItem as Host;
if (selected == null)
{
return false;
}
return true;
}
见?现在我必须为提取的方法添加返回值,这有点难看吗?
是否有更好的解决方案可以避免为提取的方法添加返回值?
答案 0 :(得分:1)
任何更好的解决方案,以避免为提取的方法添加返回值?
是:
//extracted guard method
public bool IsHostSelected()
{
Host selected = this.comboBox1.SelectedItem as Host;
return selected != null;
}
答案 1 :(得分:1)
我没有看到什么大不了的。首先,我会将其重写为:
static bool SelectedItemIsHost(ComboBox box) {
return box.SelectedItem is Host;
}
请注意重命名,ComboBox
作为参数,以及正文更改。
现在,这使您的代码更清晰:
void CreateProxy() {
if(SelectedItemIsHost(this.comboBox1)) {
this.SearchProxy = ServiceProxy.ProxyFactory.CreateSearchProxy(GetSelectedIP().ToString());
this.StreamProxy = ServiceProxy.ProxyFactory.CreatePlayerProxy(GetSelectedIP().ToString());
}
}
所以现在它显示“如果所选项目是Host
然后做东西。”
现在,这超出了你的问题,但这看起来像UI逻辑和域逻辑的大耦合。你可能想重新考虑那里的脱钩。