2013-08-22 23 views
3

在GWT MVP中,我的演示者通常有很多私有成員(使用GWT.create()創建的事件總線,rpc,消息包)...)。我們一直使用「ClientFactory」來生成單例視圖,所以每次我們需要時都不會重新創建它們。該工廠還可以提供rpc,事件總線和其他資源。使用靜態類而不是客戶端工廠或依賴注入與杜松子酒?

我可以讀GWT docthe main purpose of this factory is to gain access to object needed through your application. The second advantage of using a ClientFactory is that you can use it with GWT deferred binding to use different implementation classes based on user.agent or other properties.

我的問題是:如果我不和絕不會需要不同的實現,工廠與延遲綁定,我不能只用一個靜態類&方法檢索我的依賴項而不是客戶端工廠或杜松子酒? 我不能真正抓住杜松子酒這個解決方案的優勢,也不知道它是否會在某些(不明顯的)情況下讓我陷入麻煩。我通常會避免服務器端代碼中的靜態類,因爲它是多線程的,但是在客戶端單線程代碼中,我沒有看到問題會發生在哪裏。然而,似乎大多數人使用杜松子酒或其他解決方案...

回答

3

static的問題不是關於線程,而是關於全局狀態和單身。

其中一個主要原因在使用GWT MVP是可以測試你的演示,無需GWTTestCase,因爲他們不會在GWT.create()或JSNI直接依賴,這些都需要一個瀏覽器環境運行(請注意,GWT.create()正在變得可用於普通Java,並且某些項目(如gwt-mockito或gwt-test-utils使用字節碼操作來使其無論如何運行)。測試時

全球國家和單身進來的方式:但是,即使沒有MVP,那還是會成爲一個問題

  • 你的測試不是孤立的(它們依賴於全局狀態,所以兩個測試運行在同一時間共享相同的狀態,因此他們不在受控環境中運行
  • 由於被測系統直接使用單件而不是使用模仿/贗品/存根或其他測試雙打,取決於環境傳遞的一些物體(在測試和生產中有所不同)

請參閱http://misko.hevery.com/code-reviewers-guide/flaw-brittle-global-state-singletons/

+0

感謝您的幫助。我明白我們需要有可測試的演示者(這就是爲什麼我們必須編寫所有這些接口),並且具有全局**狀態**是不好的做法。但在我們的情況下,我只需要檢查我的視圖,rpc,消息,......的接口**上的方法是否及時調用。 **我不必關心他們的狀態或者他們的實例是否是單例,因爲我正在測試演示者而不是視圖,也沒有考慮rpc或消息包。難道我不能用PowerMock來嘲笑我的靜態工廠,並避免你正在談論的問題嗎? – otonglet

+0

也許我不太瞭解PowerMock。 AIUI,這或多或少與gwt-test-util相同;只是因爲你可以不意味着你應該......基本的想法是你的演示者依賴於某些東西,並且應該爲它提供這些東西(Demeter法則),無論環境需要哪個實現(Liskov替換原理)。 (雖然技術上雖然功能較弱,但您也可以將工廠放在單獨的JAR中並切換JAR進行測試;或者使用工廠中的布爾開關切換到「測試模式」;但工廠違反了Demeter的法則) –

+0

謝謝,我有點看到你的觀點。雖然我沒有得到德米特法律所要做的事情,因爲它是關於「只與一個人的親密朋友交談」,而且工廠(靜態與否)是任何主持人的「親密朋友」。靜態工廠也封裝了一個非靜態的工廠。至於Liskov,我會引用自己的話:'如果我不這樣做,永遠也不會需要不同的工廠實現'......我想讓一個主持人知道不會改變的東西不會影響這個規則。因此,我不需要切換JAR或(更糟糕的)使用布爾值(爲什麼建議它,如果我需要布爾參數化類,繼承會更好 – otonglet