多重返回语句,可读性

9
可能重复:
函数是否应该只有一个返回语句? 我的老师扣了我写的一些Java代码的分数(我仍然得到了A,这只是我在Java课程中获得的第一个非100%的成绩),我不想就这个问题与老师争辩,但我想从实际的程序员那里得到一些建议。以下是有问题的代码片段:
private char byte2suit(byte val) {
    switch(val) {
        case 0: return 's';
        case 1: return 'c';
        case 2: return 'h';
        case 3: return 'd';
        }
    //fallback value
    return 'h';
    }

在我看来,这种方法比初始化返回值、在每个情况下赋值(并在每行后添加break;)然后返回该值要清晰得多。当然,在其他人看到的代码中,我的观点并不是万能的,因此我想知道你们对于Java(或C/C++)中的多个返回语句有何看法,如果你使用多个返回语句,你是否会使用比“if (this) return a; else return b;”更多的语句?如果你不使用多个返回语句,能否给出一个真正令人信服的理由(如果上述代码可读且是我多次使用多个返回语句的最大程度,则不可读的代码不是一个理由)


9
我可能会像原文一样写,只有一个小改动:我会在fallback的地方使用default:。我不认为为了追求Single Return而牺牲可读性是值得的。 - R. Martinho Fernandes
更好的设计是使用一个 enum Suit - Peter Lawrey
我在工作中看到的典型代码标准规定,如果可读性得到提高,则可以使用多个返回。鉴于该函数的简单性,只要将回退更改为默认值,我认为这是可以接受的。因为现在它的写法可能会在 switch 之后但 return 之前有其他代码;在这种情况下,我希望只看到一个返回。 - Mike
你的老师可能是20世纪60年代的难民,当时Wirth和Djkstra颁布了一项规定:一个方法应该只有一个入口和一个出口,这是结构化编程运动的一部分,杀死了GOTO语句。告诉他,除了javap之外,大多数编译器都会将那种代码转换为规范形式,因此它在逻辑上等效。在实际情况下,在“现实世界”中,经常使用多个返回语句。他没有理由因此扣分。 - user207421
@EJP 在发布这个问题后(并且看到它几乎是一个非常流行的问题的完全重复),我进行了一些研究,并看到在3种情况下,多个返回语句被强烈推荐,因为用“单个返回”方式需要更多的代码。如果我有一些经过研究/记录的“可引用”的工作来证明这一点,我可以试图说服我的老师,否则我会得到“互联网并不总是正确”的回答。 - Seth
1个回答

14

一些学者认为函数应该只有一个返回语句,他们认为多个返回语句会以某种方式使代码不纯。

然而,大多数语言设计师和专业程序员不同意这种纯主义观点。如果您的方法又长又复杂,多个返回语句可能会让人感到困惑(但如果是这种情况,那么您有比多个返回语句更大的问题)。但是,通常多个返回语句可以使代码更易读。

您的代码很好,除了一个我会做出的更改:使用default

switch(val) {
    case 0: return 's';
    case 1: return 'c';
    case 2: return 'h';
    case 3: return 'd';
    default: return 'h';
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接