編程范式(Programming Paradigm)是某種編程語言的典型編程風(fēng)格或者說是編程方式希柿。
隨著編程方法學(xué)和軟件工程學(xué)的深入系任,特別是OO思想的普及,范式(Paradigm)以及編程范式等術(shù)語漸漸出現(xiàn)在人們面前。面向?qū)ο缶幊?OOP)常常被譽為是一種革命性的的思想,正因為它不同于其他的各種編程范式。編程范式也許是學(xué)習(xí)任何一門編程語言時要理解的最重要的術(shù)語逃魄。
托馬斯.庫爾提出“科學(xué)的革命”的范式論后,Robert Floyd在1979年圖靈獎的頒獎演說中使用了編程范式一詞澜搅。編程范式一般包括三個方面伍俘,以O(shè)OP為例:
1邪锌,學(xué)科的邏輯體系——規(guī)則范式:如 類/對象、繼承癌瘾、動態(tài)綁定秃流、方法改寫、對象替換等等機制柳弄。
2舶胀,心理認(rèn)知因素——心理范式:按照面向?qū)ο缶幊讨窤lan Kay的觀點,“計算就是模擬”碧注。OO范式極其重視隱喻(metaphor)的價值嚣伐,通過擬人化,按照自然的方式模擬自然萍丐。
3轩端,自然觀/世界觀——觀念范式:強調(diào)程序的組織技術(shù),視程序為松散耦合的對象/類的組合逝变,以繼承機制將類組織成一個層次結(jié)構(gòu)基茵,把程序運行視為相互服務(wù)的對象之間的對話。
簡單來說壳影,編程范式是程序員看待程序應(yīng)該具有的觀點拱层。
為了進(jìn)一步加深對編程范式的認(rèn)識,這里介紹幾種最常見的編程范式宴咧。
需要再次提醒的是:編程范式是編程語言的一種分類方式根灯,它并不針對某種編程語言。就編程語言而言掺栅,一種語言可以適用多種編程范式烙肺。
過程化(命令式)編程
過程化編程,也稱為命令式編程氧卧,應(yīng)該是最原始的桃笙、也是我們最熟悉的一種傳統(tǒng)編程方式。
從本質(zhì)上講沙绝,它是“馮.諾依曼機”運行機制的抽象搏明,它的編程思想方式源于計算機指令的順序排列。
∷薇ァ(也就是說:過程化語言模擬的是計算機機器的系統(tǒng)構(gòu)造熏瞄,而并不是基于語言的使用者的個人能力和傾向脚祟。這一點我們應(yīng)該都很清楚谬以,比如我們最早曾經(jīng)使用過的單片機的匯編語言。)
過程化編程的步驟是:
首先由桌,我們必須將待解問題的解決方案抽象為一系列概念化的步驟为黎。然后通過編程的方式將這些步驟轉(zhuǎn)化為程序指令集(算法)邮丰,而這些指令按照一定的順序排列,用來說明如何執(zhí)行一個任務(wù)或解決一個問題铭乾。這就意味著剪廉,程序員必須要知道程序要完成什么,并且告訴計算機如何來進(jìn)行所需的計算工作炕檩,包括每個細(xì)節(jié)操作斗蒋。簡言之,就是將計算機看作一個善始善終服從命令的裝置笛质。
所以在過程化編程中泉沾,把待解問題規(guī)范化、抽象為某種算法是解決問題的關(guān)鍵步驟妇押。其次跷究,才是編寫具體算法和完成相應(yīng)的算法實現(xiàn)問題的正確解決。當(dāng)然敲霍,程序員對待解問題的抽象能力也是非常重要的因素俊马,但這本身已經(jīng)與編程語言無關(guān)了。
程序流程圖是過程化語言進(jìn)行程序編寫的有效輔助手段肩杈。
盡管現(xiàn)存的計算機編程語言很多柴我,但是人們把所有支持過程化編程范式的編程語言都被歸納為過程化編程語言。例如機器語言扩然、匯編語言屯换、BASIC、COBOL与学、C 彤悔、FORTRAN、語言等等許多第三代編程語言都被歸納為過程化語言索守。
過程化語言特別適合解決線性(或者說按部就班)的算法問題晕窑。它強調(diào)“自上而下(自頂向下)”“精益求精”的設(shè)計方式。這種方式非常類似我們的工作和生活方式卵佛,因為我們的日逞畛啵活動都是按部就班的順序進(jìn)行的。
** 過程化語言趨向于開發(fā)運行較快且對系統(tǒng)資源利用率較高的程序截汪。過程化語言非常的靈活并強大疾牲,同時有許多經(jīng)典應(yīng)用范例,這使得程序員可以用它來解決多種問題衙解。
過程化語言的不足之處就是它不適合某些種類問題的解決阳柔,例如那些非結(jié)構(gòu)化的具有復(fù)雜算法的問題。**問題出現(xiàn)在蚓峦,過程化語言必須對一個算法加以詳盡的說明舌剂,并且其中還要包括執(zhí)行這些指令或語句的順序济锄。實際上,給那些非結(jié)構(gòu)化的具有復(fù)雜算法的問題給出詳盡的算法是極其困難的霍转。
廣泛引起爭議和討論的地方是:無條件分支荐绝,或goto語句,它是大多數(shù)過程式編程語言的組成部分避消,反對者聲稱:goto語句可能被無限地濫用低滩;它給程序設(shè)計提供了制造混 亂的機會。目前達(dá)成的共識是將它保留在大多數(shù)語言中岩喷,對于它所具有的危險性委造,應(yīng)該通過程序設(shè)計的規(guī)定將其最小化。
事件驅(qū)動編程
其實均驶,基于事件驅(qū)動的程序設(shè)計在圖形用戶界面(GUI)出現(xiàn)很久前就已經(jīng)被應(yīng)用于程序設(shè)計中昏兆,可是只有當(dāng)圖形用戶界面廣泛流行時,它才逐漸形演變?yōu)橐环N廣泛使用的程序設(shè)計模式妇穴。
在過程式的程序設(shè)計中爬虱,代碼本身就給出了程序執(zhí)行的順序,盡管執(zhí)行順序可能會受到程序輸入數(shù)據(jù)的影響腾它。
在事件驅(qū)動的程序設(shè)計中跑筝,程序中的許多部分可能在完全不可預(yù)料的時刻被執(zhí)行。往往這些程序的執(zhí)行是由用戶與正在執(zhí)行的程序的互動激發(fā)所致瞒滴。
事件曲梗。就是通知某個特定的事情已經(jīng)發(fā)生(事件發(fā)生具有隨機性)。
事件與輪詢妓忍。輪詢的行為是不斷地觀察和判斷虏两,是一種無休止的行為方式。而事件是靜靜地等待事情的發(fā)生世剖。事實上定罢,在Windows出現(xiàn)之前,采用鼠標(biāo)輸入字符模式的PC應(yīng)用程序必須進(jìn)行串行輪詢旁瘫,并以這種方式來查詢和響應(yīng)不同的用戶操做祖凫。
事件處理器。是對事件做出響應(yīng)時所執(zhí)行的一段程序代碼酬凳。事件處理器使得程序能夠?qū)τ谟脩舻男袨樽龀龇从场?/p>
事件驅(qū)動常常用于用戶與程序的交互惠况,通過圖形用戶接口(鼠標(biāo)、鍵盤宁仔、觸摸板)進(jìn)行交互式的互動稠屠。當(dāng)然,也可以用于異常的處理和響應(yīng)用戶自定義的事件等等。
事件的異常處理比用戶交互更復(fù)雜完箩。
事件驅(qū)動不僅僅局限在GUI編程應(yīng)用赐俗。但是實現(xiàn)事件驅(qū)動我們還需要考慮更多的實際問題拉队,如:事件定義弊知、事件觸發(fā)、事件轉(zhuǎn)化粱快、事件合并秩彤、事件排隊、事件分派事哭、事件處理漫雷、事 件連帶等等。
其實鳍咱,到目前為止降盹,我們還沒有找到有關(guān)純事件驅(qū)動編程的語言和類似的開發(fā)環(huán)境。所有關(guān)于事件驅(qū)動的資料都是基于GUI事件的谤辜。
屬于事件驅(qū)動的編程語言有:VB蓄坏、C#、Java(Java Swing的GUI)等丑念。它們所涉及的事件絕大多數(shù)都是GUI事件涡戳。
程化范式要求程序員用按部就班的算法看待每個問題。很顯然脯倚,并不是每個問題都適合這種過程化的思維方式渔彰。這也就導(dǎo)致了其它程序設(shè)計范式出現(xiàn),包括我們現(xiàn)在介紹的面向?qū)ο蟮某绦蛟O(shè)計范式推正。
面向?qū)ο蟮某绦蛟O(shè)計模式已經(jīng)出現(xiàn)二十多年恍涂,經(jīng)過這些年的發(fā)展,它的設(shè)計思想和設(shè)計模式已經(jīng)穩(wěn)定的進(jìn)入編程語言的主流植榕。來自TIOBE Programming Community2010年11月份編程語言排名的前三名Java乳丰、C、C++中内贮,Java和C++都是面向?qū)ο蟮木幊陶Z言产园。
面向?qū)ο蟮某绦蛟O(shè)計包括了三個基本概念:封裝性、繼承性夜郁、多態(tài)性什燕。面向?qū)ο蟮某绦蛘Z言通過類、方法竞端、對象和消息傳遞屎即,來支持面向?qū)ο蟮某绦蛟O(shè)計范式。
1. 對象
世間萬事萬物都是對象。
面向?qū)ο蟮某绦蛟O(shè)計的抽象機制是將待解問題抽象為面向?qū)ο蟮某绦蛑械膶ο蠹祭@梅庋b使每個對象都擁有個體的身份乘陪。程序便是成堆的對象,彼此通過消息的傳遞雕擂,請求其它對象 進(jìn)行工作啡邑。
2. 類
每個對象都是其類中的一個實體。
物以類聚——就是說明:類是相似對象的集合井赌。類中的對象可以接受相同的消息谤逼。換句話說:類包含和描述了“具有共同特性(數(shù)據(jù)元素)和共同行為(功能)”的一組對象。
比如:蘋果仇穗、梨流部、橘子等等對象都屬于水果類。
3. 封裝
封裝(有時也被稱為信息隱藏)就是把數(shù)據(jù)和行為結(jié)合在一個包中纹坐,并對對象的使用者隱藏數(shù)據(jù)的實現(xiàn)過程枝冀。信息隱藏是面向?qū)ο缶幊痰幕驹瓌t,而封裝是實現(xiàn)這一原則的一種方 式耘子。
封裝使對象呈現(xiàn)出“黑盒子”特性果漾,這是對象再利用和實現(xiàn)可靠性的關(guān)鍵步驟。
4. 接口
每個對象都有接口拴还。接口不是類跨晴,而是對符合接口需求的類所作的一套規(guī)范。接口說明類應(yīng)該做什么但不指定如何作的方法片林。一個類可以有一個或多個接口端盆。
5. 方法
方法決定了某個對象究竟能夠接受什么樣的消息。面向?qū)ο蟮脑O(shè)計有時也會簡單地歸納為“將消息發(fā)送給對象”费封。
6. 繼承
繼承的思想就是允許在已存在類的基礎(chǔ)上構(gòu)建新的類焕妙。一個子類能夠繼承父類的所有成員,包括屬性和方法弓摘。
繼承的主要作用:通過實現(xiàn)繼承完成代碼重用焚鹊;通過接口繼承完成代碼被重用。繼承是一種規(guī)范的技巧韧献,而不是一種實現(xiàn)的技巧末患。
7. 多態(tài)
多態(tài)提供了“接口與實現(xiàn)分離”。多態(tài)不但能改善程序的組織架構(gòu)及可讀性锤窑,更利于開發(fā)出“可擴充”的程序璧针。
繼承是多態(tài)的基礎(chǔ)。多態(tài)是繼承的目的渊啰。
合理的運用基于類繼承的多態(tài)探橱、基于接口繼承的多態(tài)和基于模版的多態(tài)申屹,能增強程序的簡潔性、靈活性隧膏、可維護(hù)性哗讥、可重用性和可擴展性。
面向?qū)ο?/a>技術(shù)一方面借鑒了哲學(xué)胞枕、心理學(xué)杆煞、生物學(xué)的思考方式,另一方面曲稼,它是建立在其他編程技術(shù)之上的索绪,是以前的編程思想的自然產(chǎn)物湖员。
如果說結(jié)構(gòu)化軟件設(shè)計是將函數(shù)式編程技術(shù)應(yīng)用到命令式語言中進(jìn)行程序設(shè)計贫悄,面向?qū)ο缶幊滩贿^是將函數(shù)式模型應(yīng)用到命令式程序中的另一途徑,此時娘摔,模塊進(jìn)步為對象窄坦,過程龜縮到class的成員方法中。OOP的很多技術(shù)——抽象數(shù)據(jù)類型凳寺、信息隱藏鸭津、接口與實現(xiàn)分離、對象生成功能肠缨、消息傳遞機制等等逆趋,很多東西就是結(jié)構(gòu)化軟件設(shè)計所擁有的、或者在其他編程語言中單獨出現(xiàn)晒奕。但只有在面向?qū)ο笳Z言中闻书,他們才共同出現(xiàn),以一種獨特的合作方式互相協(xié)作脑慧、互相補充魄眉。