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)
您可以查看防御性编程,以确保可以实现方法功能的合同.
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)
组织条件并将它们放入方法中.
例如替换这个:
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个参数的方法.
这些是类似的问题:
第二个链接显示了一个更加完整和复杂的方法,将可怕的每个维护者噩梦转变为自我记录的代码.
它显示了如何转换它:
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)
| 归档时间: |
|
| 查看次数: |
446 次 |
| 最近记录: |