面向?qū)ο缶幊?OOP

????面向?qū)ο缶幊淌且环N編程范式或編程風格。它以類或?qū)ο笞鳛榻M織代碼的基本單元,并將封裝、抽象、繼承、多態(tài)四個特性,作為代碼設計和實現(xiàn)的基石 。

? ??封裝也叫作?信息隱藏?或者?數(shù)據(jù)訪問保護。類通過暴露有限的訪問接口,授權(quán)外部僅能通過類提供的方式來訪問內(nèi)部信息或者數(shù)據(jù)。它需要編程語言提供權(quán)限訪問控制語法來支持,例如 Java 中的 private、protected、public 關(guān)鍵字。封裝特性存在的意義,一方面是保護數(shù)據(jù)不被隨意修改,提高代碼的可維護性;另一方面是僅暴露有限的必要接口,提高類的易用性。

? ??封裝主要講如何隱藏信息、保護數(shù)據(jù),那抽象就是講如何隱藏方法的具體實現(xiàn),讓使用者只需要關(guān)心方法提供了哪些功能,不需要知道這些功能是如何實現(xiàn)的。抽象可以通過接口類或者抽象類來實現(xiàn),但也并不需要特殊的語法機制來支持。抽象存在的意義,一方面是提高代碼的可擴展性、維護性,修改實現(xiàn)不需要改變定義,減少代碼的改動范圍;另一方面,它也是處理復雜系統(tǒng)的有效手段,能有效地過濾掉不必要關(guān)注的信息。

????繼承是用來表示類之間的 is-a 關(guān)系,分為兩種模式:單繼承和多繼承。單繼承表示一個子類只繼承一個父類,多繼承表示一個子類可以繼承多個父類。為了實現(xiàn)繼承這個特性,編程語言需要提供特殊的語法機制來支持。繼承主要是用來解決代碼復用的問題。

? ??多態(tài)是指子類可以替換父類,在實際的代碼運行過程中,調(diào)用子類的方法實現(xiàn)。多態(tài)這種特性也需要編程語言提供特殊的語法機制來實現(xiàn),比如繼承、接口類、duck-typing。多態(tài)可以提高代碼的擴展性和復用性,是很多設計模式、設計原則、編程技巧的代碼實現(xiàn)基礎(chǔ)。

????簡單點講,面向?qū)ο蠓治?/b>就是要搞清楚做什么,面向?qū)ο笤O計就是要搞清楚怎么做。兩個階段最終的產(chǎn)出是類的設計,包括程序被拆解為哪些類,每個類有哪些屬性方法、類與類之間如何交互等等。

面向?qū)ο缶幊痰膬?yōu)勢

? ? 除了面向?qū)ο缶幊?還有 面向過程編程函數(shù)式編程。

? ??面向過程編程 也是一種編程范式或編程風格。它以過程(可以為理解方法、函數(shù)、操作)作為組織代碼的基本單元,以數(shù)據(jù)(可以理解為成員變量、屬性)與方法相分離為最主要的特點。面向過程風格是一種流程化的編程風格,通過拼接一組順序執(zhí)行的方法來操作數(shù)據(jù)完成一項功能。

? ? 面向?qū)ο缶幊?比 面向過程編程的優(yōu)勢

? ? ? ? 1.?OOP 更加能夠應對大規(guī)模復雜程序的開發(fā)

? ? ? ? ? ? 面向?qū)ο缶幊淌且?b>類為思考對象。在進行面向?qū)ο缶幊痰臅r候,我們并不是一上來就去思考,如何將復雜的流程拆解為一個一個方法,而是采用曲線救國的策略,先去思考如何給業(yè)務建模,如何將需求翻譯為類,如何給類之間建立交互關(guān)系,而完成這些工作完全不需要考慮錯綜復雜的處理流程。當我們有了類的設計之后,然后再像搭積木一樣,按照處理流程,將類組裝起來形成整個程序。這種開發(fā)模式、思考問題的方式,能讓我們在應對復雜程序開發(fā)的時候,思路更加清晰。

? ??????????除此之外,面向?qū)ο缶幊踢€提供了一種更加清晰的、更加模塊化的代碼組織方式。比如,我們開發(fā)一個電商交易系統(tǒng),業(yè)務邏輯復雜,代碼量很大,可能要定義數(shù)百個函數(shù)、數(shù)百個數(shù)據(jù)結(jié)構(gòu),那如何分門別類地組織這些函數(shù)和數(shù)據(jù)結(jié)構(gòu),才能不至于看起來比較凌亂呢?類就是一種非常好的組織這些函數(shù)和數(shù)據(jù)結(jié)構(gòu)的方式,是一種將代碼模塊化的有效手段。

? ??????2.OOP 風格的代碼更易復用、易擴展、易維護

? ??????????首先,我們先來看下封裝特性。面向?qū)ο缶幊掏ㄟ^類這種組織代碼的方式,將數(shù)據(jù)和方法綁定在一起,通過訪問權(quán)限控制,只允許外部調(diào)用者通過類暴露的有限方法訪問數(shù)據(jù),而不會像面向過程編程那樣,數(shù)據(jù)可以被任意方法隨意修改。因此,面向?qū)ο缶幊烫峁┑姆庋b特性更有利于提高代碼的易維護性。

? ??????????其次,我們再來看下抽象特性。我們知道,函數(shù)本身就是一種抽象,它隱藏了具體的實現(xiàn)。我們在使用函數(shù)的時候,只需要了解函數(shù)具有什么功能,而不需要了解它是怎么實現(xiàn)的。從這一點上,不管面向過程編程還是是面向?qū)ο缶幊蹋贾С殖橄筇匦?。不過,面向?qū)ο缶幊踢€提供了其他抽象特性的實現(xiàn)方式。這些實現(xiàn)方式是面向過程編程所不具備的,比如基于接口實現(xiàn)的抽象。基于接口的抽象,可以讓我們在不改變原有實現(xiàn)的情況下,輕松替換新的實現(xiàn)邏輯,提高了代碼的可擴展性。

? ??????????再次,我們來看下繼承特性。繼承特性是面向?qū)ο缶幊滔啾扔诿嫦蜻^程編程所特有的兩個特性之一(另一個是多態(tài))。如果兩個類有一些相同的屬性和方法,我們就可以將這些相同的代碼,抽取到父類中,讓兩個子類繼承父類。這樣兩個子類也就可以重用父類中的代碼,避免了代碼重復寫多遍,提高了代碼的復用性。

? ??????????最后,我們來看下多態(tài)特性?;谶@個特性,我們在需要修改一個功能實現(xiàn)的時候,可以通過實現(xiàn)一個新的子類的方式,在子類中重寫原來的功能邏輯,用子類替換父類。在實際的代碼運行過程中,調(diào)用子類新的功能邏輯,而不是在原有代碼上做修改。這就遵從了“對修改關(guān)閉、對擴展開放”的設計原則,提高代碼的擴展性。除此之外,利用多態(tài)特性,不同的類對象可以傳遞給相同的方法,執(zhí)行不同的代碼邏輯,提高了代碼的復用性。

? ??????3.OOP 語言更加人性化、更加高級、更加智能

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容