方法可以返回错误或数组 - 执行不好?

时间:2013-10-07 09:51:27

标签: php design-patterns

我正在阅读Code Complete并且其中的声明警告不要使用具有双重目的的变量,例如:

1) If a variable is a number, it contains error code.
2) If a varibale is array, it contains data.

这正是我在我的程序中使用下面的代码段中的变量$text所做的事情:

$text = $editor->getTextForLinking($data_array['idText']);
if (Arr::is_array($text)) {
    ...
} else {
    Log::instance()->add(Log::Error, $text);
    $this->response->body("Text can't be retrieved");
}

我可以访问方法getTextForLinking(),因此可以更改它。如何改变以排除双重目的的不良情况?

我不想使用这样的例外:

$text = Array();
try {
    $text = $editor->getTextForLinking($data_array['idText']);
} catch(SomeException $e) {
    Log::instance()->add(Log::Error, $text);
    $this->response->body("Text can't be retrieved");
}

2 个答案:

答案 0 :(得分:1)

我认为很明显,如果getTextForLinking()返回的任何内容(不是数组)应该被视为错误(已记录) - 所以我并不完全相信您的示例可以保证这样的更改。

据说,无论你发送什么数据,保持函数的返回签名都是相同的数据type(数组)可能是一种改进。通过这种方式,它将保持一致(您不需要$text = Array();),并且您不必根据是否出现错误来制作特殊情况。

$results = $editor->getTextForLinking($data_array['idText']);
if (empty($results)) { 
  Log::instance()->add(Log::Error, $data_array['idText']);
} else {
  // Handle results array 
}

<强>更新

如果您在函数中设置了错误消息,则违反single responsibility principle - 函数/方法应该只有一个作业。就$editor->getTextForLinking()而言,它将始终返回一个文本数组,而不是处理错误的返回。

错误消息应取决于上下文(使用该方法的位置)。如果在某个时刻空数组无效句柄/设置错误(消息)在函数之外,如上所示。

这样做允许$editor忽略返回结果的有效性,并允许您在其他地方重用该函数,其中空数组被视为错误。

答案 1 :(得分:0)

不检查返回值,请检查功能参数。换句话说,修改您的getTextForLinking函数,其中您将在处理结果之前进行类型检查

伪代码示例:

function getTextForLinking($text) {

 if $text is array, 
   process it and return an array containing data

else 
  return an array without data , or empty array.

}