2016-12-29 108 views
1

我不確定這樣做的最有效方法是什麼,但我認爲最好有一個返回一個數據類型的函數,不管它是布爾型還是字符串,但是在某些情況下,我可以看到實現這樣一個嚴格的規則是多麼困難,例如,如果找到數據庫記錄,下面的代碼將返回一個對象,否則它將返回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,空字符串,空數組等。當默認值是常規結果時,可以使用故意錯誤的東西。例如,當找不到子字符串時,JavaScript中的indexOf返回-1。但在這種情況下,PHP的strpos()返回false

對於物體,null(不是false通常使用作爲它們的缺席。在一些嚴格類型的語言(C#,Java)中,所有的對象引用都是可空的:當方法可以返回一個對象時,它也可以返回一個null。但是這種方法也可能會導致很多問題。他們可以通過Null Object模式在某些情況下避免。

此外,PHP 7.1提供了一個nullable type notation

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; 
} 
相關問題