重构一个返回不同数据类型的函数

时间:2016-12-29 12:21:18

标签: php algorithm design-patterns solid-principles

我不确定最有效的方法是什么,但我相信最好有一个返回一种数据类型的函数,无论是布尔值还是字符串,但在某些情况下我可以看到有多难它将是实现这样一个严格的规则,例如,如果找到数据库记录,下面的代码将返回一个对象,否则它将返回false。

public function get()
{
   $record = $this->db->query('select id, first_name, last_name from users where id = :id', ['id' => 1]);

   if ($record) {
      return new User($record['id'], $record['first_name'], $record['last_name']);
   } else {
      return false;
   }
}

我的问题是在这种情况下推荐的最佳做法是什么?

1 个答案:

答案 0 :(得分:1)

取决于的背景和偏好。

对于标量类型和数组,您有一个默认值,如0,空字符串,空数组等。当默认值是常规结果时,您可以使用故意错误的内容。例如,当找不到子字符串时,JavaScript中的Qtcreator会返回-1。但在这种情况下,PHP的indexOf会返回false

对于对象,null(不是false通常用作缺席对象。在一些严格类型的语言(C#,Java)中,所有对象引用都是可空的:当方法可以返回一个对象时,它也可以返回null。但这种方法也可能导致很多问题。在某些情况下,可能会使用strpos()模式来避免使用

此外,PHP 7.1提供了Null Object

function foo(): ?int
{
    return null; // ok
}

最后,您可以在没有值时抛出异常。例如,在Python方法dict.get()中,当请求的密钥不在字典中时,会引发KeyError

如您所见,不同的语言和API使用不同的方式,没有共同的正确答案。

我个人对你的例子的建议是按行为分离方法:

// Get-method should always return a value
function getObject(): ObjectClass
{
    // ...obtain the $object;
    if (!$object) {
        throw new Exception();
    }
    return $object;
}

// Find-method can return value or NULL.
function findObject(): ?ObjectClass
{
    // ...obtain the $object
    return $object ?: null;
}