我最近觀看了空對象設計模式的this youtube tutorial。儘管它有一些錯誤:例如NullCar沒有做任何事情就會產生無限循環,但這個概念很好解釋。我的問題是,當可以爲null的對象具有getter並在代碼中使用時,你會做什麼?你怎麼知道默認返回哪個值?或者我應該在所有對象中實現這種模式?如果我需要返回字符串或原語呢?我從Java的角度談論。空對象設計模式問題
編輯:我不會交易空對象測試默認值測試嗎?如果不是,爲什麼不呢?
我最近觀看了空對象設計模式的this youtube tutorial。儘管它有一些錯誤:例如NullCar沒有做任何事情就會產生無限循環,但這個概念很好解釋。我的問題是,當可以爲null的對象具有getter並在代碼中使用時,你會做什麼?你怎麼知道默認返回哪個值?或者我應該在所有對象中實現這種模式?如果我需要返回字符串或原語呢?我從Java的角度談論。空對象設計模式問題
編輯:我不會交易空對象測試默認值測試嗎?如果不是,爲什麼不呢?
據我瞭解,它的想法是空對象的值儘可能接近「無」。不幸的是,你必須自己定義它。作爲一個例子,我個人使用「」,當我不能通過一個空字符串,空對象編號對我來說是-1(主要是因爲默認情況下大多數數據庫序列從1開始,我們使用這些項目ID:很多,所以-1是死的贈品它是一個空對象),與列表/地圖/集它的Collections.EMPTY_SET
,EMPTY_MAP
或EMPTY_LIST
等等。如果我有自定義類,我必須從中創建一個空對象,然後從中刪除所有實際數據,然後查看我需要的內容,然後應用我剛剛提到的內容,直到它爲空。
所以你真的不知道默認返回哪個值,你只能自己決定。
Null對象的目標是避免在代碼中有空引用。 Null對象獲取器返回的值取決於您的域。零或空字符串通常是合適的。
如果我們調換空對象模式到現實生活中,你所要求的是類似問「多大沒人管?」。
也許你的設計可以改善,因爲你似乎沒有遵循tell, don't ask的原則。
編輯:Null Object design pattern通常用於當對象將行爲委託給另一個對象時(例如在策略或狀態設計模式中);正如Tom Hawtin - tackline所評論的那樣,對於返回值的對象使用Special Case Objects。
當可以爲null的對象有getter並在代碼中使用時,你會做什麼?你怎麼知道默認返回哪個值?
你怎麼知道要實現哪些類?這是一個設計問題,它取決於應用程序。
一般來說,NullObject模式的目的是在特殊情況下支持Replace Conditional with Polymorphism重構,其中條件是與編程語言的空值進行比較。
視頻中示例的正確實施需要將driveCar
方法委託給Car
類。 SlowCar
和FastCar
類將執行循環,大概是通過基類中的共享實現,並且NullCar
將立即返回。
在Java上下文中,NullCar.speed
屬性可能是未裝箱的int。所以將其設置爲null
不是一個選項。我可能會隱藏訪問器後面的屬性,並且NullCar.getSpeed
會引發異常。任何需要測試以避免此異常的客戶端代碼都會轉入汽車類。
委派直接依賴於速度值是可用的是面向對象設計的原則Tell Don't Ask通過philippe
提到的應用程序應該是什麼空設計模式的代碼的結合點的所有操作?我認爲DAO對象是這種設計模式的第一級客戶端,因爲它們在數據庫中查找實體並簡單地返回它。
這些對象的可空性檢查會污染服務層或命令層中實際訪問和使用它們的代碼。
請評論。
它應該返回您正在獲得的類的空對象。例如,如果您有一個類A
帶有返回類B
的對象的getter,則相應的NullA
的getter應返回NullB
。
我認爲這將是更準確的評論,空對象模式的上下文更好地滿足「告訴,不問」類型。對於值返回類型,您更有可能正在前往特殊情況對象。有可能。 – 2008-11-25 20:27:06