初學(xué)一門新的編程語(yǔ)言時(shí),我們總會(huì)先遇到某種語(yǔ)言的基礎(chǔ)語(yǔ)法、基礎(chǔ)類型、變量聲明與條件控制語(yǔ)句等等。旅程的開始往往盡是對(duì)著面向過程代碼的有樣學(xué)樣。
一路學(xué)習(xí),披荊斬棘,了解了一些語(yǔ)言的高級(jí)用法與套路,卻還是感覺難以理解其精髓;甚至?xí)行┟曰笈c困擾:
1.面對(duì)紛繁復(fù)雜的業(yè)務(wù)場(chǎng)景,繁復(fù)多變需求更迭,怎么樣才能提高效率。
2.在經(jīng)歷了大量的近乎重復(fù)的業(yè)務(wù)代碼的洗禮后,我們?cè)趺床拍?,逐步搭建適合自己業(yè)務(wù)場(chǎng)景的框架工具。
要解決問題,我們需要在開發(fā)模式上多做思考。在面向?qū)ο蟪霈F(xiàn)以前,結(jié)構(gòu)化程序設(shè)計(jì)是程序設(shè)計(jì)的主流,結(jié)構(gòu)化程序設(shè)計(jì)又稱為面向過程的程序設(shè)計(jì)。問題被看作一系列需要按照指定步驟完成的任務(wù),但是逐漸的,我們注意到程序?qū)嵺`中,對(duì)代碼的易維護(hù)、可擴(kuò)展、高復(fù)用的呼聲逐漸增加。我們也會(huì)了解到某些問題在我們周圍不斷重復(fù)發(fā)生,而該問題的解決方案的核心,也被總結(jié)成了很多成型的方法,靈活使用便能夠避免大量的重復(fù)勞動(dòng)。
現(xiàn)在咱們來(lái)談一談面向?qū)ο蟮某绦蛟O(shè)計(jì)理論與原則。
面向?qū)ο蟪绦蛟O(shè)計(jì) (Object Oriented Programming) 本質(zhì)上是以建立模型體現(xiàn)出的抽象思維方式和面向?qū)ο蟮膶?shí)踐方法。模型是用來(lái)反映編程實(shí)踐中涉及到的事物特征和可預(yù)測(cè)的變化行為的一種抽象;通過這種抽象的思維方式與對(duì)應(yīng)的實(shí)踐方法來(lái)更好的統(tǒng)籌開發(fā)工作中遇到的具體問題。
而面向?qū)ο蟪绦蛟O(shè)計(jì)也可以說是一種編程架構(gòu)。其中的基本原則是程序由單個(gè)能夠起到子程序作用的單元或?qū)ο蠼M合而成的。從而達(dá)到對(duì)程序 重用性、靈活性和擴(kuò)展性的要求。面向?qū)ο缶幊贪藢?duì)象、類、繼承、多態(tài)、消息等等。
通過建立模型可以將編程涉及到的事物,轉(zhuǎn)化為編程系統(tǒng)中抽象的代表一些特點(diǎn)與行事方法的集合。面向?qū)ο蟪绦蛟O(shè)計(jì)方法是模擬人類的思維方式,使得軟件的開發(fā)方法與過程接近人類認(rèn)識(shí)世界、解決現(xiàn)實(shí)問題的方法和過程。
面向?qū)ο蟪绦蛟O(shè)計(jì)以對(duì)象為核心,認(rèn)為程序由一系列對(duì)象組成。類是對(duì)現(xiàn)實(shí)世界的抽象,包括表示靜態(tài)屬性的數(shù)據(jù)和對(duì)數(shù)據(jù)的操作方法,對(duì)象是類的實(shí)例化。對(duì)象間通過消息傳遞相互通信,來(lái)模擬現(xiàn)實(shí)世界中不同實(shí)體間的聯(lián)系。在面向?qū)ο蟮某绦蛟O(shè)計(jì)中,對(duì)象是組成程序的基本模塊。
面向?qū)ο缶幊痰幕咎攸c(diǎn):
1.封裝性:
封裝是指描述對(duì)象的屬性以及其行為的程序代碼組裝到一起,把它們封裝在一個(gè)類中,為軟件結(jié)構(gòu)的模塊性提供基礎(chǔ)。封裝的最基本單位是對(duì)象,而使得軟件結(jié)構(gòu)的相關(guān)部件的實(shí)現(xiàn)“高內(nèi)聚、低耦合”的“最佳狀態(tài)”便是面向?qū)ο蠹夹g(shù)的封裝性所需要實(shí)現(xiàn)的最基本目標(biāo)。
2.繼承性
繼承性主要指的是類之間的聯(lián)系與區(qū)別。而在子類可以獲得父類定義好的部分屬性與方法。同時(shí)也可以針對(duì)自己的特性進(jìn)行拓展與擴(kuò)充。
3.多態(tài)性:
多態(tài)性是指在面向?qū)ο蠹夹g(shù)中,當(dāng)不同的對(duì)象同時(shí)接收到同一個(gè)完全相同的消息之后,所表現(xiàn)出來(lái)的動(dòng)作是不相同的,具有多種形態(tài);多態(tài)性是指在一組對(duì)象的一個(gè)類中,面向?qū)ο蠹夹g(shù)可以使用相同的調(diào)用方式來(lái)對(duì)相同的函數(shù)名進(jìn)行調(diào)用,即便這若干個(gè)具有相同函數(shù)名的函數(shù)所表示的函數(shù)是不同的。
面向?qū)ο蠹夹g(shù)在保障進(jìn)行良好的需求設(shè)計(jì)的同時(shí),也盡可能實(shí)現(xiàn)利用低成本來(lái)開發(fā)出高質(zhì)量的應(yīng)用軟件的目標(biāo)。
面向?qū)ο蟪绦蛟O(shè)計(jì)的優(yōu)點(diǎn),可以隔離變化,通過保持接口不變,內(nèi)部的實(shí)現(xiàn)方式不會(huì)導(dǎo)致對(duì)外界的干擾,可以提高代碼的可維護(hù)性;通過將不同模塊進(jìn)行獨(dú)立細(xì)分,可以控制軟件整體復(fù)雜度;
當(dāng)然,面向?qū)ο蟪绦蛟O(shè)計(jì)也存在一些缺陷,當(dāng)類數(shù)量過多,對(duì)象被大量創(chuàng)建時(shí),勢(shì)必會(huì)影響程序運(yùn)行效率;如果將某些功能實(shí)現(xiàn)為大體量類庫(kù)才能提供的功能,對(duì)眾多類代碼的可靠性、類功能的學(xué)習(xí)以及掌握產(chǎn)生挑戰(zhàn)。
面向?qū)ο蟪绦蛟O(shè)計(jì)之后,也存在了新的編程開發(fā)模式。很多人也在看到了它的缺陷之后也都做了其他的嘗試,這些我們以后再做分析。但是需要知道的是,隨著編程實(shí)踐的進(jìn)行,每個(gè)開發(fā)模式都會(huì)有存在的理由和價(jià)值,不斷學(xué)習(xí)靈活使用,才能在不同的場(chǎng)景中提升工作效率。
名詞解釋:
面向?qū)ο蟪绦蛟O(shè)計(jì)中的概念主要包括: 對(duì)象、類、數(shù)據(jù)抽象、繼承、動(dòng)態(tài)綁定、數(shù)據(jù)封裝、多態(tài)性、消息傳遞。通過這些概念面向?qū)ο蟮乃枷氲玫搅司唧w的體現(xiàn)。
對(duì)象
對(duì)象是一個(gè)自包含的實(shí)體,用一組可識(shí)別的特性和行為來(lái)標(biāo)識(shí)。類
類就是具有相同的屬性和功能的對(duì)象的抽象的集合構(gòu)造方法
又叫構(gòu)造函數(shù),是對(duì)類進(jìn)行初始化的方法。封裝 (encapsulation)
第一層意思: 每個(gè)對(duì)象都包含它能進(jìn)行操作所需要的所有信息,良好的封裝可以減少耦合
第二層意思: 將接口與實(shí)現(xiàn)分離的過程。類內(nèi)部的實(shí)現(xiàn)可以自由修改并且具有清晰的對(duì)外接口。繼承:
類之間的關(guān)系,在這種關(guān)系中,一個(gè)類共享了一個(gè)或多個(gè)其他類定義的結(jié)構(gòu)和行為。繼承描述了類之間的“ is a”關(guān)系。子類可以對(duì)基類的行為進(jìn)行擴(kuò)展、覆蓋、重定義。繼承者可以理解為是對(duì)被繼承者的特殊化,因?yàn)樗司邆浔焕^承者的特性外,還具備自己獨(dú)有的個(gè)性。
繼承定義了類如何相互關(guān)聯(lián),共享特性。繼承的工作方式是,定義父類和子類,或者叫做基類和派生類,其中子類繼承父類的所有特性。子類還可以定義新的特性。組合:
即是類之間的關(guān)系也是對(duì)象之間的關(guān)系。在這種關(guān)系中一個(gè)對(duì)象或者類包含了其他的對(duì)象和類。組合描述了 “has a”關(guān)系。多態(tài)
一個(gè)名稱可以表示很多不同類的對(duì)象,這些類和一個(gè)共同超類有關(guān)。因此這個(gè)名稱表示的任何對(duì)象可以以不同的方式響應(yīng)一些共同的操作。多態(tài)表示不同的對(duì)象可以執(zhí)行相同的動(dòng)作,但是要通過它們自己的實(shí)現(xiàn)代碼來(lái)執(zhí)行。 這樣,子類以父類的身份出現(xiàn); 子類在工作時(shí)以自己的方式來(lái)實(shí)現(xiàn);子類以父類的身份出現(xiàn)時(shí),子類特有的屬性和方法不可使用。動(dòng)態(tài)綁定:
也稱動(dòng)態(tài)類型,指的是一個(gè)對(duì)象或者表達(dá)式的類型直到運(yùn)行時(shí)才能確定。通常由編譯器摻入特殊代碼來(lái)實(shí)現(xiàn)。靜態(tài)綁定
也成為靜態(tài)類型,指的是一個(gè)對(duì)象或者表達(dá)式的類型在編譯時(shí)確定。消息傳遞
指的是一個(gè)對(duì)象調(diào)用了另一個(gè)對(duì)象的方法接口
接口是把隱式公共方法和屬性組合起來(lái),以封裝特定功能的一個(gè)集合,一旦類實(shí)現(xiàn)了接口,類就可以支持接口所指定的所有屬性和成員。 一個(gè)類可以支持多個(gè)接口,多個(gè)類也可以支持相同的接口。
接口預(yù)先定義時(shí),還不知道類是否存在,方法如何實(shí)現(xiàn)。泛型 是具有占位符(類型參數(shù))的類、結(jié)構(gòu)、接口和方法,這些占位符是類、結(jié)構(gòu)、接口和方法所存儲(chǔ)或使用的一個(gè)或多個(gè)類型的占位符。泛型集合類可以將類型參數(shù)用作它所存儲(chǔ)的對(duì)象的類型的占位符;類型參數(shù)作為其字段的類型和其方法的參數(shù)類型出現(xiàn)。