概述
OOP(Object-oriented Programming苏遥,面向?qū)ο蟮某绦蛟O(shè)計(jì))是一種計(jì)算機(jī)編程架構(gòu)赡模。OOP的一條基本原則是計(jì)算機(jī)程序由單個(gè)能夠起到子程序作用的單元或?qū)ο蠼M合而成。
OOP達(dá)到了軟件工程的三個(gè)主要目標(biāo):重用性教硫、靈活性和擴(kuò)展性辆布。
OOP=對(duì)象+類+繼承+多態(tài)+消息,其中核心概念是類和對(duì)象景用。
面向?qū)ο蟪绦蛟O(shè)計(jì)方法是盡可能模擬人類的思維方式,使得軟件的開發(fā)方法與過程盡可能接近人類認(rèn)識(shí)世界伞插、解決現(xiàn)實(shí)問題的方法和過程,也即使得描述問題的問題空間與問題的解決方案空間在結(jié)構(gòu)上盡可能一致媚污,把客觀世界中的實(shí)體抽象為問題域中的對(duì)象。
面向?qū)ο蟪绦蛟O(shè)計(jì)以對(duì)象為核心氢伟,該方法認(rèn)為程序由一系列對(duì)象組成幽歼。類是對(duì)現(xiàn)實(shí)世界的抽象,包括表示靜態(tài)屬性的數(shù)據(jù)和對(duì)數(shù)據(jù)的操作诚些,對(duì)象是類的實(shí)例化皇型。對(duì)象間通過消息傳遞相互通信,來模擬現(xiàn)實(shí)世界中不同實(shí)體間的聯(lián)系弃鸦。在面向?qū)ο蟮某绦蛟O(shè)計(jì)中,對(duì)象是組成程序的基本模塊家破。
三個(gè)特性
封裝
封裝是指將現(xiàn)實(shí)世界中存在的某個(gè)客體的屬性與行為綁定在一起购岗,并放置在一個(gè)邏輯單元內(nèi)。該邏輯單元負(fù)責(zé)將所描述的屬性隱藏起來烹困,外界對(duì)客體內(nèi)部屬性的所有訪問只能通過提供的用戶接口實(shí)現(xiàn)。
這樣做既可以實(shí)現(xiàn)對(duì)客體屬性的保護(hù)作用乾吻,又可以提高軟件系統(tǒng)的可維護(hù)性。
只要用戶接口不改變溶弟,任何封裝體內(nèi)部的改變都不會(huì)對(duì)軟件系統(tǒng)的其他部分造成影響瞭郑。
結(jié)構(gòu)化設(shè)計(jì)方法沒有做到客體的整體封裝,只是封裝了各個(gè)功能模塊屈张,而每個(gè)功能模塊可以隨意地對(duì)沒有保護(hù)能力客體屬性實(shí)施操作袱巨,并且由于描述屬性的數(shù)據(jù)與行為被分割開來愉老,所以一旦某個(gè)客體屬性的表達(dá)方式發(fā)生了變化剖效,或某個(gè)行為效果發(fā)生了改變,就有可能對(duì)整個(gè)系統(tǒng)產(chǎn)生影響璧尸。
在面向?qū)ο蠹夹g(shù)的相關(guān)原理以及程序語言中,封裝的最基本單位是對(duì)象垫竞,而使得軟件結(jié)構(gòu)的相關(guān)部件的實(shí)現(xiàn)“高內(nèi)聚蛀序、低耦合”的“最佳狀態(tài)”便是面向?qū)ο蠹夹g(shù)的封裝性所需要實(shí)現(xiàn)的最基本的目標(biāo)。
對(duì)于用戶來說遣鼓,對(duì)象是如何對(duì)各種行為進(jìn)行操作重贺、運(yùn)行、實(shí)現(xiàn)等細(xì)節(jié)是不需要刨根問底了解清楚的檬姥,用戶只需要通過封裝外的通道對(duì)計(jì)算機(jī)進(jìn)行相關(guān)方面的操作即可。大大地簡化了操作的步驟抒巢,使用戶使用起計(jì)算機(jī)來更加高效秉犹、更加得心應(yīng)手。
繼承
繼承性是子類自動(dòng)共享父類數(shù)據(jù)結(jié)構(gòu)和方法的機(jī)制崇堵,這是類之間的一種關(guān)系。在定義和實(shí)現(xiàn)一個(gè)類的時(shí)候狰贯,可以在一個(gè)已經(jīng)存在的類的基礎(chǔ)之上來進(jìn)行,把這個(gè)已經(jīng)存在的類所定義的內(nèi)容作為自己的內(nèi)容傍妒,并加入若干新的內(nèi)容摸柄。
如果按照繼承源進(jìn)行劃分,則可以分為單繼承(一個(gè)對(duì)象僅僅從另外一個(gè)對(duì)象中繼承其相應(yīng)的特點(diǎn))與多繼承(一個(gè)對(duì)象可以同時(shí)從另外兩個(gè)或者兩個(gè)以上的對(duì)象中繼承所需要的特點(diǎn)與能力驱负,并且不會(huì)發(fā)生沖突等現(xiàn)象);如果從繼承中包含的內(nèi)容進(jìn)行劃分踏揣,則繼承可以分為四類匾乓,分別為取代繼承(一個(gè)對(duì)象在繼承另一個(gè)對(duì)象的能力與特點(diǎn)之后將父對(duì)象進(jìn)行取代)、包含繼承(一個(gè)對(duì)象在將另一個(gè)對(duì)象的能力與特點(diǎn)進(jìn)行完全的繼承之后娱局,又繼承了其他對(duì)象所包含的相應(yīng)內(nèi)容,結(jié)果導(dǎo)致這個(gè)對(duì)象所具有的能力與特點(diǎn)大于等于父對(duì)象衰齐,實(shí)現(xiàn)了對(duì)于父對(duì)象的包含)继阻、受限繼承、特化繼承抹缕。
多態(tài)
多態(tài)性是指相同的操作或函數(shù)墨辛、過程可作用于多種類型的對(duì)象上并獲得不同的結(jié)果。不同的對(duì)象睹簇,收到同一消息可以產(chǎn)生不同的結(jié)果,這種現(xiàn)象稱為多態(tài)性磨淌。
多態(tài)性允許每個(gè)對(duì)象以適合自身的方式去響應(yīng)共同的消息凿渊。
從微觀的角度來講缚柳,多態(tài)性是指在一組對(duì)象的一個(gè)類中敛纲,面向?qū)ο蠹夹g(shù)可以使用相同的調(diào)用方式來對(duì)相同的函數(shù)名進(jìn)行調(diào)用淤翔,即便這若干個(gè)具有相同函數(shù)名的函數(shù)所表示的函數(shù)是不同的佩谷。
優(yōu)點(diǎn)
易維護(hù)、易復(fù)用谐檀、易擴(kuò)展,由于面向?qū)ο笥蟹庋b麦撵、繼承溃肪、多態(tài)性的特性,可以設(shè)計(jì)出低耦合的系統(tǒng)惫撰,使系統(tǒng) 更加靈活、更加易于維護(hù)扼雏。
比較面向?qū)ο蟪绦蛟O(shè)計(jì)和面向過程程序設(shè)計(jì)夯膀,面向?qū)ο蟪绦蛟O(shè)計(jì)的優(yōu)點(diǎn):
- 數(shù)據(jù)抽象的概念可以在保持外部接口不變的情況下改變內(nèi)部實(shí)現(xiàn),從而減少甚至避免對(duì)外界的干擾诱建;
- 通過繼承大幅減少冗余的代碼,并可以方便地?cái)U(kuò)展現(xiàn)有代碼励翼,提高編碼效率辜荠,也減低了出錯(cuò)概率,降低軟件維護(hù)的難度造烁;
- 結(jié)合面向?qū)ο蠓治龇窆⒚嫦驅(qū)ο笤O(shè)計(jì)苗桂,允許將問題域中的對(duì)象直接映射到程序中告组,減少軟件開發(fā)過程中中間環(huán)節(jié)的轉(zhuǎn)換過程;
- 通過對(duì)對(duì)象的辨別木缝、劃分可以將軟件系統(tǒng)分割為若干相對(duì)為獨(dú)立的部分,在一定程度上更便于控制軟件復(fù)雜度放案;
- 以對(duì)象為中心的設(shè)計(jì)可以幫助開發(fā)人員從靜態(tài)(屬性)和動(dòng)態(tài)(方法)兩個(gè)方面把握問題矫俺,從而更好地實(shí)現(xiàn)系統(tǒng);
- 通過對(duì)象的聚合考婴、聯(lián)合可以在保證封裝與抽象的原則下實(shí)現(xiàn)對(duì)象在內(nèi)在結(jié)構(gòu)以及外在功能上的擴(kuò)充催烘,從而實(shí)現(xiàn)對(duì)象由低到高的升級(jí)。
缺點(diǎn)
- 運(yùn)行效率較低
類的大量加載會(huì)犧牲系統(tǒng)性能伊群,降低運(yùn)行速度。雖然CPU速度在提高崇棠,內(nèi)存容量在增加丸卷,但這一問題仍會(huì)隨著系統(tǒng)規(guī)模變大而逐漸顯示出來,變得越發(fā)嚴(yán)重谜嫉。 - 類庫龐大
由于類庫都過于龐大,程序員對(duì)它們的掌握需要一段時(shí)間哆档,從普及住闯、推廣的角度來看澳淑,類庫應(yīng)在保證其功能完備的基礎(chǔ)上進(jìn)行相應(yīng)的縮減插佛。 - 類庫可靠性
越龐大的系統(tǒng)必會(huì)存在我們無法預(yù)知的問題隱患,程序員無法完全保證類庫中的每個(gè)類在各種環(huán)境中百分之百的正確氢拥,當(dāng)使用的類發(fā)生了問題,就會(huì)影響后續(xù)工作兄一,程序員也有可能推翻原來的全部工作识腿。