2010-03-22 222 views
4

在我的公司,一個系統被設計爲有3層。 Layer1負責業務邏輯處理。 Layer3是呼叫後端系統。 Layer2位於兩層之間,因此layer1不需要了解後端系統。爲了傳遞來自第3層的信息,第2層需要定義接口到第1層。方法返回類型

例如,層1要檢查是否從用戶PIN碼是正確的。它調用layer2的checkPin()方法,然後layer2調用相關的後端系統。 checkPin()結果可能是:correctPin,inCorrectPin和internalError。目前,我們定義了返回類型'int'。所以如果layer2返回0,這意味着correctPin;如果返回1,則表示inCorrectPin;如果返回9,則意味着internalError。

它的工作原理。不過,我對這種方法感到有些不安。有沒有更好的方法來做到這一點?例如定義一個枚舉CheckPinResult {CORRECT_PIN,INCORRECT_PIN,INTERNAL_ERROR},並返回CheckPinResult類型?

感謝, 薩拉

+3

在每個圖層上使用例外。如果一個圖層失敗,您會捕獲該異常。這樣,你就知道哪一層失敗了。這是一個建議,所以我沒有把它作爲答案。 –

+0

是的,我明白你的觀點。我們目前正在做的是在發生內部錯誤時記錄錯誤。如果出現異常,我們將其捕獲並記錄在layer1中。 Layer2和Layer3將其升級到更高層。 – sarahTheButterFly

+0

我認爲Elite所說的是從每一層創建一個自定義異常。這些是商業例外,這是我們所做的。當你將圖層用作API時,它也會有所幫助,外部開發人員將能夠處理這些錯誤。 –

回答

1

我喜歡枚舉方法。它是自我記錄並且易於擴展。您可以設置每個返回的值以匹配您已有的0,1,9慣例。

拋出異常肯定是站不住腳的做法,而是拋出異常可以是一個昂貴的事。我一直相信他們應該被用來表明真正的特殊情況。根據您的業務問題,使用不良引腳可能會或可能不會那麼特殊。如果你的程序允許針對「五個九」的可靠性,那麼我會說,一個例外將是一個好方法。

但如果失敗率更的1%左右,我會說,返回值可能會更好。您可能想要循環使用大量值,並簡單地將具有失敗引腳的部分#作爲大批量進行累加。這取決於你如何使用錯誤代碼。

+0

我們的建築師肯定會同意你的意見。他根本不喜歡Java異常機制。 – sarahTheButterFly

+0

可悲的是我無法說服我的同事使用枚舉。他們說這是過多的重新分解工作。 :( – sarahTheButterFly

+0

我們正在討論改變單一方法的簽名,對嗎?如果是這樣的話,對於像IntelliJ這樣的工具來說很容易。你調用這個方法多少次?我也不會接受很多「,沒有一些可以量化的證據來支持它 – duffymo

1

難道你得到的內部錯誤一個合理的常見的情況?如果沒有,我會讓checkPin返回一個布爾值,並在出現內部錯誤時拋出異常(但我可能會調用方法pinIsValid或類似的東西)。

如果(由於某種原因)是預期的結果,遇到了內部錯誤,那麼三態枚舉很可能進行得很順利,(我在我的當前項目類似的情況)。

1

枚舉肯定是在整數返回類型和一個完全有效的方法的改進。另一個選擇是有一個第2層簽名,如:

public boolean isPINValid() throws InternalErrorException(); 

因爲,我認爲,內部錯誤是例外,爲什麼不把它們當作這樣呢?

1

這是一個風格問題。你描述的方式是一種C風格來完成目標。 java風格如下:checkPin(pin)應該返回一個布爾值。真正的意思是指針是好的,假的意思是不好。如果發生錯誤,則拋出異常。例外是Java中處理錯誤的標準方法。例外是有用的,因爲它們可以有類型和錯誤消息來幫助調試。

我說你描述的機制是C風格,因爲在C中,處理錯誤的標準方法是返回一個映射到一個定義的整數,然後通過引用傳入你正在尋找的值(在這個情況下布爾)。所以,在C你會

int checkPin(int pin, bool &ans); //returns an error value. 

無論哪種方式,我強烈建議不要返回在返回布爾同一個地方的誤差值。這會造成混淆,因爲單個值(返回值)應該只代表一件事。錯誤狀態和問題的答案是兩個不同的東西,所以應該通過不同的渠道返回。

我希望有所幫助。

+0

哈哈..你明白了.C風格。我的同事定義了接口是從C背景開始的。說服來自C背景的人使用enum。 – sarahTheButterFly