2012-12-17 49 views
0

使用構圖時,如果對象不是接口類型,應該明確拋出異常。使用構圖 - 如果錯誤類型應拋出異常

一個例子是:

$myObject = new MyConcreteTypeA(); 

現在,我的界面是MyInterface

那麼,我應該在使用前檢查$myObjec t的類型以確保它實現了MyInterface,並且如果沒有,會拋出一個錯誤?

if (! ($myObject instanceof MyInterface)) { 
    throw new Exception('Invalid type'); 
} 

或者這只是克魯夫特?

回答

1

所以,我應該檢查$myObject的類型,以確保它實現MyInterface使用前如果沒有拋出一個錯誤?或者這只是一個殘酷?

如果你已經用盡了方法來創建一個接口,並且期望對象也希望他們實現該接口,那麼是的,你絕對應該檢查和投訴。

將您的方法與duck typing進行對比。在批評部分,它討論了兩種不相關的方法之間的混淆。我要去適應他們的榜樣所以它與PHP的,而不是Python的*:

,你可以很容易地創建一個名爲手指類,它需要一個類實現press()方法採取在行動。然而,一個叫Trousers的類也可能實現press()方法。使用Duck Typing,爲了防止奇怪的,難以察覺的錯誤,開發人員需要知道方法press()的每種潛在用法,即使它在概念上與他或她正在進行的工作無關。

如果這是絕對關鍵的是你只曾經處理褲子當您嘗試press()他們,那麼你必須作出這樣的檢查。如果你的代碼不在乎什麼得到press()編,只要它確實得到press()編,那麼你可以放棄你的支票。

*原始示例使用屬性和方法。 Python中的屬性和方法共享相同的名稱空間。試圖將屬性用作方法更加糟糕,但不適用於PHP。

-1

PHP不僅是dynamically typed而且還有weakly typed。你通過檢查$myObject實現了一個給定的接口,它以某種方式補充了語言中​​缺少更加結構化的鍵入系統。如果你想這樣做,你可以,但有一些問題你可能要考慮:

  • 你正在做的檢查將在運行時執行,所以你沒有從動態類型轉換到靜態類型。換句話說,如果你的檢查失敗了,它在運行時仍然會失敗。
  • 如果您想要與該理念保持一致,您可能需要在整個代碼中添加這種檢查。然後你可以考慮搬到defensive programming style(注:我注意到這種風格的粉絲)。
  • 你可能還想考慮PHP type hinting
  • 通過做這樣的檢查,你會對PHP類型的哲學,這幾乎是duck typing

從我的角度來看它通過整個代碼採用均勻的工作模式,所以只是把一些零散的一些方法instanceofis_a是不是一個好的做法是很重要的。如果你覺得PHP的類型系統是不是對你有好處/安全的話,你可能要考慮:

  • 如果可以的話,切換到其類型系統讓你更舒適(如Java或C#),另一種語言。
  • 依靠其他工具,如結合PHPUnitValidators [*],讓您對代碼更有信心。

HTH

[*]聲明:我在Quanbit研究工作。

相關問題