2011-04-15 74 views
1

請注意,我是MVC的新手。MVC設計問題

我試圖讓我的代碼儘可能多地分離和測試。 我有一個文本框和按鈕的視圖。 我想在輸入新文字時啓用此按鈕並遵守特定條件。

理想情況下,我希望這個邏輯決定按鈕是否啓用或不在視圖之外,以便它可以進行單元測試。

我對MVC的理解如下: 在我看來,我有一個參考我的控制器。 在我的控制器中,我有一個對我的模型的參考。 在我的模型中,我有一個對我的視圖的引用。

你能告訴我,以下是一個好的設計。 我給模型buttonEnabled添加了一個布爾值。 事件的順序是這樣的: 文本輸入在文本框中,文本框中有一個監聽器。監聽器在Controller上調用textChanged方法,控制器檢查是否啓用按鈕,然後通過setButtonEnabled訪問器設置Model的buttonEnabled。 訪問器更改buttonEnabled的值,並在視圖上調用buttonEnabledChanged()(該方法公開該方法) 這個想法是該視圖是模型的特定觀察者,並且該模型是一個可理論上具有多個視圖的observable ,並且可以在它們全部上調用buttonEnabledChanged()。

請讓我知道您的想法。

+1

另請參見此[回覆](http://stackoverflow.com/questions/3072979)。 – trashgod 2011-04-15 13:32:19

+0

在你描述的上下文中,我寧願使用MVP(P,主持人,將包含啓用按鈕的邏輯)而不是MVC。 – jfpoilpret 2011-04-18 09:22:58

+0

在我看來,上面的答案是擊敗了分離的目的,儘管這是一個很好的解釋。但是這個例子與GUI緊密結合,以至於無法進行單元測試。 – Charbel 2011-04-18 09:32:10

回答

1

這是一個哲學的回答一個哲學問題:)

什麼你的建議可能是正確的。但真正的問題是如果buttonEnabled真的是你的模型的一個很好的候選人。這是一件純粹的鬼事,在那裏毫無意義。真正特定於界面的東西屬於視圖,而沒有其他地方。

現在可能有一個原因,該按鈕被禁用(如,條目無效)。然後你可以在模型中給它另一個名字(isValid)。從!isValid!buttonEnabled的翻譯將成爲控制器的一部分,甚至成爲視圖本身。

但我猜你的情況下,當沒有內容時阻止按鈕的唯一原因是使用戶發送空白表單的可能性較小。在這種情況下,我會完全查看查看(javascript,如果是網頁),只是爲了方便用戶。在模型中,如果空字符串到達​​那裏,就拋出一個異常(IllegalArgumentException似乎很可能)。

如果您要對模型進行單元測試,那麼測試它是否會投訴空字符串,然後檢查您的模型是否將buttonEnabled設置爲false會更有意義。如果你真的想測試gui的功能,有解決方案(網絡,硒想到)。

1

你的建議是過於複雜的,在我看來,從MVC的角度來看是錯誤的。

  • 控制器不應該檢查是否啓用按鈕,它是模型的任務。
  • 該模型不應該在視圖上調用任何方法。
  • 你有太具體的方法。這種僅僅更新諸如buttonEnabledChanged()之類的特定內容的願望將會使事情變得過於複雜,組件之間通過某些業務邏輯相互依賴。

您需要的是將此文本框的值綁定到模型值,可能通過控制器。所以,改變文本框的值會改變模型的價值。然後它應該在視圖上調用更新。該視圖知道,在模型中有一些屬性決定是否啓用按鈕。它不應該被稱爲isButtonEnabled(),因爲它不可視。它應該被稱爲isTextMatchingCriteria什麼的。根據該屬性的值,視圖決定是否啓用該按鈕。

這樣:

  • 控制器僅controlls。它是捕獲和委託,更新,但不決定任何業務邏輯。
  • 該模型是獨立於視圖。
  • 查看沒有任何可以單獨調用的特定方法。它唯一可以根據模型的當前狀態呈現正確的表示。它還指定了屏幕上模型的一個或另一個狀態 - 一個禁用的按鈕或錯誤消息。該模型不應該這樣做。
+0

我試圖讓我的頭繞過你上面寫的東西,我有幾個問題:「控制器不決定業務邏輯」,我認爲它確實,我應該在哪裏放置業務邏輯?在模型中?我認爲模型只包含數據。你還說過「模型不應該調用任何方法」,當模型改變時我們還能如何更新視圖?然後你說「它應該在視圖上調用更新」,我以爲你在談論模型,所以模型畢竟在視圖上調用更新方法,不是嗎? – Charbel 2011-04-18 08:27:48

+0

@Charbel從模型到視圖的「鏈接」通常是通過古老的觀察者模式(或相同的Swing監聽器)或通過數據綁定完成的。該模型爲觀察者(視圖)提供了註冊他們自己的必要方法。因此模型不需要「知道」視圖。 – jfpoilpret 2011-04-18 11:03:33