backbone(-2) 理解物件導向,backbone-2
什麼是OO
我一直以為自己很好的掌握了OO,所以大膽地在面試時不從程式的角度來解釋OO。但事實是我只是對已經知曉的理論作了一種形而上學的概括,在理論的應用時並沒有得心應手,所以在我變成web前端程式員之後,真正開始用架構來開發豐富頁面之前,非常有必要梳理自己的認知。
OO抽象出的對象是以實體屬性為基礎,對象管理自己內部的變化並針對這些變化改變自己的呈現,對象之間完全是隔離的,只有資料在對象之間跑動。對象就像細胞一樣,被細胞膜封裝,細胞間隙液則是資料流的一種,細胞液中沒有直接控制細胞行為的武器,只有各種化學元素,細胞對這些化學元素的反應是封閉在細胞內部、由細胞本身提供的。細胞之間的通訊則完全依賴資料流的變化(資料流包含所有外部刺激:光、溫度、體液中的物質整合資訊、輻射、震動……)
為什麼我們難以運用OO
朱元璋是出了名的控制狂,但他的思想很樸素,他實際是想用物件導向的方法製造出一套行政制度,於是設定了各種文書,行政單位之間通過文書來驅動,行政單位政務相對完整獨立——這是物件導向手段中典型的資料驅動方式……但結果是這套制度讓官員崩潰了,要做的事太多,資料流根本沒有辦法流暢,朱老大在把人當機器使呢。
為什麼把人當機器使就會出問題呢?因為人不可能和機器一樣穩定,true和false通過與門肯定能得出false,備胎和女神結合卻不一定會生出自己的孩子……涉及到人的地方,對象本身的功能不見得有用,因此控制A對象的方法不一定在A對象內部,而是在B對象身上,人的江湖都是這樣。
我最近讀的一本書叫《三體》,三體人思維是透明的,不能理解人類使用欺詐的方式。就像我們在接觸物件導向之前一直適應的是面向過程,業務驅動資料,過程是主體。忽然之間讓我們轉變思維,以對象封裝資料,業務被切割成片段分散到各個對象中,用控制資料流來組合對象形成業務——在一定程度上這是和人類世界動作的相反方式。
雖然我們在一開始接觸的時候就記住瞭解了物件導向,但是如果沒有體會到物件導向的好處之前,業務驅動仍然是我們大腦中default,而爽之前一定要痛一次的,這是第一次的普遍規則,所以你痛過了嗎?反正我是痛過了……
運用OO 有人問我物件導向的三大特性是什麼,我總會一愣,因為我知道三大特性,但是我懷疑它——因為我覺得OO的特性就是一個:封閉孤立性,黑盒子般的封閉。實現這一特性的思想是抽象封裝的思想,多態和繼承只是方便設計時使用的手段。 所以如何運用OO,就是如何封閉對象,把對象封閉成細胞那樣擁有自己的生態系統。 所以在接受到一個需求,無論它是複雜還是簡單,如何將它抽象分解成獨立的一個個無耦合平面層次的對象,就是運用OO。如何使用這些對象,或者對這些基礎對象進行貫通連接形成高一層次的對象,則是重新形成業務的過程。 一個系統中的業務或多或少都存在重複的子業務或業務片段,OO使用對業務合并同類項的方式抽取因子級對象,至少有以下好處:
- 1.極大減化了重複代碼,提高了代碼的重用性。
- 2.對象的呈現變化由自己控制,分散了整體業務的關注點,減化了業務的複雜度。
- 3.高擴充維護性,因子物件提供的是基礎功能,它們與具體的業務不耦合,因此可以隨便組合,因子的添加變化呈現高度可分離性。