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