我希望我的客戶(客戶端在「服務消費者」,如REST)獲取有關什麼的狀態信息業務層做了或沒有做。只是返回一個空對象或者只是空值並不完全是描述性的。任何事情都可能發生。代碼設計:業務邏輯和表示層分離與狀態信息
該死的 - 我做了這樣一個很好的UML序列圖來說明問題,但StackOverflow上不會讓我郵寄由於口碑點不足:'(
這個問題可能是世界上最古老。但是我沒有找到一個令人滿意的答案。 我可以解決這裏描述的解決方案How Do You Communicate Service Layer Messages/Errors to Higher Layers Using MVP?,但它並沒有讓我跳過循環。在整個地方拋出異常聽起來不是一件好事。例外是昂貴的。我也需要創造一個例外,相當多的「這可能發生」的場景。
*** *所以問題是......你設計「通用返回值」還是拋出異常?****
不幸的是我到目前爲止還沒有找到答案......這就是你開始玩的地方:)
我會繼續,並在其中放置一個狀態碼,一條消息和實際請求的類型T的信息。 我們假設這個通用返回值是「ServiceResult」。
考慮我提出:
- 好了,所以我的業務層方法都返回ServiceResult對象。好。
- 這非常容易處理 - 只要您調用的公用方法發生所有業務層次魔法。那麼 - 它沒有。通常不是。
- 因此,您要麼必須使ServiceResult可以訪問所有私有方法,要麼將其作爲參數傳遞。你不想傳遞100次......相信我。
- 這就是當你決定添加一個ServiceResult屬性到你的「控制」業務類。但是請等待......您不要在c#中添加通用屬性。因爲它不是支持的功能。
- 接下來是什麼?使用「對象」作爲屬性呢?幾乎......你不想一直投射,你首先不知道要投什麼,因爲T可以是任何東西。而你私人的方法(從你最初調用的公共方法下來的3個級別)根本不知道類型 - 當然你也可以將它作爲你的類的一個屬性。它仍然是一個糟糕的設計我猜..
- 假設你解決了這個問題,你需要檢查ServiceResult.Status每次在下一個方法被調用之前,如果ServiceResult尚未處於「故障」狀態和進一步處理沒用。當然,你可以把所有的魔法在運行(Func鍵FUNC)方法,但如果你在這一點上......在最新的...你重新開始考慮使用異常:)
基本上就爲什麼我認爲人們只是拋出異常並在最高級別捕捉到它們(在您的業務邏輯中 - 而不是在控制器中)。
有沒有設計模式,我不知道這個問題?
這不僅僅是一個懶惰的程序員忘記檢查返回值,而是在整個地方使用返回值會使代碼難以閱讀和難以維護。這將大大增加維護代碼的成本。 – Steven 2013-02-19 16:17:42
+1好評。我會說這是兩個。應用程序很難維護(我認爲每個人都知道這一點是理所當然的,但無論如何我應該指出的),但無論如何總會存在處理返回值的地方。可能是開發者懶惰或根本不明白他必須處理它。 – jgauffin 2013-02-19 17:27:11
只有*我實際評估返回值的位置將在客戶端。作爲不提供錯誤信息的必要性,我不得不翻譯並使其適合於各種客戶。 如果客戶沒有看到返回值,這是他的錯。它只是爲了幫助API消費者提高代碼的彈性。如果有人選擇不使用返回值,那真的不是我關心的問題。問題是**如何在返回客戶端之前收集所有可能的代碼。 – lapsus 2013-02-19 18:29:33