Unity 關於MVVM的思考

2021-09-19 06:54:45 字數 1296 閱讀 2050

因為之前一直在做遊戲,接觸的框架的資料和檢視的結構都是mvc的,第一次聽說mvvm,也少不了一頓查,所幸這些結構思路大差不差,只是部分細節不同而已。

一、初識mvvm

mvvm就是m-v-vm。m是資料類,v是檢視類,vm是乙個中介類。它的初衷也是為了分離資料和檢視,它希望三個模組職責非常單一,v只負責ui的顯示,m只儲存資料,vm作為v和m的中介,負責資料的傳遞和更新邏輯、以及glue code,這樣做以後,除非ui布局或結構修改,就再也不用關心ui相關的內容了。

mvvm強調的是一種一一對應的關係,即,乙個v,對應乙個固定的vm,對應乙個m。v和vm進行資料繫結,當m的資料發生變化時,通知vm,vm通過繫結使v自動進行更新;v觸發資料更新時,通過資料繫結自動更新vm端,vm再通知m進行更新。

二、需求分析

目前需求是希望在已有的功能和結構上,分析mvvm的可行性。

現在有多個型別的資料,每種資料對應乙個管理器,但是這些資料對應同乙個檢視。

如圖,選中某個管理器標籤,顯示對應的資料結構(羅列在下面)。

當前內容最重要的一點是:每個管理器新增了attribute,在整個功能入口處進行attribute檢測,找出所有標記了attribute的管理器,然後ui通過反射,拿到所有管理器對應的資料結構進行顯示(這麼做是為了以後動態新增管理器,就不需要修改ui相關**,ui會根據檢測到的標籤自動生成)。

現在這些資料可以通過ui進行修改並儲存,這樣ui的功能就不僅僅是顯示資料了,還有修改資料的權利。因此想到了mvvm的結構,將顯示用到的資料進行v和vm的資料繫結,這樣當資料端有變化時,v會自動更新顯示;當v修改資料時,vm會自動更新資料,以後資料的變化就實現了自動化。

三、碰到的問題

理想是美好的,現實是殘酷的。

首先碰到的第乙個問題就是,原本的v和vm是一一對應的關係,但是目前的情況是唯一的v對應多個vm,而且v並不知道vm的所持有的具體資料型別(v裡用到的資料都是反射得來的),如果像傳統v和vm的繫結,v清楚知道vm裡的每乙個資料型別,但這樣做的話我們的反射就失去了意義,「自動化」也沒有用了。

為了解決這個問題,我們的v就不在關心具體資料了,而是關心每個vm是否發生變化,如果某個vm變化,就對這個vm進行繫結更新,反過來,v進行資料修改了,一樣的邏輯。

第二個問題是第乙個解決方案衍生出來的:當在v中對每個vm進行監聽時,等等,v知道了vm的個數和具體是哪些vm?這跟我們的自動化矛盾了!v所知道的關於vm的所有資訊,都是在執行時根據反射動態得到的,如果這麼直接監聽,就預設v知道所有vm了,自動化某的作用了。

關於博弈的思考

博弈,決策,永恆的主題 在博弈的過程中不要考慮是否公平,而是要考慮是否對你自己有利。這句話很值得思考。人生無時無刻不在博弈,無論是在微觀上,兩個人之間的談話 還是在巨集觀上每次人生抉擇的過程,博弈,總是在乙個恰當的視點上讓人設身處地的感受到。在博弈的過程中,公平與否,很多人都在抱怨 有的時候是與自己...

關於執行的思考

方 的實施,貫穿於軟體開發的整個過程。實施的關鍵在於執行,而執行由很多瑣碎的活動組成。在軟體開發實踐中,執行應該被放到乙個完整的體系環境中去考慮,單純強調執行本身,是無法解決執行問題的。在討論執行這個話題之前,我認為有必要先來看看東西方文化的差異。中國近代哲學史上有一種觀點,即地理環境決定了文化差異...

關於IncludeAction的思考

關於struts中的includeaction 類,傳說可以實現類似標記的功能,將乙個網頁嵌入到另乙個網頁,但基於安全等一系列因素,在基於struts的應用系統中,推薦使用includeaction。org.apache.struts.actions.includeaction 類提供 包含 指定u...