一个函数应该只有一个return语句吗?

输入框
• 阅读 171

该问题及其答案被锁定,因为该问题是题外话,但具有历史意义。 它目前不接受新的答案或互动。 了解更多 。
是否有充分的理由说明为什么在函数中仅包含一个return语句是一种更好的做法?

还是在逻辑上正确地从函数中返回就可以,这意味着函数中可能有很多return语句?

这可能是一个不同寻常的观点,但是我认为,任何认为支持多个return语句的人都不必在仅支持4个硬件断点的微处理器上使用调试器。 ;-)

尽管“箭头代码”问题是完全正确的,但是在使用多个return语句时似乎已经消失的一个问题是使用调试器的情况。 您没有方便的万能位置放置断点以确保您将看到出口以及返回条件。

我强迫自己只使用一个return语句,因为它在某种意义上会产生代码气味。 让我解释:

function isCorrect($param1, $param2, $param3) { $toret = false; if ($param1 != $param2) { if ($param1 == ($param3 \* 2)) { if ($param2 == ($param3 / 3)) { $toret = true; } else { $error = 'Error 3'; } } else { $error = 'Error 2'; } } else { $error = 'Error 1'; } return $toret; }

(条件是精明的...)

条件越多,功能越大,则读取起来就越困难。 因此,如果您习惯了代码的味道,您就会意识到它,并希望重构代码。 两种可能的解决方案是:

  • 多次退货
  • 重构为单独的功能

多次退货

function isCorrect($param1, $param2, $param3) { if ($param1 == $param2) { $error = 'Error 1'; return  false; } if ($param1 != ($param3 \* 2)) { $error = 'Error 2'; return  false; } if ($param2 != ($param3 / 3)) { $error = 'Error 3'; return  false; } return  true; }

分开的功能

function isEqual($param1, $param2) { return $param1 == $param2; } function isDouble($param1, $param2) { return $param1 == ($param2 \* 2); } function isThird($param1, $param2) { return $param1 == ($param2 / 3); } function isCorrect($param1, $param2, $param3) { return !isEqual($param1, $param2) && isDouble($param1, $param3) && isThird($param2, $param3); }

当然,它更长并且有点混乱,但是在以这种方式重构函数的过程中,我们已经

  • 创建了许多可重用的功能,
  • 使该功能更易于阅读,并且
  • 函数的重点在于为什么值正确。
    • *

我相信多次返回通常是好的(在我用C#编写的代码中)。 单返回样式是C的保留。但是您可能没有使用C进行编码。

在所有编程语言中,没有法律只要求一个方法的一个退出点。 有些人坚持这种风格的优越性,有时他们将其提升为“规则”或“法律”,但这种信念没有任何证据或研究的支持。

不止一种返回样式在C代码中可能是一个坏习惯,在C代码中必须显式地取消分配资源,但是Java,C#,Python或JavaScript之类的语言具有自动垃圾回收和try..finally块等try..finally(并usingC#中的代码块),并且该参数不适用-在这些语言中,需要集中手动分配资源非常罕见。

在某些情况下,单项退货更具可读性,而在某些情况下则不然。 看看它是否减少了代码行数,使逻辑更清晰或减少了花括号,缩进或临时变量的数量。

因此,请使用尽可能多的适合您的艺术敏感性的退货,因为这是一种布局和可读性问题,而不是技术性问题。

点赞
收藏
评论区
推荐文章
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
科工人 科工人
4年前
Go语言学习——彻底弄懂return和defer的微妙关系
疑问前面在函数篇里介绍了Go语言的函数是支持多返回值的。只要在函数体内,对返回值赋值,最后加上return就可以返回所有的返回值。最近在写代码的时候经常遇到在return后,还要在defer里面做一些收尾工作,比如事务的提交或回滚。所以想弄清楚这个return和defer到底是什么关系,它们谁先谁后,对于最后返回值又有什么影响呢?动手验证了解
Stella981 Stella981
3年前
Shell函数返回值
Shell函数返回值shell函数返回值一般有3种方式:1.return语句shell函数的返回值可以和其他语言的返回值一样,通过return语句返回。比如:!/bin/bashfunctionmytest(){echo"mytestfunction"echo
Wesley13 Wesley13
3年前
Java 项目中如何使用异常
1.早抛出,晚捕获.2.如果finally语句中有return语句,则finally中的return语句将会覆盖try中的return语句,如以下代码,将会输出1。如果在finally语句里有抛出异常,那么此异常将会覆盖try块中抛出的异常。publicclassFinallyReturnTest{
Stella981 Stella981
3年前
JS 对象数组Array 根据对象object key的值排序sort,很风骚哦
有个js对象数组varary\{id:1,name:"b"},{id:2,name:"b"}\需求是根据name或者id的值来排序,这里有个风骚的函数函数定义:function keysrt(key,desc) {  return function(a,b){    return desc ? ~~(ak
Stella981 Stella981
3年前
Rust学习笔记#5:函数和trait
!(https://oscimg.oschina.net/oscnet/upa66844f752a62c6aef302dc51202b43db3f.JPEG)函数基本语法Rust的函数使用fn关键字开头,函数可以有一系列的输入参数,还有一个返回类型。函数返回可以使用return语句,可以使用表达式。下面是一个标准函
Stella981 Stella981
3年前
Return出现在try、catch、finally中的不同执行结果
前几天,去一家公司面试,碰到一道面试题大致内容为:如果在try中存在return语句,那么finally中的语句是否会执行,如果会执行,那先后顺序又是怎样。当时自己的解题思路是:坚信大学时候,java编程基础的一句话,finally中的语句一定会执行,所以我觉得finally中的语句一定会执行,而return语句会跳出当前方法,所以return语句应该在
可莉 可莉
3年前
04. react 初次见面
    组件从概念上看就像是函数,它可以接收任意的输入值(称之为“props”),并返回一个需要在页面上展示的React元素。1、组件定义的两种方式1.1函数定义组件  定义一个组件最简单的方式是使用JavaScript函数:functionWelcome(props){return<
Wesley13 Wesley13
3年前
PHP中的NOW()函数
是否有一个PHP函数以与MySQL函数NOW()相同的格式返回日期和时间?我知道如何使用date()做到这一点,但是我问是否有一个仅用于此的函数。例如,返回:2009120100:00:001楼使用此功能:functiongetDatetimeNow(){
小万哥 小万哥
1年前
Go 语法
一个Go文件包含以下几个部分:包声明导入包函数语句和表达式看下面的代码,更好地理解它:例子Gopackagemainimport"fmt"funcmain()fmt.Println("HelloWorld!")例子解释第1行:在Go中,每个程序都是一个包的
小万哥 小万哥
1年前
Python 中多态性的示例和类的继承多态性
单词"多态"意味着"多种形式",在编程中,它指的是具有相同名称的方法/函数/操作符,可以在许多不同的对象或类上执行。函数多态性一个示例是Python中的len()函数,它可以用于不同的对象。字符串对于字符串,len()返回字符的数量:示例pythonx"H