3 面向過程與面向對象進一步比較
阿新 • • 發佈:2018-04-15
error 現實 的人 100g __name__ 雲服務 nec 對象 內部
復雜的問題流程化,進而簡單化(一個復雜的問題,分成一個個小的步驟去實現,實現小的步驟將會非常簡單)
舉個典型的面向過程的例子, 寫一個數據遠程備份程序, 分三步,本地數據打包,上傳至雲服務器,測試備份文件可用性。
編程範式
編程即寫程序or寫代碼,具體是指程序員用特定的語法+數據結構+算法編寫代碼,目的是用來告訴計算機如何執行任務 。 如果把編程的過程比喻為練習武功,那麽編程範式指的就是武林中的各種流派,而在編程的世界裏最常見的兩大流派便是:面向過程與面向對象。 “功夫的流派沒有高低之分,只有習武的人才有高低之分“,在編程世界裏更是這樣,面向過程與面向對象在不同的場景下都各有優劣,誰好誰壞不能一概而論,下面就讓我們來詳細了解它們。面向過程的程序設計
概念:
核心是“過程”二字,“過程”指的是解決問題的步驟,即先幹什麽再幹什麽......,基於面向過程設計程序就好比在設計一條流水線,是一種機械式的思維方式。若程序一開始是要著手解決一個大的問題,面向過程的基本設計思路就是把這個大的問題分解成很多個小問題或子過程,這些子過程在執行的過程中繼續分解,直到小問題足夠簡單到可以在一個小步驟範圍內解決。優點是:
1 import os 2 3 def data_backup(folder): 4 print("找到備份目錄: %s" %folder) 5 print(‘正在備份......‘) 6 zip_file=‘/tmp/backup20181103.zip‘ 7 print(‘備份成功,備份文件為: %s‘ %zip_file) 8 returnzip_file 9 10 def cloud_upload(file): 11 print("\nconnecting cloud storage center...") 12 print("cloud storage connected.") 13 print("upload file...%s...to cloud..." %file) 14 link=‘http://www.xxx.com/bak/%s‘; %os.path.basename(file) 15 print(‘close connection.....‘) 16 return link 17 18def data_backup_test(link): 19 print("\n下載文件: %s , 驗證文件是否無損" %link) 20 21 def main(): 22 #步驟一:本地數據打包 23 zip_file = data_backup("c:\\users\\alex\歐美100G高清無碼") 24 25 #步驟二:上傳至雲服務器 26 link=cloud_upload(zip_file) 27 28 #步驟三:測試備份文件的可用性 29 data_backup_test(link) 30 31 if __name__ == ‘__main__‘: 32 main()
缺點是:
一套流水線或者流程就是用來解決一個問題,比如生產汽水的流水線無法生產汽車,即便是能,也得是大改,改一個組件,與其相關的組件都需要修改,牽一發而動全身,擴展性極差。 比如我們修改了步驟二的函數cloud_upload的邏輯,那麽依賴於步驟二結果才能正常執行的步驟三的函數data_backup_test相關的邏輯也需要修改,這就造成了連鎖反應,而這一弊端會隨著程序的增大而變得越發的糟糕,我們程序的維護難度將會越來越大。1 import os 2 3 def data_backup(folder): 4 print("找到備份目錄: %s" %folder) 5 print(‘正在備份......‘) 6 zip_file=‘/tmp/backup20181103.zip‘ 7 print(‘備份成功,備份文件為: %s‘ %zip_file) 8 return zip_file 9 10 def cloud_upload(file): #加上異常處理,在出現異常的情況下,沒有link返回 11 try: 12 print("\nconnecting cloud storage center...") 13 print("cloud storage connected.") 14 print("upload file...%s...to cloud..." % file) 15 link = ‘http://www.xxx.com/bak/%s‘; % os.path.basename(file) 16 return link 17 except Exception: 18 print(‘upload error‘) 19 finally: 20 print(‘close connection.....‘) 21 22 def data_backup_test(link): #加上對參數link的判斷 23 if link: 24 print("\n下載文件: %s , 驗證文件是否無損" %link) 25 else: 26 print(‘\n鏈接不存在‘)def main(): 27 28 #步驟一:本地數據打包 29 zip_file = data_backup("c:\\users\\alex\歐美100G高清無碼") 30 31 #步驟二:上傳至雲服務器 32 link=cloud_upload(zip_file) 33 34 #步驟三:測試備份文件的可用性 35 data_backup_test(link) 36 37 if __name__ == ‘__main__‘: 38 main()
應用場景:
面向過程的程序設計思想一般用於那些功能一旦實現之後就很少需要改變的場景, 如果你只是寫一些簡單的腳本,去做一些一次性任務,用面向過程的方式是極好的,著名的例子有Linux內核,git,以及Apache HTTP Server等。但如果你要處理的任務是復雜的,且需要不斷叠代和維護 的, 那還是用面向對象最方便了。面向對象的程序設計
概念:
核心是“對象”二字,要理解對象為何物,必須把自己當成上帝,在上帝眼裏,世間存在的萬物皆為對象,不存在的也可以創造出來。程序員基於面向對象設計程序就好比如來設計西遊記,如來要解決的問題是把經書傳給東土大唐,如來並沒有考慮問題的解決流程,而是設計出了負責取經的師傅四人:唐僧,沙和尚,豬八戒,孫悟空,負責騷擾的一群妖魔鬼怪,以及負責保駕護航的一眾神仙,這些全都是對象,然後取經開始,就是師徒四人與妖魔鬼怪神仙交互著直到完成取經任務。所以說基於面向對象設計程序就好比在創造一個世界,世界是由一個個對象組成,而你就是這個世界的上帝。 我們從西遊記中的任何一個人物對象都不難總結出:對象是特征與技能的結合體。比如孫悟空的特征是:毛臉雷公嘴,技能是:七十二變、火眼金睛等。 與面向過程機械式的思維方式形成鮮明對比,面向對象更加註重對現實世界而非流程的模擬,是一種“上帝式”的思維方式。優點是:
解決了面向過程可擴展性低的問題,這一點我們將在5.2小節中為大家驗證,需要強調的是,對於一個軟件質量來說,面向對象的程序設計並不代表全部,面向對象的程序設計只是用來解決擴展性問題。 缺點是: 編程的復雜度遠高於面向過程,不了解面向對象而立即上手並基於它設計程序,極容易出現過度設計的問題,而且在一些擴展性要求低的場景使用面向對象會徒增編程難度,比如管理linux系統的shell腳本程序就不適合用面向對象去設計,面向過程反而更加適合。應用場景:
當然是應用於需求經常變化的軟件中,一般需求的變化都集中在用戶層,互聯網應用,企業內部軟件,遊戲等都是面向對象的程序設計大顯身手的好地方。3 面向過程與面向對象進一步比較