為什么要使用面向?qū)ο蟮乃枷雭砜创龁栴}课蔬?
? ? ?1.面向?qū)ο蟾谖覀兛创龁栴}郊尝,它使得我們看待問題變得清晰化。對(duì)于問題我們只需要了解問題所牽扯到的對(duì)象有哪些流昏,它們?cè)谶@個(gè)問題中都有著哪些行為即可况凉。
? ? ? 2.面向?qū)ο笞畲蟮母淖儜?yīng)該是我們看待問題高度發(fā)生改變。在利用面向過程的思想看待問題時(shí)只是關(guān)注程序的變量刁绒,語句,表達(dá)式的合理性知市,關(guān)注代碼塊的功能。而利用面向?qū)ο蟮乃枷脒M(jìn)行設(shè)計(jì)時(shí)娘赴,我們只需關(guān)注對(duì)象與對(duì)象之間關(guān)系跟啤。而具體的實(shí)現(xiàn)細(xì)節(jié)是由對(duì)象的方法來實(shí)現(xiàn)的。但并不是說面向過程就一無是處关顷,對(duì)于對(duì)象里的方法還是要利用面向過程的思想的武福。
面向?qū)ο蟮奶匦?/h2>
? ? ? ?繼承是面向?qū)ο缶幊趟枷胫兄匾囊徊糠帧:?jiǎn)單的講就是從一個(gè)已有的類中派生出新的類捉片。來實(shí)現(xiàn)一些父類沒有的功能。父類允許子類繼承它的方法宗雇,如果父類中有些方法和子類中的方法發(fā)生沖突莹规,子類可以重寫該方法。子類也可以實(shí)現(xiàn)父類的所有功能。對(duì)于基類的設(shè)計(jì)過程欢际,我們應(yīng)該根據(jù)實(shí)際情況包含各種可能性矾兜。比如說有一個(gè)狗的類,任何一個(gè)品種的狗都可以繼承它椅寺,去實(shí)現(xiàn)自己細(xì)節(jié)返帕。但如果要實(shí)現(xiàn)貓的行為方式,顯然狗這個(gè)類就不適合了荆萤,應(yīng)該在往上走,去實(shí)現(xiàn)一個(gè)動(dòng)物的類观腊,就可以繼承這個(gè)類來實(shí)現(xiàn)貓的行為屬性算行。這樣做的目的是使程序具有較高的可擴(kuò)展性。繼承的優(yōu)點(diǎn)是州邢,提高代碼的復(fù)用性,降低工作量骗村。缺點(diǎn)是呀枢,如果父類的大部分功能子類都用不上,那么子類就顯得比較冗余了裙秋。
? ? ? ? 面向過程的實(shí)現(xiàn)過程就是變量在函數(shù)之間的不斷傳遞,使得函數(shù)之間進(jìn)行信息的交流來實(shí)現(xiàn)編程的需要的进宝。這樣的后果就是如果變量在某一函數(shù)中被改變了枷恕,會(huì)導(dǎo)致整個(gè)程序出錯(cuò)。對(duì)于面向?qū)ο髞碚f,信息之間的交流是以對(duì)象做為參數(shù)的灾而,調(diào)用的類只能使用該類的某些功能來實(shí)現(xiàn)自己的功能深胳。里面的信息對(duì)外界來說是不可見的,也無法改變類中的屬性轻庆。因?yàn)轭愔械膶傩源蠖喽际撬接械幕虮Wo(hù)的敛劝。這就體現(xiàn)了封裝性,封裝是將屬性和方法“打包”夸盟,屬性私有化或保護(hù)化,方法公有化桩砰,只能使用該類的方法來使用和改變?cè)擃惖膶傩允筒尽>秃孟袢艘粯樱热绯燥埵且粋€(gè)方法庶溶,那么吃多吃少是自己的事,與別人無關(guān)行疏。別人也不可能改變這個(gè)事實(shí)套像。
? ? ? ? 對(duì)于面向?qū)ο髞碚f,類相當(dāng)于一個(gè)模板货葬,一個(gè)抽象的概念劲够,對(duì)象才是類的實(shí)例化體現(xiàn),即是程序代碼的組成部分征绎。對(duì)于繼承了父類的多個(gè)子類而言磨取,重寫了父類的某些方法柴墩,方法名雖然相同,方法體不同逢净,實(shí)現(xiàn)過程不同歼指,即不同子類的該方法不同。使用父類類型定義的子類對(duì)象胀茵。調(diào)用不同子類的方法挟阻,產(chǎn)生的了不同結(jié)果,這種變化就叫多態(tài)性附鸽。尤其對(duì)于父類是抽象類來說,由于父類中的方法未定義挪拟,不同子類繼承父類后击你,可以重寫父類的方法谎柄。抽象類不能實(shí)例化對(duì)象,只能被繼承朝巫,一般作為基類劈猿。
面相對(duì)象的原則
一.單一原則
? ? ? ?就一個(gè)類來說,類的功能應(yīng)該較為單一一點(diǎn)揪荣,不應(yīng)該是各種功能都包含在一起,這樣不利于代碼的維護(hù)佛舱,容易產(chǎn)生BUG,也破壞了類的本質(zhì)请祖。應(yīng)該是類中的所有方法都為某一功能服務(wù)。但并不是類分的越詳細(xì)越好刷晋,根據(jù)實(shí)際情況而定饮焦。
二.開閉原則
? ? ? ? 對(duì)于一個(gè)類來說兴喂,應(yīng)該是擴(kuò)展是開放的荆姆,修改是關(guān)閉的。隨著人們的對(duì)軟件功能的不斷期待和改變邮破,我們總是避免不了的要在原有的代碼的基礎(chǔ)上進(jìn)行變化仆救,但我們不可能對(duì)原有的代碼進(jìn)行修改,因?yàn)檫@可能使原有出現(xiàn)BUG彤蔽,所以擴(kuò)展是理所當(dāng)然的顿痪。這個(gè)就要通過繼承來實(shí)現(xiàn)了。
三.迪米特原則
? ? ? ? 一個(gè)類應(yīng)該降低對(duì)其它類的耦合度蚁袭,如果避免不了要與其它類產(chǎn)生關(guān)聯(lián)的話,應(yīng)該避免對(duì)其它類的了解卖哎。保持類的封裝性特點(diǎn)删性。如果兩個(gè)類之間耦合度較高的話,一個(gè)類的改變會(huì)影響另一個(gè)類维贺,而面向?qū)ο蟮脑瓌t是程序之間的類應(yīng)該是很少關(guān)聯(lián)的各個(gè)類執(zhí)行自己的功能就好巴帮。
對(duì)象之間的關(guān)系
泛化關(guān)系是對(duì)象之間耦合度最大的一種關(guān)系群发,就是繼承關(guān)系发乔。在JAVA中接口就類似于抽象類,它是方法說明的集合栏尚,子類繼承接口译仗,并實(shí)現(xiàn)接口中的方法,就是實(shí)現(xiàn)關(guān)系纵菌。在程序中,有時(shí)候避免不了的要把某一個(gè)對(duì)象做為參數(shù)笛辟,局部變量序苏,返回值,讓另一個(gè)對(duì)象調(diào)用完成該類的某些功能围来。這就是依賴關(guān)系匈睁。聚合關(guān)系是整體包含局部的概念。例如班級(jí)與學(xué)生之間的關(guān)系航唆。組合關(guān)系是一種強(qiáng)烈的包含關(guān)系佛点。例如學(xué)校和班級(jí)之間的關(guān)系黎比,公司和部門之間的關(guān)系。聚合關(guān)系和組合關(guān)系的區(qū)別就在于阅虫,聚合關(guān)系中的的局部可以獨(dú)立存在,例如這個(gè)班級(jí)被取消了米碰,不能說明班里的學(xué)生就不是學(xué)生了。組合關(guān)系而言吕座,整體的生命周期和局部的生命周期是息息相關(guān)的吴趴,如果整體不存在了,局部肯定不存在了锣枝,例如公司倒閉了,那么它其中的某一個(gè)部門肯定也不會(huì)存在供鸠。
總結(jié)
? ? ? ? 所謂面向?qū)ο缶帉懙某绦蛟赡郑褪峭ㄟ^不同對(duì)象的實(shí)現(xiàn)來實(shí)現(xiàn)整個(gè)功能。重點(diǎn)還是如何合理的設(shè)置對(duì)象泡一,以及對(duì)程序的包容性觅廓,即你要考慮將來可能會(huì)改變某一功能或添加某一功能。對(duì)程序的升級(jí)杈绸。還有就是在滿足程序功能的前提下保持低耦合度。