以前看到很多書籍裏面說到過這兩種方法,看起來感受很高深,其實原理很簡單,就是兩個字「模塊」,往深一點說,也就是「抽象」。編程
所謂「大道至簡」,簡單每每是複雜的思想的基礎,因此想要了解這兩種思想的區別,仍是要好好想一想這兩個詞。架構
兩我的小明和小李同時製造汽車,兩我的同時開工。模塊化
小明決定用面向過程方法來製造,小李決定用面向對象方法來製造。測試
1.首先列出來,發動機須要的零件spa
2.而後根據零件來加工,小明分別加工每個零件。架構設計
3.最後組裝全部零件。設計
小明須要懂得全部的過程,保證每個零件均可靠,同一時間,只能生成一個零件。調試
1.首先列出來,發動機須要的零件,規定組裝接口code
2.分前後順序分別製做零件。對象
3.最後組裝全部零件。
小李須要瞭解各個發動機零件如何組裝,同一時間只能開發一個零件,而後最後再組裝零件。
/* 這一階段對應了小型程序的開發過程,這個時候,由於程序規模小,同時,能夠封裝的模塊太少,兩種方法沒有太大的差別。 */
1.讓工人分別批量生成好以前的每個小零件。
2.最後組裝全部零件。
每個零件都已經提早製做好了,隨時能夠拼裝,零件和零件之間關聯很強,依賴性大,是爲這輛車量身定製,耗時時間長,消耗時間精力大。
1.每個零件,由不一樣的部門負責,同時根據須要,採購部分零件。
2.最後組裝全部零件。
小李只關注核心零件,其餘零件只關注採購質量,耗時時間短,消耗時間精力小。
/* 這一階段裏面,項目要求跟以前是同樣的,只是數量上多起來,跟第一階段的仍是同樣的項目。 這個時候,兩種方法的差別也並非特別明顯,由於兩種方式均可以同時開發,並且由於要求是以前實現的同樣的功能,因此二次開發成本很小。 */
1.根據不一樣車型,拆分出來不一樣的零件,設計新零件。
2.而後根據零件來加工,小明分別加工每個零件。
3.最後組裝全部零件。
小明須要從新開發全部零件,調試不一樣零件,重用的零件少,耗時時間長。
1.首先找到新車型和以前舊車型的共同點,而後根據設計圖紙,針對性地修改以前的零件設計,從新加工。
2.開發核心零件及定製零件,而後購買其餘通用零件。
3.最後組裝全部零件。
小李將核心零件改進一下,用於新車型,由於零件之間關聯性少,因此能夠同時開發,開發快,耗時時間短。
/* 這個時候,由於涉及到根據以前的項目,從新更改修改成新項目,兩者的差別就顯現出來了。 面向過程方法,須要從新設計全部的零件,雖然有些零件能夠重用,可是也仍是聯合其餘模塊要通過大量調試,同一時間只能開發一種模塊。 面向對象方法,只須要看一下有哪些跟以前開發的項目相同的,由於已經封裝好了,能夠繼承以後直接拿來用。不一樣的地方,由於不一樣的模塊具備獨立性,因此開發起來也很快,多個模塊能夠同時開發。 */
由於以前全部的零件都是彼此關聯的,因此須要對車型進行從新設計。
由於各個零件之間關聯少,只須要更換以前的零件供應商,而後拼裝新零件。
/* 針對項目改動需求,這個時候模塊的獨立性優勢就顯現出來了。 不一樣的功能模塊彼此獨立,因此須要修改的時候,能夠只單獨修改這一個模塊,開發成本低。 可是若是是面向過程方法,不一樣的功能實際上都是緊密聯繫在一塊兒,改動一處代碼,就須要實現全局調試。這裏改一下,調試一下,哪裏改一下,調試一下,花的時間就多了,並且也容易出現bug。 */
針對不一樣的車型,針對性地編寫文檔說明,可是由於車型太多,並且每一款都是定製開發,消耗的時間、精力太多。
由於不一樣的零件之間關聯性強,因此須要先把一部分關鍵零件開發以後,再開發剩下的零件,依次類推,同一時間只能開發一款零件。
小明生病以後,由於沒有人瞭解整個製做過程,因此車輛製造停滯不前。
針對車型的不一樣零件,分別編寫文檔說明,同時規範了各個零件的鏈接。
針對核心零件,集中精力開發,其餘零件,量力開發,幾條生產線同時開發,彼此互不影響,同一時間,同時開發不一樣的零件。
小李生病以後,由於之間的零件之間關聯程度低,並且有詳細地說明文檔,車輛零件製做互不影響,依舊正常進行。
/* 當項目變的更大,大到千萬級行代碼的時候,量變就會產生質變。 面向過程方法,同時維護不一樣的項目,同時開發新的項目,由於重用性低,須要聯合總體項目進行調試,花費的成本太大。 同時以前設計的很好的功能,在重複利用起來,由於是針對不一樣的車型設計,不一樣的架構設計彼此之間關聯程度太大,因此重複利用起來,也要花費很多代價。 可是面向對象方法,能夠將相同的模塊經過繼承功能(從而實現公用的功能)和覆蓋功能(實現自定義的功能)聯繫起來,相同的模塊之間存在有序聯繫。而不一樣模塊之間,由於關聯程度低,因此也能夠保持靈活更新和開發的目的。好比發動機技術更新了,那麼就能夠在新車型上面採用新的發動機,電路系統升級了,就能夠在新車型上面運用到新的電路系統。不會跟面向過程方法同樣,由於電路系統必定要匹配什麼車型總體設計而用不了最新的技術。 */
--------------------------------------------------------------------------------------------------------------------------------------------------------------
其實能夠說面向過程編程就是針對項目內部邏輯,一步一步來實現程序的功能。好比要寫一個輪播圖的功能,第一步肯定功能,上一張下一張點擊按鈕,圖片自動輪播,動態顯示圓點,而後根據功能來編寫程序,第一步寫一個間隔執行程序,第二步實現上下移動按鈕,最後動態顯示原點。步驟清晰,針對於小型程序,方便快捷。
上面的小明就是面向過程編程,每一次製造車都是將全部的零件,都製做一遍,最後才作拼裝,不一樣的零件之間存在前後安裝的關聯,並且一個零件的好壞會影響到整個車輛的好壞。
面向對象編程,實際上能夠說是面向於模塊編程,是對於面向過程編程的抽象,一樣實現一個程序有不少步驟,那麼面向對象編程就是將不一樣的功能封裝起來(對象的封裝),好比上面說的不一樣的零件就是一個封裝,不一樣的零件提供了不一樣的做用和狀態(對應着對象的方法和屬性),對於其餘零件來講,封裝好的零件提供一個程序接口(與其餘對象的關聯程度低,保證獨立),別的零件不知道這個封裝零件是如何實現功能的,只須要保證這個零件可以起做用就能夠了。
上面的小李製造車輛的時候,將車輛劃分紅不一樣的零件,也就是對象,而後去實現每個對象的功能。最後經過每個零件的接口,來實現總體功能的拼裝。不一樣零件提供不一樣的功能和狀態,與其餘的零件關聯程度低,因此能夠同時開發,並且一個零件壞了不會破壞其餘零件,只須要更換對應零件便可。
當一個程序的結構不是很複雜,代碼量不是不少的時候,那麼面向過程編程實際上仍是頗有優點的,由於不用作封裝,直接寫好過程就能夠了。
可是當一個程序達到上萬行代碼,涉及到不一樣的功能的時候,就像上面的車型超過上百種的時候,不可能仍是單獨爲每一輛車單獨設計全部的零件,這個時候爲了提升開發速度,同時也是爲了保證開發質量,將程序的功能劃分紅不一樣的模塊(對象的封裝),好比車的發動機模塊,驅動系統模塊,電路系統模塊,每個模塊都是一個對象,具備封裝性,外界與它只有惟一的接口。並且當不一樣的車型須要一樣的功能,或者類似的功能的時候,經過改進以前的零件模塊,能夠立刻作出新的零件模塊出來(對象的繼承和覆蓋特性)。
因此說,與其叫面向對象編程,不如叫面向模塊編程。
本質上來講,面向對象編程是對面向過程編程的抽象,將面向過程編程中的一些功能模塊封裝起來,同時提供繼承和覆蓋功能,從而達到模塊化的編程,大大提升編程的靈活性和協做性。特別是對於項目需求改動頻繁的項目來講,若是採用模塊化的設計,封裝不一樣的對象,能夠大大提升開發效率。
而面向過程編程在多人協做,不端擴展的時候,就會出現由於內部各部分關聯程度過高,而出現各類各樣的問題。
面向過程編程的問題在於,模塊與模塊之間的耦合程度比較高,改動一個功能,每每會牽涉到一條線的功能改變。由於不一樣的功能其實是聯繫在一塊兒的,一條邏輯線上的。
面向對象編程的好處是,利用繼承和模塊封裝,每個測試好的模塊是獨立的,其餘的子類能夠繼承,也能夠在繼承的基礎上再次改進方法和屬性,總之不會影響到父類和其餘類的運行。
調用其它的功能其實是在調用不一樣的模塊的功能,若是有一個功能須要定製,那麼能夠新建一個實例,針對性地修改,不會影響到調用這個模塊的其餘部分。
低耦合,高內聚,獨立模塊,提供繼承和接口,這個是面向對象獨特的優點。
這是兩種編程方式,不存在好壞的問題,只是在不一樣的環境下適用性的問題。在程序小,代碼量少,功能模塊少的時候,面向過程編程是很適合的,這個時候,面向過程編程反而有點多餘。而在大項目中,面向過程編程就有些不足了!
從另一個角度來講,面向對象編程是對面向過程編程的抽象和改進,本質上的思想(按照開發項目的內在邏輯來實現代碼)是同樣的。