移動App開發中的View解耦問題,app
這幾天在做給IOS代碼降耦的事情,順便嘮叨幾句開發中的View解耦問題。
首先,我們先定位一下View的角色:View應該只操心前/後景色,字型屬性,布局特性,x/y/width/height等純視覺屬性。不應該操心資料載入、修改,事件響應等Model和Controller關心的事。當然,也包括自訂的View。
接下來討論針對這個角色在實際開發中如何降低View部分耦合對整體架構的衝擊。
1、View的初始化、屬性設定應該有自己的Owner,不應該放到Controller中去。當然,這個工作可能由Android中的XML布局或IOS中的Xib來替代。Controller只負責拿到View的引用做後續的設定預設資料,安裝Listener等操作就可以了。
2、資料提供和更新重新整理,都應該由Controller觸發,如果資料比較複雜,像列表、宮格等,應該添加Adapter層來做Model和View的解耦。
3、事件的觸發應該通過Listener來實現View與Controller的解耦,不要把事件對應的邏輯直接寫到View中去,那會影響View的重用性,使代碼難於維護。
4、把螢幕適配的問題在View內部解決,不要在Controller中去做。比如Android中的XML中實現靈活布局,或者IOS中使用AutoLayout。
最後說一下實際操作。
Android中提供了XML布局其實變相做了強制解耦,使得我們使用過程中很少會在View中混雜其它代碼,我們只需要注意當View的Model比較複雜時,增加Adapter層來解耦就可以了。
而IOS中由於曆史原因普遍採用的代碼產生View,會導致在Controller中產生View,設定View屬性,以及在View中實現功能邏輯等MVC耦合的現象比較嚴重。鑒於Storyboard對Controller限制較多,這裡建議在在大型IOS項目中,參照Android的方式,通過Xib提供View布局,並把View執行個體通過IBOutlet映射到Controller中,通過Controller載入資料並安裝Listener。不要在Controller中出現操作View的視覺屬性的代碼。