2012-07-30 78 views
1

在一个函数的整个逻辑符合“如果这个条件是真/假,返回这个,否则返回这个”的线,什么是最好的或可能是最接受的形式呢?似乎有3种我见过的方式。如果其他分支,返回语句的位置?

int function(bool foo){ 
    if(foo){ 
     return doSomething(); 
    }else{ 
     return somethingElse; 
    } 
} 

这是很有道理的,但我曾经读到过这样一个返回类型的函数不应该返回类型位于一个分支。 (为什么,源从来不说),所以,再有就是这个:

int function(bool foo){ 
    if(foo){ 
     return doSomething(); 
    } 
    return somethingElse; 
} 

具有返回类型的分支之外的,但它带走了一些我认为代码的含义,而我也看到了if-else块有好处。 (那些是什么,该消息来源没有说任何)最后,还有这样的:

int function(bool foo){ 
    int result; 
    if(foo){ 
     result = doSomething(); 
    }else{ 
     result = somethingElse; 
    } 
    return result; 
} 

意思是存在的,返回的是一个分支之外的,但在另外一个变量和代码,这是不是真正需要的功能。

我的问题是这三种形式中的哪一种或者其他形式(如果有的话)会是在这种情况下编写函数的最佳方式?

+2

我更喜欢第二个,但我认为这根本不重要。然而,第三个对我来说似乎有点不合适,除非你是一个坚持每个函数一个return语句原则的人。 – chris 2012-07-30 01:47:45

+3

太主观。我个人会写:'返回foo? doSomething():somethingElse;'。 – GManNickG 2012-07-30 01:49:09

+1

好阅读[“唯一回报”的概念来自哪里?](http://programmers.stackexchange.com/questions/118703/where-did-the-notion-of-one-return-only-come -从)。 – 2012-07-30 02:06:16

回答

1

好问题。说明你正在考虑风格,可读性和为什么我们用不同的方式编写相同的代码的潜在原因。最终取决于你。

1号很好,非常清楚。

Number 2我通常在测试错误条件时使用。如果我一路走到最后,那么我会回归成功。奖金是你可以经常丢下大括号而不会失去清晰度。

当设置来自内部循环的结果时,其中可能有多种返回值,或者从其他呼叫传递返回值并且需要进行中间检查时,3号通常很有用。哦,这也是适当的,你必须做一些不依赖于你的返回值的共同清理。

在简单的情况下,你通常不会做数字3。你会希望有一个很好的理由将值存储在变量中。

你可能会说这里有第四个选项:查询冒号操作符。如果你认为简单的内联类成员是良好的作风有用=)

int function(bool foo) { return foo ? doSomething() : somethingElse; } 

我写在一行,当你看到它,因为这通常是。