首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >你如何处理巨大的if条件?

你如何处理巨大的if条件?
EN

Stack Overflow用户
提问于 2008-08-08 16:45:59
回答 20查看 5.2K关注 0票数 29

在我使用的每一种语言中,这都是困扰我的问题,我有一个if语句,但条件部分有太多的检查,我不得不将它分成多行,使用嵌套的if语句,或者只是接受它很丑陋,然后继续我的生活。

有没有你发现的其他方法,可能对我和其他遇到同样问题的人有用?

例如,所有内容都在一行上:

代码语言:javascript
复制
if (var1 = true && var2 = true && var2 = true && var3 = true && var4 = true && var5 = true && var6 = true)
{

例如,多行:

代码语言:javascript
复制
if (var1 = true && var2 = true && var2 = true
 && var3 = true && var4 = true && var5 = true
 && var6 = true)
{

示例-嵌套:

代码语言:javascript
复制
if (var1 = true && var2 = true && var2 = true && var3 = true)
{
     if (var4 = true && var5 = true && var6 = true)
     {
EN

回答 20

Stack Overflow用户

回答已采纳

发布于 2008-08-08 16:54:30

将条件分成几个布尔值,然后使用主布尔值作为条件。

代码语言:javascript
复制
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)
{
    // ...
}

更好的是:

代码语言:javascript
复制
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)
     {
         // ...
     }
}

确保你给你的变量命名实际表明意图而不是功能。这将极大地帮助开发人员维护您的代码……可能是你!

票数 61
EN

Stack Overflow用户

发布于 2008-08-08 17:09:38

我很惊讶还没有人收到这封信。有一个专门针对这类问题的重构:

http://www.refactoring.com/catalog/decomposeConditional.html

票数 12
EN

Stack Overflow用户

发布于 2008-08-08 17:10:28

这里有两个问题需要解决:可读性和可理解性。

“可读性”解决方案是一个风格问题,因此是可以解释的。我的偏好是:

代码语言:javascript
复制
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
    { }

或者这样:

代码语言:javascript
复制
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方法来抽象一些复杂性:

代码语言:javascript
复制
/// <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”等都是不能接受的变量名。它们应该有一个能够反映它们所表示的数据的基本性质的名称。

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6126

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档