[Unity] 什麼是 MVC?

新手在摸索寫程式的架構時,可能會在網路上搜尋到 MVC 這個關鍵字。但好像網路上的大家都沒有講得很清楚,而且好像大家講的有時候不太一樣,使用時覺得模模糊糊的。

在回答這個問題前,可能要先知道一件事:
沒錯!MVC 在現代就是模模糊糊的概念!

原始的 MVC

我自己最一開始認識 MVC,是在《深入淺出設計模式》這本書讀到的(如果你還沒讀過設計模式,下面的東西可能對你來說太難了,就先從這本適合新手的書開始吧)。MVC 要解決的是資料、顯示、邏輯這三者太過交織的問題,因此使用了 3 個設計模式來解決這個問題:策略模式、組合模式、觀察者模式。因此 MVC 其實是一個複合模式

MVC 的變形

這是最一開始的 MVC,我就叫做「古典 MVC」好了,一些設計模式的書會提到
https://developer.mozilla.org/en-US/docs/Glossary/MVC/model-view-controller-light-blue.png

這是 MVP
https://mekaso.rocks/wp-content/uploads/2017/10/mvp.png

這是 iOS 陣營的 MVC,他們宣稱這是「現代 MVC」。
欸,是不是跟 MVP 有 87% 像啊
https://miro.medium.com/max/700/1*la8KCs0AKSzVGShoLQo2oQ.png

這是 MVVM,微軟因為 WPF 提出來的
https://process.filestackapi.com/cache=expiry:max/hT9K64JiQmOIwfnLtcxp

這是 iOS 陣營的 MVVM,因為被 ViewController 綁架了所以掛在那邊
https://khanlou.com/images/MVVM.png

這是 iOS 陣營的 VIPER
有夠極端,實不實用我不好說,但切割法其實還蠻有道理的
https://miro.medium.com/max/3448/1*5-Z3_E2mcL_F48mGbtq3Zw.png

MVC 在現代

個人認為古典 MVC 已經不適合現代了

在顯示和操作已經常常是同一個元件的現代,用 View 和 Controller 的概念去拆解,已經不是很好的做法。而 Controller 常見的肥大(古典 MVC 有把資料邏輯實作在 Controller 的做法,但要注意實務上 MVC 並不是真的只有 3 個類別),使得 Controller 的拆解變成另一個問題。更不用說古典 MVC 讓 Model 直接操作 View 的概念,跟現代常常需要邏輯和視覺分開是不符的。

但因為是經典,所以課本還是得教。

MVx 只是概念

到頭來各種 MVx 都是概念,跟設計模式一樣是慢慢被大家接受的方法。設計模式其實也是概念,並沒有規定實作方式。只是設計模式影響的範疇比較小,常常照著做也能用。

MVx 的狀況是大家心中都有自己的 MVx,你的 MVx 跟我的 MVx 搞不好是不一樣的東西。2 組團隊都用 MVP,根據狀況拆解的方法和細節也有可能不同。

寫程式時,把功能寫出來當然是必要的,但更重要的是寫出來的東西好不好維護,好不好修改,好不好加新功能,然後不會製造出新 bug。

如果發現一些程式碼的壞味道,檢查 SOLID 原則,看看可以用什麼設計模式來改進。剛剛也說過設計模式並沒有制式的實作方法,因此使用設計模式時,不是強硬的套用上去,而是要思考如何使用才符合自己的需求。使用 MVx 模式也是一樣的。

因為寫遊戲常常會碰到需要讓邏輯和視覺解耦的狀況,所以使用 MVx 是合理的。但 MVx 畢竟算是設計模式,跟一般的設計模式一樣,使用前當然還是要思考,你的開發狀況到底適不適合使用。如果專案沒碰到這種麻煩,未來也不會碰到這種麻煩,那的確就不需要使用,避免過度設計。

可以回頭看看 iOS 陣營的 VIPER 架構圖,反思自己到底碰到什麼問題,到底應該切割什麼東西到哪邊。然後想想不應該使用 VIPER 的原因。XD

在 Unity 使用 MVx

Unity 官方沒有提過,當然也就沒有什麼所謂的 Unity MVx。

真要說的話,我自己使用的是 MVP,原因是古典 MVC 沒有解決問題,MVVM 比較適合 WPF,在 Unity 不太可能實現,然而 MVP 的確有解決問題,所以使用。跟設計模式一樣,就只是這個原因。

我看過一些人提出他們的架構也是 MVP,但使用上每個人的調性不太一樣,畢竟不是真的只有 3 個類別,沒有講解的話看起來好像差蠻多的,但其實都是基於 MVP 寫出適合專案的程式碼。

要注意的是,並不是把你的整個專案變成只有一個很大的 MVP 架構。而是在你的問題範圍內,把那個區塊變成 MVP。有些人會習慣這樣做,舊時代也有 MVC 框架這種東西,但我的概念跟 Uncle Bob 是一樣的,不建議在一開始就使用框架,除非你真的很清楚你在幹嘛。

老話一句,跟設計模式一樣。

所以寫 Unity 重視 MVx 的使用嗎?

重要的是能不能把程式寫的乾淨。為了能夠做到,你當然要認識 MVx 這個著名工具,以及它有點混亂的演變。

發佈留言