2009-08-09 43 views
10

我(現在比以往任何時候)看到開發人員編寫大量層的如:保持一切鬆耦合和可擴展:太多的圖層,太小的投資回報率?

implementation PresentationLayer -> 
    interface IMyDTO -> 
     implementation MyDTO -> 
      interface IMyService -> 
       implementation MyService -> 
        interface IMyDomainRepository -> 
         implementation MyDomainRepository -> 
          interface IMyDomainObject -> 
           implementation MyDomainObject -> 
            interface IMyIndependentStorageLayer -> 
             implementation MyMSSQLStorageLayer 

通過C#的博客來看,這似乎是切片面包以來的最好的事情。基本上,一切都鬆散耦合。不要直接使用域對象。通過服務層運行所有內容。通過存儲庫訪問數據。所有圖層都完全獨立。

不要誤會我的意思,我喜歡這個主意,但是不是在時間上的權衡巨大,特別是在一個更大的項目上?維護的投資回報率是否真的足以證明這一點?

我讀到的解釋有些尷尬,比如「這樣我可以附加一個不同的數據庫,如果我需要的話」。真?我不認爲有人突然要求從MSSQL切換到Oracle是一個普遍的問題,現在你坐在那裏,希望你有一百萬個層次都不知道彼此。

在鬆散耦合的過程中有沒有趨勢,或者我只是在閱讀錯誤的博客?你如何看待這件事,並且你是否有過後來真的很高興的事情,即你一開始做了額外的工作?

回答

1

爲軟件設計正確的業務對齊概念非常困難。我的意思是可以接受的投資回報率。

但是,對我而言,軟件概念的層數或低耦合級別取決於軟件的使用環境!

如果您確定軟件需要做什麼,並且將來可能不會進行大的修改或添加,那麼具有大量圖層的超低層耦合應用程序並不是解決方案。因爲它使得架構過於複雜而沒有任何理由,並且爲架構投入的時間不是有利可圖的......
另一方面,如果您知道應用程序必須爲每個客戶定製,並且肯定會修改因此深入研究低時間耦合架構所花費的時間是個好主意......
當您想要將其他應用程序的部分代碼重新使用時,低級耦合可能非常聰明。在這種情況下,設計的時間花費當然是完全有利可圖的。總而言之,我要說的是,這一切都取決於未來軟件的發展以及其他應用程序的代碼重用潛力。
但這對我來說並不是系統性非常複雜的架構。

1

顯然,它可能是過度的,並且需要知道「在哪裏停止」添加圖層。

我的經驗法則是,如果一個圖層不需要包含任何重要的功能/代碼,我不需要它。這就是說,可測試性是一件重要的事情,所以如果一個圖層爲我提供了更好的可測試性,我會添加它。

1

沒有應用程序設計沒有價格。這裏的價格增加了複雜性。在選擇最適合您的需求之前,您總是必須查看您的選擇。

說到這裏,我認爲你的問題聽起來有點偏袒。在現實世界中,你可能不會經常看到一個客戶要求一種新的數據庫,但是你可能經常看到一個新的客戶想要與以前相同的數據訪問類型,但是在另一個數據庫上。它不僅關於易用性,還關乎代碼重用。

0

在評估這些事情時,我通常會發現通過DRY原理的鏡頭觀察它,並在項目中查看重複項很有幫助。

如果您使用的是比您的項目更復雜的體系結構,您會發現很多層除了包裝其他層並傳遞調用外,還會看到很多層。這是重複自己。

另一方面,如果您在複雜系統中使用瘦架構,您可能會發現在系統的一部分中創建功能不會讓您在另一部分中重複使用該功能,從而迫使您編寫大量非常類似的代碼到處都是。這是重複自己。

根據我的經驗,如果你在確定重複和不斷重構以清除重複方面保持警惕,結構將呈現給你。比如說,你剛開始時採用了一種相當基本的架構,但是一旦需要重用它們就可以將其分解出來,並且一旦需要被其他類重用,就將方法分解出來。然後,你最終可能會意識到,你寫的13個助手/經理/處理程序類刪除重複實際上看起來很像他們正在承擔的責任,如果它已經進入服務層,可以更清楚地定義。

知道什麼時候值得這件事可能比較棘手,但我認爲構建一個有很多圖層的系統成功的關鍵在於明確不同圖層應該承擔的責任。您添加的任何圖層必須對您有幫助,以降低上方圖層中操作的複雜性,並且可以更輕鬆地以優雅的方式組合功能。

+0

大部分時間你不知道,但後來什麼都證明是可重用的?爲此,你將不得不知道一年後你會在做什麼? – Alex 2009-08-09 17:40:54

+0

這是一個很好的觀點。當你決定使用特定的圖層結構時,儘管你會將新代碼放置在可以從頭開始重用的地方。一個服務可以被多個控制器使用,一個Reposiory方法可以被多個服務使用等等。 因此,即使您剛開始時可能很難做工和投機,也會有一些好處。 對我來說,使系統可測試通常是這些決定中的一個重要因素。我認爲,如果你可以刪除對實時數據庫和視圖渲染部分的依賴關係,其餘部分通常會很順利。 – 2009-08-09 19:49:32

0

以假設的示例項目。測試使用不同的進程內SQLite數據庫來提高速度,某些開發人員的計算機上的開發數據庫是PostgreSQL,臨時數據庫是單一的Oracle安裝,而生產數據庫是大規模可擴展的,非常昂貴且很難配置Oracle簇。

你會如何在不將SQL層與業務層分離的情況下將其解決?

0

這是一個最近的趨勢,而經驗不足的領導/建築師正在墮落成爲追趕潮流的獵物。

在該項目中我在,數據訪問去:

服務接口 - >服務實施 - >代表接口 - >代表執行 - > DAO接口 - > DAO實現 - > ibatis的XML。

在我們的例子中這是(而且是!)不好,因爲任何Delegate Implementation方法中的大多數代碼都是單行的;它只是叫做DAO。對於每個DAO,我們有兩個額外的類和一個額外的bean配置,而我們根本沒有獲得任何東西。

接受更改,重構,然後繼續。使用盡可能多的圖層來劃分不同的概念......然後停下來。如果在編寫一些代碼之前沒有明顯的收穫,但它會遵循一個模板,要麼放慢速度並嘗試完全理解模板爲什麼會這樣做,要麼接受該模板對於您的應用程序是錯誤的,並忽略該位。

0

我目前正在研究一個大型的SOA項目,每個圖層都是分離的,幾乎每個類都通過一些抽象工廠實例化。現在我們試圖將一些現有功能卸載到單獨託管的服務中,這是一個真正的噩夢,通過各層試圖推斷重要的位,因爲有一個無休止的右鍵單擊>轉到定義...追查最外層只有一行代碼!

解耦本身沒有什麼問題,當然,即使在我的項目中,從建築的角度來看,我也發現很多方面都很有用。只是不要被帶走......務實,在考察你正在考慮解耦的區域時權衡利弊。

乾杯