你怎麼看待在 Android 中應用MVC,是否有必要抽象出獨立於 Activity 的 Controller ?

你懂的,你需要在Activity中寫大量的業務邏輯代碼。


為什麼題主會提這個問題?因為題主會做iOS開發,iOS裡面就是明確的分為MVC, 每個頁面都有xib或者storyboard來描述布局, 相當於android的xml; 另外還有一個ViewController來處理這個頁面的相關邏輯!

那麼,View這個類,iOS和android都是有的,互相對應;不提M, 因為iOS和android都沒有提(那是自己要實現的);可是C呢?ViewController哪裡去了?android裡面沒有ViewController這個東西啊!

其實,Android裡面的Activity就是ViewController,起的作用是一樣的!對應的界面元素,都是放在Activity裡面聲明的吧?事件觸發響應,是在Activity裡面寫的吧?那不就得了,不就是一碼事么!

那幹嘛還要從Activity中抽象出一個額外的ViewController?把ViewController的部分都抽出來了,Activity還剩下什麼?

所以題主,為了表示你是從iOS開發轉行過來的,很不習慣android開發,你可以寫:

public class MainViewController extends Activity {

......

}


我的理解Android的Activity和iOS的ViewController是一樣功能的,提供C的功能。


我倒是覺得樓主這個問題好。 Android中的V和C確實分得不太清。 xml、Adapter與Activity好像都幹了View的事, 但Activity好像還幹了Controller的事。

最近我在看wxpython in action這本書,裡面也提到了MVC分層的事。 跟Android也有共通之 處, 拋出來引玉:

In many modern Ui toolkits, the View and Controller components are somewhat intertangled. This is because the Controller component themselves need to be displayed on the screen, and because often u want widgets that display data to also respond to user events.

In wxPython, this relationship is enshrined() by the fact that all wx.Window objects are also subclass of wx.EvtHandler, meaning they fuction as both View elements and Controller elements.

In contrast, most web application frameworks have a strict separation between View and Controller, since the interaction logic happends behind the scenes on the server.


這個controller的抽象力度,要看Activity要處理業務邏輯情況而定。我所知道的電子市場應用程序詳細信息頁面Activity,要處理非常多的邏輯,他們

也是抽象出一個controller,避免在一個Activity里寫過多的代碼。

國內做第三方電子市場的童鞋,應該知道的。


這個問題,首先看你的架構,一切以基於你的系統結構為依據,否則就是在扯淡;

任何基於mvc的系統,c是一個完整獨立的,怎麼會要在activity里處理大量的業務邏輯呢?

你提這個問題,明顯已經進入一個誤區了。

嚴格來講在android,activity和intent起到了controller的角色,所以很明顯業務邏輯不應該放在activity里。

放在系統結構來看,controller肯定你要單獨自己抽出來,而不是都放在一個activity里,除非你的項目就一個activity,即使項目很簡單我也建議你抽出單獨的controller。

題外話:開頭我說了,做軟體要看系統結構,如果你做過webapp和nativeapp結合的項目,你就會遇到以下扯皮的情況了:

做web的人說,這個apk升級功能不應該我做,你natvie去實現去;但是下載自動更新的資源包,需要調用你去下載。

做native的人說了,丫的你都把業務邏輯都託管了,手機上的http請求、垮與訪問,gps,存儲、打電話的功能都給你封裝了,現在還讓我去摻和升級的功能,不是有病么?

出現上述問題根本原因就是系統結構不清楚造成的;

出現下面的問題,依然也是同樣的原因:

1、webapp和natvieapp需要一個controller還是各自搞一個controller?

2、webapp和nativeapp需要都做業務邏輯處理嗎?

3、webapp調用nativeapp異常處理誰去處理?

作為一個程序員,開發過程中協同開發時候,如果你感覺痛苦了,效率低下,基本上就是系統結構出問題了。


我認為業務邏輯必需被抽出獨立於Activity,因為這樣子可以方便的對他們進行單元測試(用JUnit不是用Android Unit test,因為Android Unit test運行太慢)。業務邏輯是我們最注重的一部分。

對設計有興趣的朋友可以更進一步了解一下Martin Fowler的Presentation Model - Presentation Model。它是MVC模式的更新與更進一步。這個模式對包含UI的應用有深遠的影響。幾年前,我們開始了一個開源項目RoboBinding([url]http://robobinding.org[/url])。RoboBinding是一個實現Martin Fowler的Presentation Model構架模式(為MVC模式的更進一步)的Android框架。 目標為減少android應用開發工作量(可減少50%UI代碼量);促進清晰的項目結構;使項目代碼更易於測試(使大部分UI邏輯代碼可直接用JUnit測試)。在成熟的語言環境下都有對應的Presentation Model(MVVM/MVP微軟社區的叫法)實現框架如.Net的WPF與Silverlight,Java swing的JGoodies Binding。 我們在幾年前開始開發這個框架(我是項目的開發者之一)。現在類似的框架還有:Android-Binding, Bindroid,MvvmCross。RoboBinding是以Agile與Test driven development方式開發,注重代碼質量與可測試性,項目包含了300多個unit tests。有興趣的朋友可以了解一下。

這裡有介紹的中文視頻 - Android MVP MVVM Presentation Model模式與基於RoboBinding應用 (視頻質量太差) 或 https://www.youtube.com/watch?v=2sSBVaX77xA (視頻質量好)


這要先搞清楚這個Activity在MVC中擔任什麼角色。按照google的建議,Activity是C的角色,V是XML(或者Html),那這為什麼還有C獨立出來的問題,他本身就是。如果你把Activity看作是V,你要自己封裝C出來了,這是有必要獨立的。不管哪種,Activity中不應該有處理邏輯的代碼,複雜邏輯還是要放在Model裡面去的。


MVC肯定是必要的,Activity只做View ,抽象出單獨的controller。

standup timer 這個開源的項目就嚴格運用了view和model的嚴格分離,可以有空研究下。


https://github.com/LuckyJayce/MVCHelper

這個框架就是MVC架構的


android系統設計的太垃圾,開發人員也不行,整個項目的分包,該分的都沒分,不該分的分了一大堆, 很少有項目按模塊分包,然後每個模塊下面分MVC多清晰啊, 看看android項目的layout文件夾,他媽的一個項目的Layout布局放到一個文件夾,想想都恐怖, android好像沒有嚴格的MVC,邏輯部分到處寫,沒有明確的Controller,也不想iOS所有的View都是自定義,在android實現個自定義view繁瑣的要死! 在ios一行代碼都不要寫的導航欄和底部Tabbar在android都要寫一對代碼.


觀賞中,目前為止還沒有刻意注意這個問題呢。之前做的都是一些小東西。以後做大了,應該得將controller獨立出來。


建議在稍大一點的項目中將controller獨立出來,總覺得將邏輯代碼過多的寫在activity中,代碼太過於雜亂


我覺得lz理解不全對,你可以在Activity中寫業務代碼,也可以不寫。

我感覺現在一般的情形是,android app都是小巧的應用,邏輯不太複雜,所以不一定非按照MVC來實現。

至於大型的項目,可以自己去設計結構。模式是死的,必須根據實際情況來運用


model是必然需要分離的,而controller中有些邏輯代碼是不方便從Activity中分離的,比如shared reference功能便繼承了Activity類。建議,把對model的操作盡量完備的單獨封裝成類以供Activity調用。


推薦閱讀:

google play 中應用為何廣告如此之多?
Android 手機上有哪些好用的讀書軟體?
求推薦一款安卓閱讀軟體?

TAG:Android應用 | Android開發 | Android手機 | Android應用創新 | Android |