如何消除“else-if”语句

时间:2010-04-19 09:01:34

标签: c# .net asp.net

我的函数从某个网页获取QueryString作为string。 我需要把它包起来,检查一下,我必须使用什么策略。

现在我的代码看起来很丑陋(我想是这样):

public QueryStringParser(string QueryString)
        {
            if (string.IsNullOrEmpty(QueryString))
            {
                this._mode = Mode.First;
            }
            else if (QueryString.Contains(_FristFieldName) && !QueryString.Contains(_SecondFieldName))
            {
                this._mode = Mode.Second;
            }
            else if (!QueryString.Contains(_FristFieldName) && QueryString.Contains(_SecondFieldName))
            {
                this._mode = Mode.Third;
            }
            else
            {
                throw new ArgumentException("QueryString has wrong format");
            }
        }

一个QueryString中不能同时存在两个FieldNames。

如何将此代码更改为可读。

7 个答案:

答案 0 :(得分:6)

我至少会在检查现有字段时删除一些重复内容:

public QueryStringParser(string QueryString) {
    if (string.IsNullOrEmpty(QueryString))
        this._mode = Mode.First;
    else {
        bool has_1st = QueryString.Contains(_FristFieldName);
        bool has_2nd = QueryString.Contains(_SecondFieldName);
        if      ( has_1st && !has_2nd) this._mode = Mode.Second;
        else if (!has_1st &&  has_2nd) this._mode = Mode.Third;
        else
            throw new ArgumentException("QueryString has wrong format");
    }
}

答案 1 :(得分:3)

您可以将Mode的确定放入单独的方法并返回Mode值;这样你就可以消除if-else语句

public QueryStringParser(string QueryString)
{
    this._mode = DetermineMode(QueryString);
}

private Mode DetermineMode(string QueryString)
{
    // Input is NULL STRING
    if (string.IsNullOrEmpty(QueryString))
        return Mode.First;

    bool hasFirst = QueryString.Contains(_FristFieldName);
    bool hasSecond = !QueryString.Contains(_SecondFieldName);

    // Query using FirstName
    if (hasFirst && !hasSecond)
        return Mode.Second;

    //Query using SecondName
    if (!hasFirst && hasSecond)
        return Mode.Third;

    //Insufficient info to Query data
    throw new ArgumentException("QueryString has wrong format");
}

[编辑]删除了对字段名称存在的双重检查,改为使用变量。

答案 2 :(得分:2)

代码是可读的,您可以在常见条件下使用一些嵌套,以使部件更清晰。

您无法使用Switch,因为比较必须是静态值。

答案 3 :(得分:2)

评论和缩进


它已经很好看了。

public QueryStringParser(string QueryString)
        {
            // Input is NULL STRING
            if (string.IsNullOrEmpty(QueryString))
            {
                this._mode = Mode.First;
            }

            // Query using FirstName
            else if (QueryString.Contains(_FristFieldName) &&
                    !QueryString.Contains(_SecondFieldName))
            {
                this._mode = Mode.Second;
            }

            //Query using SecondName
            else if (!QueryString.Contains(_FristFieldName) &&
                      QueryString.Contains(_SecondFieldName))
            {
                this._mode = Mode.Third;
            }

            //Insufficient info to Query data
            else
            {
                throw new ArgumentException("QueryString has wrong format");
            }
        }

我希望她现在看起来很漂亮......

古德纳克!!

答案 4 :(得分:1)

代码可读。您可以通过删除括号来缩短它,因为语句只有一行:

public QueryStringParser(string QueryString)
        {
            //check if string is empty
            if (string.IsNullOrEmpty(QueryString))
                this._mode = Mode.First;
            else
            {
               bool hasFirst = QueryString.Contains(_FristFieldName);
               bool hasSecond= QueryString.Contains(_SecondFieldName);

               //check if string contains first field name but not second field name
               if (hasFirst  && !hasSecond)
                   this._mode = Mode.Second;
               //check if string contains second field name but not first field name
               else if (!hasFirst && hasSecond)
                   this._mode = Mode.Third;
               //default - error
               else
                   throw new ArgumentException("QueryString has wrong format");
            }
        }

此外 - 删除了对Contains方法的重复调用

我不建议使用任何速记操作符,因为这会使代码的可读性低得多。

最后 - 在线评论!

答案 5 :(得分:1)

使用像ReSharper或Refactor Pro这样的东西!帮助整理代码并鼓励良好实践。

答案 6 :(得分:0)

使用Switch case。