这里我有一个代码示例。
我想知道编写此代码的其他方法;特别是我想知道嵌套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;
}
}
答案 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?
}
也可以(正如其他人指出的那样)使用&&
/ ||
运算符将这两个条件合并为一个代码块。假设两个块中的代码相同,那当然是首选解决方案:永远不要写两次相同的行。
否则,它看起来非常好! :)通常认为避免源代码复杂性是一个好主意。