我們有一個分層應用,或至少是在轉換到一個,過程細分如下:需要諮詢關於層狀溶液,關注點分離等
- 接口(用戶界面或應用程序 - 接口,即web服務等)
- 業務邏輯
- 數據訪問
爲了使這個問題的其餘部分更具體,我將描述一個具體的實例。
我們有一個用戶界面,它有一個控制器對象(業務邏輯層)。該控制器通過另一個對象(數據訪問層)與數據庫通信。
在給定的上下文中,用戶界面允許用戶選擇一名員工以將正在執行的操作綁定到。由於有關於用戶(當然,控制器真的以外的任何世界),可以挑選員工的規則,該控制器提供了這樣兩兩件事:
- 包含可用的員工名單一個可讀的屬性從 選擇
- 讀/寫包含當前選擇的員工
用戶界面可以閱讀列表,並使用它來填充組合框屬性。
在本申請的第1版中,組合框包含僱員的標識號+員工的姓名。
一切都很好...
...直到版本1.1,一個錯誤修正。用戶抱怨他不能在Jimmy Olson和Jimmy Olson之間選擇,因爲該應用程序不能讓他很容易知道哪個是哪個。他知道銷售部門有一個Jimmy,開發部門有另一個Jimmy,所以這個1.1版本的解決方案是簡單地在組合框中加上斜槓+部門名稱。在版本2中,我們將選擇使用支持列的組合框替換組合框,刪除斜槓,但在1.1中,爲了最大限度地減少進一步錯誤的風險,選擇了這種方法。
換句話說,組合框將包含:
- 1 - 吉米·奧爾森/銷售
- 2 - 吉米·奧爾森/開發
-
- 別人
但是,用戶界面代碼沒有SQL代碼或任何獲取方式對該部門的控制,因此我們必須去控制器並查看那裏的代碼。控制器不需要部門,老實說,它甚至不需要員工的姓名,識別號碼就足夠了,因此控制器中沒有任何要求或對部門做任何事情。所以我們必須下到數據訪問層並在那裏更改SQL。
這個解決方案很坦率地聞到。
如果有多個接口到該控制器,具有不同的要求,我們有三個可能的解決方案:
- 更改數據訪問層,以迎合(增加/多樣)的多個接口需求(2層客場),這意味着所有的接口將可能獲得他們所需要的數據,但他們也將獲得所有所需的任何其他接口的
- 添加的東西,讓用戶界面告訴數據訪問層的數據(仍在2層以外)它需要什麼
- 不知何故使用戶界面la你可以在不改變涉及的控制器或訪問層的情況下獲得所需的數據,這聽起來像我們需要更多的數據訪問代碼。
以上解決方案的感覺很好。
我想知道是,我們是完全偏離航向?你會如何做到這一點?在上述3以下是否有第四個和第五個解決方案?
每一個問題:Separation of Concerns,公認的答案包含了這句話:
關注分離是保持代碼爲每個這些問題分開。更改界面不應該要求更改業務邏輯代碼,反之亦然。
這是否僅僅意味着所有控制器/數據訪問層應該爲我們提供的是執行其工作所需的任何內容(即員工的識別號碼),然後用戶界面應該與數據庫並詢問有關這些特定員工的更多信息?
對,這些都對我感覺不錯。例如,如果我們只發送控制器需要的東西,就像你說的那樣,我們需要一種方式來說「好吧,我需要更多」,並且這必須儘可能地精益,而不是執行一個sql每個員工... – 2008-11-18 18:37:07