在我使用的每一种语言中,这都是困扰我的问题,我有一个if语句,但条件部分有太多的检查,我不得不将它分成多行,使用嵌套的if语句,或者只是接受它很丑陋,然后继续我的生活。
有没有你发现的其他方法,可能对我和其他遇到同样问题的人有用?
例如,所有内容都在一行上:
if (var1 = true && var2 = true && var2 = true && var3 = true && var4 = true && var5 = true && var6 = true)
{例如,多行:
if (var1 = true && var2 = true && var2 = true
&& var3 = true && var4 = true && var5 = true
&& var6 = true)
{示例-嵌套:
if (var1 = true && var2 = true && var2 = true && var3 = true)
{
if (var4 = true && var5 = true && var6 = true)
{发布于 2008-08-08 16:54:30
将条件分成几个布尔值,然后使用主布尔值作为条件。
bool isOpaque = object.Alpha == 1.0f;
bool isDrawable = object.CanDraw && object.Layer == currentLayer;
bool isHidden = hideList.Find(object);
bool isVisible = isOpaque && isDrawable && ! isHidden;
if(isVisible)
{
// ...
}更好的是:
public bool IsVisible {
get
{
bool isOpaque = object.Alpha == 1.0f;
bool isDrawable = object.CanDraw && object.Layer == currentLayer;
bool isHidden = hideList.Find(object);
return isOpaque && isDrawable && ! isHidden;
}
}
void Draw()
{
if(IsVisible)
{
// ...
}
}确保你给你的变量命名实际表明意图而不是功能。这将极大地帮助开发人员维护您的代码……可能是你!
发布于 2008-08-08 17:09:38
我很惊讶还没有人收到这封信。有一个专门针对这类问题的重构:
http://www.refactoring.com/catalog/decomposeConditional.html
发布于 2008-08-08 17:10:28
这里有两个问题需要解决:可读性和可理解性。
“可读性”解决方案是一个风格问题,因此是可以解释的。我的偏好是:
if (var1 == true && // Explanation of the check
var2 == true && // Explanation of the check
var3 == true && // Explanation of the check
var4 == true && // Explanation of the check
var5 == true && // Explanation of the check
var6 == true) // Explanation of the check
{ }或者这样:
if (var1 && // Explanation of the check
var2 && // Explanation of the check
var3 && // Explanation of the check
var4 && // Explanation of the check
var5 && // Explanation of the check
var6) // Explanation of the check
{ }也就是说,这种复杂的检查在扫描代码时很难在心理上进行解析(特别是如果您不是原始作者的话)。考虑创建一个helper方法来抽象一些复杂性:
/// <Summary>
/// Tests whether all the conditions are appropriately met
/// </Summary>
private bool AreAllConditionsMet (
bool var1,
bool var2,
bool var3,
bool var4,
bool var5,
bool var6)
{
return (
var1 && // Explanation of the check
var2 && // Explanation of the check
var3 && // Explanation of the check
var4 && // Explanation of the check
var5 && // Explanation of the check
var6); // Explanation of the check
}
private void SomeMethod()
{
// Do some stuff (including declare the required variables)
if (AreAllConditionsMet (var1, var2, var3, var4, var5, var6))
{
// Do something
}
}现在,当视觉上扫描"SomeMethod“方法时,测试逻辑的实际复杂性被隐藏了,但语义含义被保留下来,以便人们在更高的层次上理解。如果开发人员确实需要了解细节,可以检查AreAllConditionsMet方法。
我认为这被正式地称为“分解条件”重构模式。像Resharper或Refactor Pro这样的工具!可以让做这样的重构变得容易!
在所有情况下,拥有可读和可理解的代码的关键是使用真实的变量名称。虽然我理解这是一个人为的例子,但"var1“、"var2”等都是不能接受的变量名。它们应该有一个能够反映它们所表示的数据的基本性质的名称。
https://stackoverflow.com/questions/6126
复制相似问题