另一种写条件语句的方法

时间:2012-10-03 07:58:30

标签: c# asp.net .net

这里我有一个代码示例。

我想知道编写此代码的其他方法;特别是我想知道嵌套if的其他形式。

此外,我希望您对评论有何看法(最佳做法是什么,在专业环境中我的评论风格是否足够?)

如果这个问题超出了SO的范围,请告诉我,我会删除它,请不要投票我只是尝试学习编程; - )。

// Has User expressed his preference?
if (!repositoryDevice.HasDevicePreference(userDevice))   // If not ...
{
    // Save the preference
    repositoryPreference.Add(userDevice.UserId, candidateId);
    result = true;
}
else   // If yes ... 
{
    // If a User has express his preference more than 1 hour ago
    // allow the User to change his preference, otherwise not
    if (!HasUserRecentPreference(userDevice))
    {
        repositoryPreference.Add(userDevice.UserId, candidateId);
        result = true;
    }
}

5 个答案:

答案 0 :(得分:10)

您可以使用OR

将这两个条件合并为一个
if (!repositoryDevice.HasDevicePreference(userDevice) || !HasUserRecentPreference(userDevice))
{
    result = true;
    repositoryPreference.Add(userDevice.UserId, candidateId);
}
else
{
    // put your else clause here
}

答案 1 :(得分:4)

这是逻辑运算,假设:

X = repositoryDevice.HasDevicePreference(userDevice)
Y = HasUserRecentPreference(userDevice)

所以,代码行:

    repositoryPreference.Add(userDevice.UserId, candidateId);
    result = true;

将在以下情况下执行:

(NOT X) || (X && (NOT Y)) =  ((NOT X) || X) && (NOT X || NOT Y) 
                          = 1 && (NOT X || NOT Y)
                          = (NOT X || NOT Y)

所以最好的选择:

if (!repositoryDevice.HasDevicePreference(userDevice)
       ||  (!HasUserRecentPreference(userDevice)))
{
    // Save the preference
    repositoryPreference.Add(userDevice.UserId, candidateId);
    result = true;
}

答案 2 :(得分:3)

//If not//If yes是不必要的。你没有解释你暗中写的内容。

E.g。

int x = 5; //assign 5 to x

会很愚蠢,每个人都可以看到。我的小优化:

// Has User expressed his preference?
if (!repositoryDevice.HasDevicePreference(userDevice)) 
{
    // Save the preference
    repositoryPreference.Add(userDevice.UserId, candidateId);
    result = true;
}
// If a User has express his preference more than 1 hour ago
// allow the User to change his preference, otherwise not
else if (!HasUserRecentPreference(userDevice))
{
    repositoryPreference.Add(userDevice.UserId, candidateId);
    result = true;

}

答案 3 :(得分:2)

您正在描述行为。行为通常在类中最好地封装。

我发现一个对于消除不受欢迎的条件嵌套代码很有用的模式是template method pattern

在这里,您将逐步覆盖具有该行为特殊性的预定义行为。

但是,为了更清晰的代码,为什么不将规则作为方法的一部分呢?

repositoryPreference.TryAdd(userDevice, candidateId);

public void TryAdd(UserDevice userDevice, candidateId) {
 if (!repositoryDevice.HasDevicePreference(userDevice)) return;
 if (!HasUserRecentPreference(userDevice)) return;
 // do the add
}

答案 4 :(得分:1)

你可以把else和if放在同一行:

    result = true;

    // Has User expressed his preference or 
    // if a User has express his preference more than 1 hour ago
    // allow the User to change his preference
    if (!repositoryDevice.HasDevicePreference(userDevice) ||
        !HasUserRecentPreference(userDevice))
    {
        // Save the preference
        repositoryPreference.Add(userDevice.UserId, candidateId);
    }
    else
    {
        // result = false?
    }

也可以(正如其他人指出的那样)使用&& / ||运算符将这两个条件合并为一个代码块。假设两个块中的代码相同,那当然是首选解决方案:永远不要写两次相同的行。

否则,它看起来非常好! :)通常认为避免源代码复杂性是一个好主意。