2008-09-23 70 views
2

我正在使用相當標準的Web /服務/數據訪問分層設計構建趣味/學習的小型網站。java web應用程序中的靜態圖層

爲了節省我不斷創建我的服務層/數據訪問層類的實例,我使它們中的方法都是靜態的。我不應該因爲它們使用局部變量等而導致併發性問題,也不會共享任何資源(目前情況很簡單)。

據我所見,唯一的權衡就是我沒有真正遵循一個真正的面向對象的方法,但是它又一次讓代碼更加乾淨。

是否有任何理由這不會是一種可行的方法?以後會出現什麼樣的問題?有一個「工廠」類能夠根據需要返回我的服務和數據層類的實例會更好嗎?

回答

3

缺點:

  • 您將無法編寫單元測試,你將無法寫模擬數據接入/業務邏輯對象要測試的。
  • 因爲不同的線程試圖同時訪問靜態代碼,所以會產生併發性問題 - 或者如果使用同步靜態方法,則最終將使用線程排隊等待使用靜態方法。
  • 您將無法使用實例變量,隨着代碼變得更加複雜,這將成爲一種限制。
  • 如果需要,將更難以替換業務或數據訪問層的元素。
  • 如果您打算以這種方式編寫您的應用程序,那麼最好使用專門用於這種方式的語言,如PHP。

你會被要麼最好去非靜態的業務/數據訪問層類:

  • 使用Singleton模式(創建每個類的一個實例和線程之間共享它們)。 ..
  • 或者在需要的時候在每個線程中創建類的實例。

請記住,連接到您的應用程序的每個用戶/會話都將在它自己的線程中運行 - 因此您的Web應用程序本質上是多線程的。

-1

我認爲你將有多個用戶的所有靜態方法的併發問題。 Web層將會發出併發用戶。你所有的靜態方法可以處理這個嗎?也許,但他們不會一直被鎖定在排隊單個文件的請求?我不確定,從未嘗試過你的想法。

4

你知道那些在遊樂園的遊樂設施,他們說「請隨時保持你的手和腳在遊樂場內」?事實證明,如果你不這樣做,那麼騎行會更有趣。唯一真正的折衷是你並沒有真正遵循一種真正的保持你的手和腳的方式。

問題是,你應該遵循「真正的面向對象的方法」,就像有一個理由讓你的手和腳保持在騎行中一樣 - 在你到處開始出血的過程中,這很有趣。

4

您描述的方式,這本身不是「錯誤」的方法,但我真的沒有看到你想要避免的問題。你不能在服務器啓動時創建這些業務對象的單個實例,並根據需要將它們傳遞給你的servlet嗎?

如果你準備把OO扔出窗口,你可能也想看看Singleton模式。

2

我真的沒有看到你的設計的優勢,並且有很多事情可能會出錯。你正在保存一行代碼,也許?這裏有一些缺點的方法:

  • 你不能輕易更換
  • 你無法定義的實例變量,以方便分手邏輯分成多個方法
  • 你的假設,你的業務邏輯的實現,多線程的問題不會出現幾乎可以肯定是錯誤的
  • 你不能輕易嘲笑他們進行測試

我真的沒有看到一行代碼的遺漏是BU你什麼都沒有。

這不是一個真正的「OO設計」問題,但更多的是合適的。你爲什麼以這樣的程序方式使用Java?毫無疑問,PHP會更適合這種設計(並且通過不必編譯和部署而實際節省您的時間)。

我只是讓你的業務層非靜態的;它會使維護,更改和演進應用程序變得更加容易。

0

您可能很難用這種類型的體系結構測試您的對象。例如,如果您有一層引用靜態數據訪問層的業務對象,則可能很難測試業務層,因爲您無法輕鬆使用模擬數據訪問對象。也就是說,在測試業務層時,您可能不希望在數據訪問層使用「真實」方法,因爲它們會對數據庫進行不必要的更改。如果您的數據訪問層不是靜態的,您可以爲業務層提供模擬數據訪問對象用於測試目的。