2010-03-21 24 views
1

我不知道如何構建這個問題,但我很想知道你們對下列情況有何看法以及哪一種你更喜歡。明確的行爲與檢查與隱性行爲

我們正在使用winforms在客戶端 - 服務器應用程序中工作。而且我們有一個控件,在填充另一個字段時會自動計算一些字段。所以我們有一個字段貨幣,當用戶填充時會決定自動填充另一個字段,也許更多的字段。

當用戶填充貨幣字段時,將根據用戶引入的字符串從緩存中檢索貨幣對象。如果在緩存中未找到輸入幣種,緩存對象將返回空引用。當要求應用程序層根據貨幣計算其他字段時,在進一步向下的情況下,如果給定一個空貨幣,則返回一個空特定字段。這種方式默認的隱含行爲是清除所有字段。這是預期的行爲。爲了更清楚地說明,當用戶輸入「無法使用的貨幣」時,他會得到通知,當然,還會清除取決於輸入貨幣的字段。這是通過將特定的控制值設置爲空來完成的。

我將調用顯式實現將驗證Currency對象爲null,在這種情況下,將顯式清除依賴字段。

我認爲後者版本更清晰,不易出錯,更易於測試。但它意味着一種冗餘。 前一個版本不太清楚,它暗示了應用程序層中的某些行爲,這些行爲未在測試中表達出來。也許在低層測試中,但是當需要修改下層時,如果給定一個空貨幣應該返回其他東西,我不認爲沒有動機的測試就會成爲阻礙在上層引入一個bug。

你們認爲什麼?

回答

2

顯式優於隱式。 - Python中的禪,由蒂姆·彼得斯

據我瞭解整個事情,與你有一點冗餘可讀性明確的方式,但我總是喜歡這樣過一些模糊的,魔術行爲(東西就不是很明顯第一眼)。

0

我理解你的問題的方式是你在比較你是否應該依賴NullReferenceException或null對象來確定下一個動作。

這裏是我的想法:

    如果要依賴於例外,在你自己的應用程序異常把它包起來,如CurrencyNotFoundException
  1. 。呼叫者需要檢查該異常並相應地執行。這樣就可以清楚地發現引擎蓋下面發生了什麼。
  2. 如果您希望從緩存中找不到貨幣的情況頻繁發生,您可能希望遠離例外(它不是正常情況下的「EXCEPTION」)。您可能想要選擇空對象模式。使用該模式,您可以返回一個NullCurrency對象。調用者可能有匹配的顯示策略,其中一個是NullCurrencyDisplayStrategy。這樣,你永遠不必依靠空檢查。返回的對象是其業務域內的有效對象。

希望幫助

+0

我知道我的解釋很蹩腳。對不起。貨幣緩存現在返回一個空對象。基於null,應用程序層對於依賴字段再次返回null,重新應用於視圖將清除控件 – Silviu 2010-03-21 11:10:40

1

首先,迪努弗羅林是正確的,明確的,通常是優於隱(但一個尺寸不適合所有,所以也有例外)。

其次,我不確定是否正確理解了您的問題,但您可能需要查看Null-Object Pattern。這個想法是,即使沒有數據可用,你的後端應該總是返回一個有效的數據對象(在你的情況下是貨幣對象)。在這種情況下,返回一個特殊的空對象。該對象實現與普通數據對象相同的接口,但它可能包含字段的特殊值。它的設計應該是這樣的,你的應用程序不必區分有效的數據對象和空對象。

我不知道這是否適合您的需求,它可能不適用於您的情況,但您必須爲自己確定。

+0

您的答案,我認爲是我們應該傾向的理想情況...但我們的遺留代碼與此遠遠不同。我們正在努力將其朝着正確的方向發展。但有很多力量反擊,不考慮代碼... – Silviu 2010-03-21 11:14:10