2012-07-04 24 views
3

這也許是一個更美觀的問題,但我覺得它真的很煩人,因爲我總是會遇到一些難看的代碼。可讀性總是很重要的,對吧?避免在訪問子元素時檢查爲零

我想檢查一個哈希值內是否存在一個值。所以我做的是這個。

already_exists_data[:data][:user_id] 

但是,可以讓我一個空指針異常,如果:數據是零和檢查:數據可能給我一個空指針,如果already_exists_data是零。所以我最終得到的是這樣的:

if already_exists_data && already_exists_data[:data] && already_exists_data[:data][:user_id] 
    # Do stuff 
end 

現在,這是一些討厭的代碼。也許我應該修改哈希來代替對象。但是我有時會碰到這個問題,並想知道你們是如何對付它的。

我目前使用Ruby編碼,但我遇到過多種其他語言的問題。

回答

2

如果我讓我的管家拿起維多利亞街34號餐桌上的巧克力盒,我就問他。我不想說:去找維多利亞街,如果你找到它,請找34號,如果你找到它...

我可以這樣做,因爲他捕捉到自己的錯誤:如果他沒有找到街道,他就會空手而歸。

所以你應該使用一個try與一個空的異常處理程序。在僞代碼:

嘗試{巧克力=街道( 「維多利亞」)(34)( 「食堂」)( 「表」)}

在語言(如ruby,一些土布syntactic sugar),其中塊是表達式,你可能會這樣寫:

如果嘗試{already_exists_data(數據)(USER_ID)}

做_stuff

語言本身也可以幫助:在perl$streets{Victoria}[34]{dining_room}{table}是不確定的,當如$streets是。當然,在你發現地址錯誤之前,你的管家可能會空手回家。try區塊解決方案 - 和您的if .. && .... - 也有同樣的缺點:只有在您不在乎維多利亞街的數字是否爲34時才使用它們。

1

對語言不可知的解決方案:不使用空值。永遠。在您的項目中實施此規則。如果你絕對要,wrap them into Either/Optional which adds explicitness。有些語言,如Scala中,有Optional概念已經內置

特定Java的解決方案:如果你必須使用空值,註釋方法參數,並與@Nullable@Nonnull返回值。如果從這樣的方法獲取值,那麼不錯的IDE(例如IntelliJ)能夠分析代碼並突出顯示可能的解除引用null

1

另一種可能性是用函數調用來包裝散列訪問,並在函數內執行「髒」工作。那麼你的代碼將是這樣的(僞代碼語法):

accessHash(already_exists_data, data, userid) 

:你可以看中,而基於傳遞給包裝函數的參數數量訪問嵌套的哈希值,所以它的工作原理多種情況。