我們要實做的是黑白棋(Othello),做為一個簡單的棋盤回合制遊戲,加上使用者需要透過介面來進行操作,因此適合做為MVP的使用範例。
基於篇幅,範例分成2篇來編寫,本篇Part3與下一篇Part4。
Part3描述如何利用MVP來實現棋盤邏輯。Part4接著講解如何加入玩法邏輯,以及MVP區塊如何與其它程式邏輯來溝通。
Presenter First
Presenter First,是在2006年Agile International Conference被正式提出來的概念。顧名思義,就是先寫Presenter的意思,由於先考慮了View與Model之間如何利用事件溝通,同時也設定了View與Model需要實現的事件與函式,我認為是不錯的起手式。
因此,我們先來想想Model和View之間需要什麼溝通吧:
1. 當使用者透過View點擊棋盤格子時,Model要先判斷是否合法,如果可以就下子
2. 當Model下子時,View要在同一個位置顯示下子
3. 當Model將某個棋子翻面時,View要翻面同一個位置的棋子
根據上述的使用者故事,我們先把單元測試寫出來:
所以為了通過測試,寫下了IOthelloModel、IOthelloView這2個介面,以及OthelloPresenter:
就目前的需求而言,我們已經把Presenter寫完了。我們可以看到,Presenter的程式碼非常簡單,其實就只是轉發事件而已。(雖然是因為黑白棋的例子所需要處理的事件相對簡單,實際開發上Presenter可能會需要多做一些事情)
Then Model
Presenter寫完之後,我們接下來要做的事情,就是去實現剛剛為了Presenter的正常運作而開出來的介面。
雖然Model和View的實作順序沒有差,不過我們來實現Model邏輯吧!
一樣先列出測試碼,再列出實現邏輯。
由於這時候我們還沒把玩法規則考量進去,目前只是棋盤處理邏輯,因此你會發現Model只是單純在空白處下子而已。
Finally View
最後來處理View,我們直接用MonoBehaviour來實現。這裡用粗暴一點的方式,製作一個8×8單位的棋盤,Awake的時候直接擺在世界座標(4, 4, 0)的位置,用OnMouseUpAsButton來觸發點擊事件。
總結
我們可以看到,在實作MVP架構時,透過Presenter First的概念,可以將Model和View的規格都先規定好,接下來只需要實作細節內容即可。Model與View也可以互不知道對方的存在,只透過事件與對方溝通。而只要正確的實作介面,View也可以自由的更換視覺邏輯。
這一篇只闡述了黑白棋的棋盤邏輯,我們也看到目前還沒有實作翻棋相關的功能。下一篇將會整合玩法邏輯。可以想成先製作系統邏輯,然後才製作玩法邏輯。
參考資料:
1. Atomic Object, Presenter First
https://atomicobject.com/resources/presenter-first