重构困境

时间:2010-01-12 02:45:17

标签: refactoring

我想从以下方法中提取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;
     }

见?现在我必须为提取的方法添加返回值,这有点难看吗?

是否有更好的解决方案可以避免为提取的方法添加返回值?

2 个答案:

答案 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逻辑和域逻辑的大耦合。你可能想重新考虑那里的脱钩。