1.到底什么是面向?qū)ο缶幊毯兔嫦驅(qū)ο缶幊陶Z(yǔ)言?
面向?qū)ο缶幊蹋?code>OOP)的全稱是 Object Oriented Programming
。
面向?qū)ο缶幊陶Z(yǔ)言(OOPL
)的全稱是 Object Oriented Programming Language
。
面向?qū)ο缶幊讨杏袃蓚€(gè)非常重要的概念,就是類(Class
)和對(duì)象(Object
)。面向?qū)ο缶幊踢@個(gè)概念第一次使用是在SmallTalk
這種編程語(yǔ)言中,它也被認(rèn)為是第一個(gè)真正意義上的面向?qū)ο缶幊陶Z(yǔ)言。后來(lái)C++
帶動(dòng)了面向?qū)ο缶幊痰牧鞒獭5浇裉?,如果不按照?yán)格的定義來(lái)說(shuō),大部分編程語(yǔ)言都是面向?qū)ο缶幊陶Z(yǔ)言,比如Java
、C++
、Go
、Python
、JavaScript
等等。
那么到底什么是面向?qū)ο缶幊??什么語(yǔ)言才算是面向?qū)ο缶幊陶Z(yǔ)言呢?
- 面向?qū)ο缶幊?/strong>是一種編程范式或編程風(fēng)格。它以類或?qū)ο笞鳛榻M織代碼的基本單元,并將封裝、抽象、繼承、多態(tài)四個(gè)特性,作為代碼設(shè)計(jì)和實(shí)現(xiàn)的基石。
- 面向?qū)ο缶幊陶Z(yǔ)言是支持類或?qū)ο蟮恼Z(yǔ)法機(jī)制,能方便地實(shí)現(xiàn)面向?qū)ο缶幊趟拇筇匦裕ǚ庋b、抽象、繼承、多態(tài))的編程語(yǔ)言。
一般來(lái)說(shuō),面向?qū)ο缶幊潭际峭ㄟ^(guò)面向?qū)ο缶幊陶Z(yǔ)言來(lái)進(jìn)行的,但是,不用面向?qū)ο缶幊陶Z(yǔ)言也可以進(jìn)行面向?qū)ο缶幊獭7粗?,即使我們使用面向?qū)ο缶幊陶Z(yǔ)言,寫出來(lái)的代碼也不一定是面向?qū)ο缶幊田L(fēng)格的,也有可能是面向過(guò)程編程風(fēng)格的。
2.如何判定某編程語(yǔ)言是否是面向?qū)ο缶幊陶Z(yǔ)言?
在上面剛剛的講解中,提到“如果不按照嚴(yán)格的定義來(lái)說(shuō),大部分編程語(yǔ)言都是面向?qū)ο缶幊陶Z(yǔ)言”。為什么要加上“如果不按照嚴(yán)格的定義”這個(gè)前提呢?
這是因?yàn)槿绻麌?yán)格按照面向編程語(yǔ)言的定義,前面提到的有些編程語(yǔ)言并不是嚴(yán)格意義上的面向?qū)ο缶幊陶Z(yǔ)言。比如 JavaScript
,它不支持封裝和繼承特性。
實(shí)際上,面向?qū)ο缶幊虖淖置嫔?,按照最?jiǎn)單、最原始的方式來(lái)理解,就是將類或?qū)ο笞顬榇a組織的基本單元,來(lái)進(jìn)行編碼的一種編程范式或者編程風(fēng)格,并不一定需要封裝、抽象、繼承、多態(tài)這四大特性的支持。但是,在進(jìn)行面向?qū)ο缶幊痰倪^(guò)程中,人們不停地總結(jié)發(fā)現(xiàn),有了這四大特性,我們就能更容易地實(shí)現(xiàn)各種面向?qū)ο蟮拇a設(shè)計(jì)思路。
例如,在面向?qū)ο缶幊痰倪^(guò)程中,經(jīng)常會(huì)遇到
is-a
這種類關(guān)系(比如狗是一種動(dòng)物),而繼承這個(gè)特性就能很好的支持這種is-a
的代碼設(shè)計(jì)思路,并且解決代碼復(fù)用的問(wèn)題。但是隨著編程語(yǔ)言的不斷迭代、演進(jìn),人們發(fā)現(xiàn)繼承這種特性容易造成層次不清、代碼混亂,所以很多編程語(yǔ)言在設(shè)計(jì)時(shí)就摒棄了繼承特性,比如Go
。但是,我們不能因?yàn)樗饤壛死^承特性,就一刀切地認(rèn)為它不是面向?qū)ο缶幊陶Z(yǔ)言了。
個(gè)人覺(jué)得,只要某種編程語(yǔ)言支持類或?qū)ο蟮恼Z(yǔ)法概念,并且以此作為組織代碼的基本單元,那就可以被粗略地認(rèn)為它就是要面向?qū)ο缶幊陶Z(yǔ)言了,至于是否完全地支持了面向?qū)ο缶幊痰乃拇筇匦浴⑹欠駥?duì)四大特性有所取舍,可以不作為判定的標(biāo)準(zhǔn)?;诖耍庞辛饲懊娴恼f(shuō)法:“不按照嚴(yán)格定義來(lái)說(shuō),現(xiàn)在流行的大部分編程語(yǔ)言都是面向?qū)ο缶幊陶Z(yǔ)言。但是按照嚴(yán)格的定義,很多語(yǔ)言都不能算得上面向?qū)ο缶幊陶Z(yǔ)言”。
3.什么是面向?qū)ο蠓治龊兔嫦驅(qū)ο笤O(shè)計(jì)?
和面向?qū)ο缶幊探?jīng)常放到一起講的,還有面向?qū)ο蠓治觯?code>OOA)和面向?qū)ο笤O(shè)計(jì)(OOD
)。OOA
、OOD
、OOP
三個(gè)連在一起就是面向?qū)ο蠓治?、設(shè)計(jì)、編程(實(shí)現(xiàn)),正好是面向?qū)ο筌浖_(kāi)發(fā)要經(jīng)歷的三個(gè)階段。
面向?qū)ο蠓治龊兔嫦驅(qū)ο笤O(shè)計(jì)中的“分析”和“設(shè)計(jì)”這兩個(gè)詞,完全可以從字面上去理解,不需要過(guò)度解讀。之所以在前面加上“面向?qū)ο蟆边@幾個(gè)字,是因?yàn)槲覀兪菄@著對(duì)象來(lái)做需求分析和設(shè)計(jì)的。分析和設(shè)計(jì)兩個(gè)階段的產(chǎn)出是類的設(shè)計(jì),包括程序被拆解為哪些類,每個(gè)類有哪些屬性方法,類與類之間如何交互等等。
面向?qū)ο蠓治鼍褪?要搞清楚做什么,面向?qū)ο笤O(shè)計(jì)就是要搞清楚怎么做,面向?qū)ο缶幊叹褪菍⒎治龊驮O(shè)計(jì)的結(jié)果翻譯成代碼的過(guò)程。
4.什么是 UML?是否需要 UML?
降到面向?qū)ο蠓治?、設(shè)計(jì)、編程,那就不得不提到 UML
(Unified Model Language),統(tǒng)一建模語(yǔ)言。很多書籍中,常用它來(lái)畫圖表達(dá)面向?qū)ο蠡蛟O(shè)計(jì)模式的設(shè)計(jì)思路。
實(shí)際上,UML 是一種非常復(fù)雜的東西。它不僅僅包含類圖,還包括用例圖、順序圖、活動(dòng)圖、狀態(tài)圖、組件圖等等。即使使用類圖的學(xué)習(xí)成本也是很高的,比如說(shuō)類之間的關(guān)系,UML就定義了很多種,比如泛華、實(shí)現(xiàn)、關(guān)聯(lián)、聚合、組合、依賴等。
要完全掌握,并且熟練運(yùn)用這些類之間的關(guān)系,來(lái)畫 UML 類圖,肯定要花很多的學(xué)習(xí)經(jīng)理,而且即使你按照 UML 畫出類圖,可對(duì)于不熟悉的人來(lái)說(shuō),看懂的成本還是很高的。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-834997.html
一般在互聯(lián)網(wǎng)公司的項(xiàng)目開(kāi)發(fā)中,UML 用處可能不大。為了文檔化軟件設(shè)計(jì)或者方便討論軟件設(shè)計(jì),大部分情況下會(huì)畫一個(gè)不是那么規(guī)范的草圖,能夠達(dá)意,方便溝通就夠了。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-834997.html
到了這里,關(guān)于設(shè)計(jì)模式學(xué)習(xí)筆記 - 面向?qū)ο?- 1.面向?qū)ο蟮降子懻摰氖鞘裁吹奈恼戮徒榻B完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!