最近在考項目管理的課程,學到了系統工程這一門課,有一些感觸和領悟,特在此記錄一下。編程
這些想法和下邊敘述的內容都是我我的在編程方面的一些想法,因爲不善寫做,可能例子會比較少。有興趣的朋友,能夠在評論區留言,咱們作進一步的交流。緩存
先說說我得出的結論:當咱們使用系統的思想去處理程序,有不少令我疑惑的問題就迎刃而解了,我會圍繞這個思想一步一步的解釋,爲何系統的思想可以解決困惑個人問題。網絡
記得我剛開始學iOS那會,咱們寫的最多的代碼就是tableView,咱們從最簡單也最有問題的地方開始。我看到過不少初學者在寫cell的時候,直接在控制器中給cell添加各類各樣的控件,這會有很大的問題,當別人想複用這個cell的時候該是多麼的痛苦。架構
顯而易見,上邊說的就是最低級的方式,甚至連MVC的概念也沒用到,好了,接下來咱們用一個模型來封裝cell。這應該是當下iOS編程中使用最多的方式,cell和模型有很強的耦合關係。這種狀況下的cell,每每使用一個獨立的文件建立,在初始化方法中建立控件,在模型的setter方法中配置控制。這裏的配置就包含了賦值操做和根據模型中的屬性控制顯示方式的操做。mvc
這麼作符合mvc的概念,控制器和view之間經過模型做爲鏈接的管道,同時也減小了view複用的代價。但這樣仍然有不少問題,知道了問題的所在,咱們的架構纔可以進化:設計
根據業務的複雜程度,咱們在模型的setter方法中,要處理的業務也會各不相同。原理上,界面如何顯示跟模型有極大的關係。雖然這種方式可以正確顯示數據,但沒法緩存frame。我會在後邊講到,爲何這種經過setter賦值的方式很不符合編程中的語義要求。代理
假如說cell中有一些控件是有點擊事件的,這些事件中須要發送網絡請求。有的人喜歡經過代理的方式把事件傳遞到控制器中,這麼作的優勢是可以獲得控制器這個對象,所以就可以輕易的使用控制器的屬性,好比說添加加載控件到控制器的view上,或者使用控制器中的某個參數,但每每有點擊事件,就有數據更新,對象
依賴於模型setter方法的弊端就顯現了出來,你必需要先修改模型後,再去刷新tableview,此時此刻,咱們就稱之爲這個模型被污染了。事件
一種好的設計方案是,界面的顯示有一套模型,數據源是另外一套模型,這種方案,咱們立刻就會講到。項目管理
我見過那種把事件的邏輯直接寫到view中的,這樣作省卻了代理傳值的麻煩,且view基本上能保持功能的完整性。當咱們在別的地方複用該view的時候,不須要在控制器中寫重複的代碼。缺點是沒法獲取控制器屬性,即便可以獲取控制器,也只有再把控制器屬性暴露在.h中才能使用,這就破壞了編程中的封裝性。
若是你的代碼中不多使用相似於readonly這樣的權限屬性,那麼你就應該去學學這方面的知識,這不是一個屬性的事情,而是一種編程思想的問題。
說到這裏,咱們已經明白,使用模型的setter這種方式開發是一種常見行爲,可是弊端也很明顯,它並不能成爲一個拿得出手的技巧。咱們接下來講說view model這一律念,咱們簡稱爲vm。vm能夠算是model和view的一箇中間過程,其實,編程的本質仍是處理數據。在vm中咱們經過model能夠配置出view所須要的任何屬性,所以view獲得解放,它沒必要關係這一過程是怎樣的,只須要拿到vm中的屬性直接顯示就行。
同理,vm還緩存了view中各個控件的frame信息。有的人可能會把vm叫作frame模型,這是不合理的,提供frame只是一個小小的功能,提供view直接顯示的信息纔是它的核心功能。
舉個簡單的例子,有一個cell,上邊有3個label,我在使用vm的時候,根據模型計算出這3個label的attText,而後使用yylabel顯示數據,同時,在vm中計算label的frame,所以cell中的代碼就很乾淨,簡單。這時候,vm就接管了cell的顯示任務,模型做爲核心數據,不會被污染。
vm仍然有它的問題,跟新數據算是一個問題,時間的傳遞它也並無很好的解決。
上邊的兩種設計雖然有問題,但仍然須要使用,後來,我冒出來一種manager的想法。manager擁有提供和處理數據的能力,它很想一個超強大腦,可以爲view或者控制器提供任何想要的數據和功能。
想一想一下,一個表單,有不少項須要填寫,manger能夠提供一份默認值,能夠保存編輯後的值,能夠驗證數據是否合法,能夠獲取參數字典等等,它均可以作到,由於這些數據就在它內部保存着,沒有誰比他更清楚這些東西。這在語義上是比較符合要求的,若是咱們把這些複雜的需求保存在一個模型中,那麼模型仍是模型嗎?
這個manager,我介紹的很簡單,可以領悟到這一層的同窗,不用說應該也明白。
他特別重要
manager可以很好的處理數據和業務,若是讓他處理更多的任務,那麼他就會變得臃腫不堪,這不是咱們想看到的。所以咱們須要再一次進化,我領悟到另一種編程思想,也是本篇文章的核心思想
系統是一個具備必定功能的,相互間具備有機聯繫的,有多種要素或構成部分組成的一個總體
系統是一個總體,他讓我撥開迷霧,你們仔細想一想,其實控制器自己就是一個系統,蘋果把他叫作controller也不是沒有緣由的。在控制器這個系統中,他內部全部的組成部分都是有機聯繫的,既相互獨立又相互聯繫,他們共同的目的就是完成該控制器界面的顯示任務。這就是最典型的一個系統
以前,我常常把控制器想象成一臺機器,view是該機器上的零件,view的manager是該零件的管理者,基於這樣的思想,寫出的代碼中,view的地位大於manager的地位,manager爲view服務。如今看來,這種思想是有侷限性的。
控制器是一個系統,可以完成必定功能的view和manager他們應該也是一個系統,他們的關係既相互獨立又緊密相連。
系統是有輸入和輸出的,寫輸入和輸出,是我最近編程中要研究的地方。
到此爲止,代碼的複用其實就是系統的複用,事件和數據的操做就是系統的輸入輸出。一個控制器能夠添加多個子系統,子系統根據輸入配置view,而後添加到控制器的view上,大體是這樣一個過程。
兩個以上的元素組成才叫系統,一個元素咱們使用manager的思想。所以,一個tableview徹底能夠是一個系統的輸出,一個cell徹底可使用單一功能的manager進行關係,把事件拋給響應的系統進行處理。
這篇文章用時1小時20分,一鼓作氣,蛋疼的是沒有任何代碼示例,也算是我本身編程思想進化的一個里程碑吧。果斷時間我用這個系統的思想寫點例子以後再從新發文。