我知道这个问题很老,但它很有趣,据我说有很多话要说。
首先要说的是,在函数或方法中返回没有真正的标准。
它通常由你的团队决定遵循的规则来支配,但如果你是这个重构中唯一的人,你可以做你认为更好的事情。
在返回值的情况下,我猜重要的是
可读性。有时最好为更易读和可维护的代码降低一点性能。
我将尝试展示一些有利弊的例子。
方法 A
<?php
function getTariableType($var = null)
{
if (null === $var) {
return 0;
} elseif (is_string($var)) {
return 1;
} else {
return -1;
}
}
优点:
- 明确性。每个案例都会自我解释,即使没有任何评论。
- 结构。每个案例都有一个分支,每个案例都有明确的界限,很容易为新案例添加语句。
缺点:
- 可读性。所有这些
if..else
带括号的代码使代码难以阅读,我们真的必须注意每个部分才能理解。
- 不需要代码。最后一条
else
语句不是必需的,如果return -1
只是函数的最后一条语句,代码会更容易阅读,在 any 之外else
。
方法 B
<?php
function isTheVariableNull($var)
{
return (null === $var);
}
优点:
- 可读性。该代码易于阅读和理解,乍一看我们知道该函数正在检查变量是否为空。
- 简明。只有一个声明,在这种情况下,它很好而且很清楚。
缺点:
- 限制。这种符号仅限于非常小的功能。在更复杂的函数中使用这种表示法甚至三元运算符变得更难理解。
方法 C.1
<?php
function doingSomethingIfNotNullAndPositive($var)
{
if (null !== $var) {
if (0 < $var) {
//Doing something
} else {
return 0;
}
} else {
return -1;
}
}
优点:
- 明确性。每个案例都是明确的,我们可以在阅读时重构函数的逻辑。
缺点:
- 可读性。添加许多
if..else
语句时,代码的可读性确实较差。然后代码缩进很多次,看起来很脏。想象一下有六个嵌套的代码if
。
- 难以添加代码。因为逻辑看起来很复杂(即使不是),所以很难将代码或逻辑添加到函数中。
- 大量的逻辑。如果你有很多
if..else
嵌套,那可能是因为你应该创建第二个函数。例如,NetBeans IDE 建议您创建一个其他函数来处理所有嵌套块的逻辑。一个函数应该是原子的,它应该只做一件事。如果它做了太多的工作,有太多的逻辑,就很难维护和理解。创建其他功能可能是一个不错的选择。
方法 C.2
该方法旨在提供 C.1 表示法的替代方案。
<?php
function doingSomethingIfNotNullAndPositive($var)
{
if (null === $var) {
return -1;
} elseif (0 >= $var) {
return 0;
}
//Doing something
}
优点:
- 可读性。这个符号非常易读。很容易理解根据给定值我们会得到什么结果。
- 明确性。作为 C.1,这种方法在条件的每个分支中都是明确的。
缺点:
- 难以添加逻辑。如果函数变得有点复杂,添加逻辑会很困难,因为我们可能需要移动条件的所有分支。
方法 D
<?php
function kindOfStrlen($var)
{
$return = -1;
if (is_string($var)) {
$return = strlen($var);
}
return $return;
}
优点:
- 默认值。在这个结构中,我们可以看到从一开始就处理了默认值。我们的函数中有逻辑,但如果我们没有进入任何分支,我们仍然有一个值。
- 易于添加逻辑。如果我们需要添加一个分支
if
,这很容易并且不会改变函数的结构。
常数:
- 不是必需的变量。在这种情况下,
$return
变量不是必需的,我们将编写相同的函数而不使用它。解决方案是到
return -1
最后,并strlen($var)
在 if 中返回,并且它的可读性不会降低。
结论
我没有在这里列出所有可能的符号,只是其中的一些。我们可以想到的是,没有完美的方法,但在某些情况下,一种方法似乎比另一种方法更好。例如,is_null函数适用于方法 B。
使用一种方法或另一种方法真的取决于你,重要的是选择一个逻辑并在你的所有项目中保持它。