2

我們有一個分層應用,或至少是在轉換到一個,過程細分如下:需要諮詢關於層狀溶液,關注點分離等

  • 接口(用戶界面或應用程序 - 接口,即web服務等)
  • 業務邏輯
  • 數據訪問

爲了使這個問題的其餘部分更具體,我將描述一個具體的實例。

我們有一個用戶界面,它有一個控制器對象(業務邏輯層)。該控制器通過另一個對象(數據訪問層)與數據庫通信。

在給定的上下文中,用戶界面允許用戶選擇一名員工以將正在執行的操作綁定到。由於有關於用戶(當然,控制器真的以外的任何世界),可以挑選員工的規則,該控制器提供了這樣兩兩件事:

  • 包含可用的員工名單一個可讀的屬性從
  • 選擇
  • 讀/寫包含當前選擇的員工

用戶界面可以閱讀列表,並使用它來填充組合框屬性。

在本申請的第1版中,組合框包含僱員的標識號+員工的姓名。

一切都很好...

...直到版本1.1,一個錯誤修正。用戶抱怨他不能在Jimmy OlsonJimmy Olson之間選擇,因爲該應用程序不能讓他很容易知道哪個是哪個。他知道銷售部門有一個Jimmy,開發部門有另一個Jimmy,所以這個1.1版本的解決方案是簡單地在組合框中加上斜槓+部門名稱。在版本2中,我們將選擇使用支持列的組合框替換組合框,刪除斜槓,但在1.1中,爲了最大限度地減少進一步錯誤的風險,選擇了這種方法。

換句話說,組合框將包含:

  • 1 - 吉米·奧爾森/銷售
  • 2 - 吉米·奧爾森/開發
    • 別人

但是,用戶界面代碼沒有SQL代碼或任何獲取方式對該部門的控制,因此我們必須去控制器並查看那裏的代碼。控制器不需要部門,老實說,它甚至不需要員工的姓名,識別號碼就足夠了,因此控制器中沒有任何要求或對部門做任何事情。所以我們必須下到數據訪問層並在那裏更改SQL。

這個解決方案很坦率地聞到。

如果有多個接口到該控制器,具有不同的要求,我們有三個可能的解決方案:

  1. 更改數據訪問層,以迎合(增加/多樣)的多個接口需求(2層客場),這意味着所有的接口將可能獲得他們所需要的數據,但他們也將獲得所有所需的任何其他接口的
  2. 添加的東西,讓用戶界面告訴數據訪問層的數據(仍在2層以外)它需要什麼
  3. 不知何故使用戶界面la你可以在不改變涉及的控制器或訪問層的情況下獲得所需的數據,這聽起來像我們需要更多的數據訪問代碼。

以上解決方案的感覺很好。

我想知道是,我們是完全偏離航向?你會如何做到這一點?在上述3以下是否有第四個和第五個解決方案?

每一個問題:Separation of Concerns,公認的答案包含了這句話:

關注分離是保持代碼爲每個這些問題分開。更改界面不應該要求更改業務邏輯代碼,反之亦然。

這是否僅僅意味着所有控制器/數據訪問層應該爲我們提供的是執行其工作所需的任何內容(即員工的識別號碼),然後用戶界面應該與數據庫並詢問有關這些特定員工的更多信息

回答

1

我看到它的方式,你有兩種可能性:

  1. 有較低層發送了所有 的信息,他們對一個 人,可能是一個XML文檔, 儘管許多的消費者 ,該信息並不需要這一切。
  2. 提供API,爲更高層次的 層向下鑽取並獲得他們所需要的信息 。所以,在你給 情況下,有 接口可以要求企業 層問數據庫層的 給定的用戶ID的部門法。

兩個有取捨。第一個提供了更多的信息,可能是那些沒有這些信息權利的消費者。第二個通過每個交易的信息少得多,但需要更多的交易。每當你有更多的信息時,第一個不需要改變API,但改變了XML。第二個保持現有API的界面相同,但隨需求變化提供新的API。等等。

+0

對,這些都對我感覺不錯。例如,如果我們只發送控制器需要的東西,就像你說的那樣,我們需要一種方式來說「好吧,我需要更多」,並且這必須儘可能地精益,而不是執行一個sql每個員工... – 2008-11-18 18:37:07