4

我正在阅读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");
}
4

2 回答 2

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 
}

更新

如果您在函数中设置错误消息,这违反了单一职责原则- 函数/方法应该只有一项工作。就其$editor->getTextForLinking()而言,它总是会返回一个文本数组,而不是处理返回的错误。

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

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

于 2013-10-07T10:13:00.057 回答
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.

}
于 2013-10-07T10:01:49.763 回答