如果函数中的语句是最好的方法

zac*_*ary 9 coding-style conditional-statements

如果我有一个具有大量条件的功能,那么组织它的最佳方法是什么?

我担心的是其他人进入代码并了解正在发生的事情.即使示例很简单,也可以想象条件非常复杂.

举个例子:

public void function(string value, string value2)
{
    if (value == null)
        return;

    if (value2 == value)
        DoSomething();
}
Run Code Online (Sandbox Code Playgroud)

要么

public void function(string value, string value2)
{
    if (value != null)
    {
        if (value2 == value)
            DoSomething();
    }
}
Run Code Online (Sandbox Code Playgroud)

要么

public void function(string value, string value2)
{
    if (value != null && value2 == value)
        DoSomething();
}
Run Code Online (Sandbox Code Playgroud)

And*_*are 8

我更喜欢第一种选择 - 快速失败更清晰,更清晰,更易于阅读和理解.

我知道这不是失败,但这个概念仍然适用.我真的不喜欢嵌套if语句.


blu*_*blu 8

您可以查看防御性编程,以确保可以实现方法功能的合同.

public void function(string value, string value2)
{
    if (string.IsNullOrEmpty(value1)) throw new ArgumentNullException("value1", "value 1 was not set");
    if (string.IsNullOrEmpty(value2)) throw new ArgumentNullException("value2", "value 2 was not set");

    DoSomething();
}
Run Code Online (Sandbox Code Playgroud)


Osc*_*Ryz 8

组织条件并将它们放入方法中.

例如替换这个:

 if( a& & n || c  && ( ! d || e ) && f > 1 && ! e < xyz ) { 
      // good! planets are aligned.
      buyLotteryTicket();
 } else if( ..... oh my ... ) { 
 }
Run Code Online (Sandbox Code Playgroud)

进入:

if( arePlanetsAligned() ) { 
    buyLotteryTicket(); 
} else if( otherMethodHere() ) { 
   somethingElse();
}  
Run Code Online (Sandbox Code Playgroud)

这样,你使用什么样的风格(1,2或3)并不重要,因为if语句将清楚地描述被测试的条件.不需要额外的构造.

重点是使代码更清晰,自我记录.如果您使用的是OO编程语言,则可以使用对象来存储状态(变量),并避免创建需要5-10个参数的方法.

这些是类似的问题:

摆脱嵌套ifs的最佳方法

是否有替代这种超级代码

第二个链接显示了一个更加完整和复杂的方法,将可怕的每个维护者噩梦转变为自我记录的代码.

它显示了如何转换它:

public String myFunc(SomeClass input)
{
    Object output = null;

    if(input != null)
    {
        SomeClass2 obj2 = input.getSomeClass2();
        if(obj2 != null)
        {
            SomeClass3 obj3 = obj2.getSomeClass3();
            if(obj3 != null && !BAD_OBJECT.equals(obj3.getSomeProperty()))
            {
                SomeClass4 = obj3.getSomeClass4();
                if(obj4 != null)
                {
                    int myVal = obj4.getSomeValue();
                    if(BAD_VALUE != myVal)
                    {
                        String message = this.getMessage(myVal);
                        if(MIN_VALUE <= message.length() &&
                           message.length() <= MAX_VALUE)
                        {
                            //now actually do stuff!
                            message = result_of_stuff_actually_done;
                        }
                    }
                }
            }
        }
    }
    return output;
}
Run Code Online (Sandbox Code Playgroud)

进入这个:

if ( isValidInput() && 
    isRuleTwoReady() &&
    isRuleTreeDifferentOf( BAD_OBJECT ) &&
    isRuleFourDifferentOf( BAD_VALUE ) && 
    isMessageLengthInRenge( MIN_VALUE , MAX_VALUE ) ) { 
            message = resultOfStuffActuallyDone();
}
Run Code Online (Sandbox Code Playgroud)