把這兩個概念放在一起,確實不是很工整。但對於熱衷設計的我們,只要有用就行。
首先來解釋這兩個概念。
我給大家打個比方,假設你是乙個專案的專案經理。現在你手頭上有乙個任務,需要你去完成。你會怎麼去做呢?
乙個選擇,是你自己完成所有任務。當然,如果你願意奪取你所有的手下的機會的話。你是可以完成。這就是我們以往經常說的面向過程(op)。你知道所有你該做的,並且你去做了。
當然,你慢慢會發現,你的手下可以幫助你解決一些問題。於是你試圖讓他們去執行你安排給他們的任務。不過,你並沒有脫離op的階段,所有的工作都是你在安排,你在策劃,你在考慮。你只是使用了一些現成的庫來幫助你工作。
隨著時間的推移,你的手下開始慢慢能頂替你的工作。你開始將任務直接交給幾個手下,告訴他們你想要的結果,讓他們放手去幹。過程中進行適當的監督和協調。恭喜你,你在採用物件導向了。你不再關心實現任務的具體細節。你關注的是手下工作要開心,調節他的工作狀態,適當給些鼓勵,適當給些壓力,適當給些激勵。這就是oo。
是的,oo是處理問題的方式。把你從無所不知的聖人,落地為毫無能力的蠢才。選擇op還是oo,只是你的性格而已。
那麼,解釋完oo後,我們再來解釋一下「事件」這個概念。
什麼?事件?不就是函式型別嗎?不就是以前windows下的回掉函式嗎?不就是乙個特殊型別的指標嗎?函式指標。
是的,我的問題同樣不是問事件是如何實現的。我是問,事件是做什麼的?
在給你做乙個比方吧。比方說我們要完成乙個任務。內容是從北京到南京,距離1000公里。我們選擇的工具是汽車,路線是高速公路。很好,你開始要選擇開什麼車了。現在市面上有現成的各種品牌的車(這些都是框架提供的現成類,如果用了,你就不需要自己再去實現汽車類了)。你願意選用嗎?可是現在有乙個很現實的問題,家用車一般的油箱只有50公升,要跑完1000公里,油肯定不夠。看來一般的車是滿足不了我們的需求了。
乙個辦法是我們自己造乙個車,油箱足夠大,能夠放120公升油。那麼顯然動力系統就能夠滿足。不過可想而知,要造乙個車可是需要很多專業知識的。這條路你基本走不通,所以你只能又轉向原來的方案。
既然一次不夠,可不可以加油?當然可以!
好了,這個時候,我們要注意一下,我們在談論「事件」這個概念,現在才剛剛開始。
對於我們要完成任務的這些人來說,「事件」並不是我們關注。真正關心的人,是那些設計汽車和高速公路的人。
好吧,現在我們要做乙個艱難的轉變。你由完成任務(從北京到南京)的人,轉變為公路系統的總設計師了。等你轉變完這個角色變換後,恭喜你,你的設計把控能力又提公升了一大步。
假設你已經轉換完成。你現在是公路系統總設計師。你在設計道路的同時,當然要解決好我們加油的問題。可是你並不知道我們什麼時候需要加油。怎麼辦呢?
首先必然要在高速公路上設計必要的加油站,然後更重要的是在公路上提出標誌,讓汽車能夠接受到資訊,知道什麼地方有加油站。
回到軟體上來,如果你設計的高速公路類,還有汽車類,那麼汽車類應該在接受到高速公路上的加油站資訊的時候,就會觸發乙個事件。至於怎麼處理,那就是任務完成者,也就是駕駛員要判斷的了。首先看看油還夠不夠了,如果不夠了,就進站加油。
饒了這麼大的一圈,我就是想說,事件是框架設計者,讓使用者方便擴充套件或定製自己行為的方式。
我之所以將eod和ood這兩種方式放在一起討論,其實也是因為目前的流行框架都是兩者的結合。如mfc、vcl、.net framework。
最近在討論eclipse架構的時候,討論到它的外掛程式的「擴充套件點」概念。其實事件也是設計中使用的「擴充套件點」。或者可以說,eod是ood的擴充套件點。
event並不是oo本身所特有的。是為了解決「執行流程」問題,在oo的基礎上加上的思想。有了這個思想,才讓我們這些使用者可以方便實現各種需求。
以往總聽到op和oo的爭論,其中心都是理念的爭執!其實,真正解決問題的時候,我們經常什麼都用!可能那個時候我們才發現,什麼思想不思想,能解決問題的就是好的。這也讓我們更加相信設計沒有邊界!
論面向事件設計 EOD 和物件導向設計 OOD
2006年09月17日 01 51 00 把這兩個概念放在一起,確實不是很工整。但對於熱衷設計的我們,只要有用就行。首先來解釋這兩個概念。我給大家打個比方,假設你是乙個專案的專案經理。現在你手頭上有乙個任務,需要你去完成。你會怎麼去做呢?乙個選擇,是你自己完成所有任務。當然,如果你願意奪取你所有的手...
論面向事件設計 EOD 和物件導向設計 OOD
把這兩個概念放在一起,確實不是很工整。但對於熱衷設計的我們,只要有用就行。首先來解釋這兩個概念。我給大家打個比方,假設你是乙個專案的專案經理。現在你手頭上有乙個任務,需要你去完成。你會怎麼去做呢?乙個選擇,是你自己完成所有任務。當然,如果你願意奪取你所有的手下的機會的話。你是可以完成。這就是我們以往...
物件導向和面向過程
面向過程就是分析出解決問題所需要的步驟,然後用函式把這些步驟一步一步實現,使用的時候乙個乙個依次呼叫就可以了。物件導向是把構成問題事務分解成各個物件,建立物件的目的不是為了完成乙個步驟,而是為了描敘某個事物在整個解決問題的步驟中的行為。例如五子棋,面向過程的設計思路就是首先分析問題的步驟 1 開始遊...