初学者的困惑:OOP与一般编程的区别
*在寫《程序猿的思維修煉》隨筆中,我們大概猜想到了,OOP的思想更趨于模塊化,更獨(dú)立,因此稱為一個(gè)個(gè)對(duì)象,本次隨筆將對(duì)OOP和一般編程的區(qū)別有更詳細(xì)的解釋
?
面向?qū)ο缶幊痰暮x:
面向?qū)ο缶幊淌莿?chuàng)建計(jì)算機(jī)應(yīng)用程序的一種相當(dāng)新的方法,它解決了傳統(tǒng)編程技巧帶來的許多問題。一般的的編程方法稱為函數(shù)(或過程)化編程,常常會(huì)導(dǎo)致所謂的單一應(yīng)用程序,即所有的功能都包含在幾個(gè)代碼模塊中(常常是一個(gè)代碼模塊)。而使用OOP技術(shù),常常要使用許多代碼模塊,每個(gè)模塊都提供特定的功能,每個(gè)模塊都是孤立的,甚至與其他模塊完全獨(dú)立。這種模塊化編程方法提供了非常大的多樣性,大大增加了重用代碼的機(jī)會(huì)。
要進(jìn)一步說明這個(gè)問題,假定計(jì)算機(jī)上的一個(gè)高性能應(yīng)用程序是一輛一流賽車。如果使用傳統(tǒng)的編程技巧,這輛賽車就是一個(gè)單元。如果要改進(jìn)該車,就必須替換整車,把它送回廠商那里,讓汽車專家升級(jí)它,或者購(gòu)買一輛新車。如果使用OOP技術(shù),就只需從廠商處購(gòu)買新的引擎,自己按照其說明替換它,而不必用鋼鋸切割車體。
在傳統(tǒng)的應(yīng)用程序中,執(zhí)行流常常是簡(jiǎn)單的、線性的。把應(yīng)用程序加載到內(nèi)存中,從A點(diǎn)開始執(zhí)行,在B點(diǎn)結(jié)束,然后從內(nèi)存中卸載,在這個(gè)過程中可能用到其他各種實(shí)體,例如存儲(chǔ)介質(zhì)上的文件或顯卡的功能,但處理的主體總是位于一個(gè)地方。此時(shí)的代碼一般與使用各種數(shù)學(xué)和邏輯方式處理數(shù)據(jù)相關(guān)。處理方法通常比較簡(jiǎn)單,使用基本的數(shù)據(jù)類型,例如整型和布爾值,建立比較復(fù)雜的數(shù)據(jù)表達(dá)方式。
而使用OOP,事情就不是這么直接了。盡管可以獲得相同的效果,但其實(shí)現(xiàn)方式是完全不同的。OOP技術(shù)以結(jié)構(gòu)、數(shù)據(jù)的含義以及數(shù)據(jù)和數(shù)據(jù)之間的交互操作為基礎(chǔ)。這通常意味著要把更多的精力放在項(xiàng)目的設(shè)計(jì)階段,但項(xiàng)目的可擴(kuò)展性比較高。一旦對(duì)某種類型的數(shù)據(jù)的表達(dá)方式達(dá)成一致,這種表達(dá)方式就會(huì)應(yīng)用到應(yīng)用程序以后的版本中,甚至是全新的應(yīng)用程序中。這種一致的表達(dá)方式可以大大減少開發(fā)時(shí)間。這就是上述賽車示例的工作原理。這里的一致是"引擎"的代碼是結(jié)構(gòu)化的,這樣就可以很容易地替換成新代碼(即新引擎),而不需要找廠商幫忙。這也表示,引擎創(chuàng)建出來后可以用于其他目的,可以把它安裝到另一輛車上,或者用它驅(qū)動(dòng)潛艇。
除了數(shù)據(jù)表達(dá)方式的一致性外,OOP編程還常常可以簡(jiǎn)化任務(wù),因?yàn)檩^抽象實(shí)體的結(jié)構(gòu)和用法也是一致的。例如,不僅把輸出結(jié)果發(fā)送給設(shè)備(如打印機(jī))所使用的數(shù)據(jù)格式是一致的,而且與該設(shè)備交換數(shù)據(jù)的方法也是一致的,這包括它理解的指令等等。回到賽車的示例上,要達(dá)成的一致包括引擎如何連接到油箱上,如何把驅(qū)動(dòng)力傳送給車輪等。
顧名思義,OOP技術(shù)要使用對(duì)象。
?
面向?qū)ο蟮乃膫€(gè)基本特征:
①抽象:抽象就是忽略一個(gè)主題中與當(dāng)前目標(biāo)無(wú)關(guān)的那些方面,以便更充分地注意與當(dāng)前目標(biāo)有關(guān)的方面。抽象并不打算了解全部問題,而只是選擇其中的一部分,暫時(shí)不用部分細(xì)節(jié)。比如,我們要設(shè)計(jì)一個(gè)學(xué)生成績(jī)管理系統(tǒng),考察學(xué)生這個(gè)對(duì)象時(shí),我們只關(guān)心他的班級(jí)、學(xué)號(hào)、成績(jī)等,而不用去關(guān)心他的身高、體重這些信息。抽象包括兩個(gè)方面,一是過程抽象,二是數(shù)據(jù)抽象。過程抽象是指任何一個(gè)明確定義功能的操作都可被使用者看作單個(gè)的實(shí)體看待,盡管這個(gè)操作實(shí)際上可能由一系列更低級(jí)的操作來完成。數(shù)據(jù)抽象定義了數(shù)據(jù)類型和施加于該類型對(duì)象上的操作,并限定了對(duì)象的值只能通過使用這些操作修改和觀察。
②繼承:繼承是一種聯(lián)結(jié)類的層次模型,并且允許和鼓勵(lì)類的重用,它提供了一種明確表述共性的方法。對(duì)象的一個(gè)新類可以從現(xiàn)有的類中派生,這個(gè)過程稱為類繼承。新類繼承了原始類的特性,新類稱為原始類的派生類(子類),而原始類稱為新類的基類(父類)。派生類可以從它的基類那里繼承方法和實(shí)例變量,并且類可以修改或增加新的方法使之更適合特殊的需要。這也體現(xiàn)了大自然中一般與特殊的關(guān)系。繼承性很好的解決了軟件的可重用性問題。比如說,所有的Windows應(yīng)用程序都有一個(gè)窗口,它們可以看作都是從一個(gè)窗口類派生出來的。但是有的應(yīng)用程序用于文字處理,有的應(yīng)用程序用于繪圖,這是由于派生出了不同的子類,各個(gè)子類添加了不同的特性。
③封裝:封裝是面向?qū)ο蟮奶卣髦?#xff0c;是對(duì)象和類概念的主要特性。封裝是把過程和數(shù)據(jù)包圍起來,對(duì)數(shù)據(jù)的訪問只能通過已定義的界面。面向?qū)ο笥?jì)算始于這個(gè)基本概念,即現(xiàn)實(shí)世界可以被描繪成一系列完全自治、封裝的對(duì)象,這些對(duì)象通過一個(gè)受保護(hù)的接口訪問其他對(duì)象。一旦定義了一個(gè)對(duì)象的特性,則有必要決定這些特性的可見性,即哪些特性對(duì)外部世界是可見的,哪些特性用于表示內(nèi)部狀態(tài)。在這個(gè)階段定義對(duì)象的接口。通常,應(yīng)禁止直接訪問一個(gè)對(duì)象的實(shí)際表示,而應(yīng)通過操作接口訪問對(duì)象,這稱為信息隱藏。事實(shí)上,信息隱藏是用戶對(duì)封裝性的認(rèn)識(shí),封裝則為信息隱藏提供支持。封裝保證了模塊具有較好的獨(dú)立性,使得程序維護(hù)修改較為容易。對(duì)應(yīng)用程序的修改僅限于類的內(nèi)部,因而可以將應(yīng)用程序修改帶來的影響減少到最低限度。
④多態(tài):多態(tài)性是指允許不同類的對(duì)象對(duì)同一消息作出響應(yīng)。比如同樣的加法,把兩個(gè)時(shí)間加在一起和把兩個(gè)整數(shù)加在一起肯定完全不同。又比如,同樣的選擇編輯-粘貼操作,在字處理程序和繪圖程序中有不同的效果。多態(tài)性包括參數(shù)化多態(tài)性和包含多態(tài)性。多態(tài)性語(yǔ)言具有靈活、抽象、行為共享、代碼共享的優(yōu)勢(shì),很好的解決了應(yīng)用程序函數(shù)同名問題。
?
面向?qū)ο蟮膬?yōu)點(diǎn):
①開發(fā)時(shí)間短,效率高,可靠性高,所開發(fā)的程序更強(qiáng)壯。由于面向?qū)ο缶幊痰目芍赜眯?#xff0c;可以在應(yīng)用程序中大量采用成熟的類庫(kù),從而縮短了開發(fā)時(shí)間。
②應(yīng)用程序更易于維護(hù)、更新和升級(jí)。繼承和封裝使得應(yīng)用程序的修改帶來的影響更加局部化。
?
轉(zhuǎn)載于:https://www.cnblogs.com/yimengxianzhi/p/7802021.html
總結(jié)
以上是生活随笔為你收集整理的初学者的困惑:OOP与一般编程的区别的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 多线程并发快速处理数据
- 下一篇: 修改Tomcat可支持get传参方式的u