1

这里我有一个代码示例。

我想知道编写此代码的其他方法;特别是我想知道嵌套的其他形式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;
    }
}
4

5 回答 5

10

您可以使用将这两个条件合二为一OR

if (!repositoryDevice.HasDevicePreference(userDevice) || !HasUserRecentPreference(userDevice))
{
    result = true;
    repositoryPreference.Add(userDevice.UserId, candidateId);
}
else
{
    // put your else clause here
}
于 2012-10-03T08:02:21.197 回答
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;
}
于 2012-10-03T08:05:35.077 回答
3

//If not//If yes是不必要的。你没有解释你隐含的写什么。

例如

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;

}
于 2012-10-03T08:03:33.513 回答
2

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

我发现一种对消除不受欢迎的条件嵌套代码很有用的模式是模板方法模式

在这里,您可以使用该行为的特殊性逐步覆盖预定义行为。

但是,对于更简洁的代码,为什么不将规则作为方法的一部分呢?

repositoryPreference.TryAdd(userDevice, candidateId);

public void TryAdd(UserDevice userDevice, candidateId) {
 if (!repositoryDevice.HasDevicePreference(userDevice)) return;
 if (!HasUserRecentPreference(userDevice)) return;
 // do the add
}
于 2012-10-03T08:22:38.100 回答
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?
    }

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

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

于 2012-10-03T08:02:10.357 回答