2013-10-07 25 views
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"); 
} 
+1

可能聽起來很愚蠢,但爲什麼不是空陣列? –

+0

因爲我不知道在db中是否沒有這樣的文本,或者在方法執行過程中是否發生了一些錯誤。是否有意義? –

+1

是的,但應該轉移到方法本身。提供相同的返回類型有助於保持一致性,所以你總是知道你得到了一個數組(空或不是) - 如果沒有文本,或者有錯誤,這是函數在內部處理相應情況的職責。 –

回答

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是無視返回結果的有效性,並可以讓你在其他地方重用功能,其中一個空數組是認爲是錯誤的。

+0

通過該實現,我將如何知道在getTextForLinking()方法中發生了什麼錯誤?總是返回一個整數作爲結果(0 =成功,!= 0失敗),並通過引用一些數組變量的方法將文本放在一個好的選擇? –

+0

@Maximus我已經更新了我的答案以涵蓋您的查詢 – AlexP

+0

謝謝,請您澄清一下您在這裏指的是什麼功能 - 如果您在function_中設置錯誤消息,因爲我在getTextForLinking()方法之外記錄錯誤?
如果在執行getTextForLinking()方法期間發生異常 - 丟失與DB的連接 - 如果它仍然返回空數組? –

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. 

} 
+0

從這個問題看起來參數總是相同的(可能是一個數字),這是改變的返回類型。在你的例子中,你加倍的問題:你需要同時檢查參數和結果... –

+0

@DamienPirsy,我認爲我們不需要檢查結果,因爲它理解爲返回一個數組,但沒有數據...如果我們需要檢查它,並且if-else語句就足夠了。 – xiriusly

+0

我說過,因爲在編輯之前你寫了「返回一個數組或一個空值」,這意味着不同的返回類型。儘管如此,參數檢查是多餘的 - 看起來它總是一樣的 –

相關問題