面向?qū)ο缶幊痰囊恍┧伎?/span>
這段時(shí)間一直都在學(xué)習(xí)python,主要目的還是打算學(xué)習(xí)一門互聯(lián)網(wǎng)的編程語言,為后續(xù)的職業(yè)生涯做一些規(guī)劃,畢竟java在互聯(lián)網(wǎng)除了電商領(lǐng)域有叫廣泛的使用場景之外,在互聯(lián)網(wǎng)其他領(lǐng)域還不是很普及,并且java太重量級了。而python在相對來說輕量級并且易于使用,很適合互聯(lián)網(wǎng)產(chǎn)品快速迭代開發(fā)方式。
個(gè)人之前接觸的唯一一個(gè)純面向?qū)ο缶幊陶Z言就是java,以至于很長一段時(shí)間內(nèi),我都以為面向?qū)ο缶幊痰哪P蛻?yīng)該都是以java這樣為基礎(chǔ)的,直到看了javasript和python等以函數(shù)式編程為主,支持面向?qū)ο缶幊痰恼Z言,才更深的了解面向?qū)ο蟮木幊瘫举|(zhì)。
什么是對象,對于對象的理解,我感覺就是具有某些特性的物質(zhì),比如說狗。而面向?qū)ο缶幊套畲蟮奶攸c(diǎn)就是 把 對象的屬性和它相關(guān)的行為進(jìn)行封裝,比如狗的品種就是狗的屬性,但是狗叫就是狗的行為。我們把這兩個(gè)特性封裝到一個(gè)具體的對象里面,就構(gòu)成了面向?qū)ο蟮木幊痰幕A(chǔ)。如果把對象的屬性稱作數(shù)據(jù),對象的行為成為函數(shù),那么數(shù)據(jù)就構(gòu)成了對象的狀態(tài),同一個(gè)對象中的數(shù)據(jù)可以有很多不同的版本,數(shù)據(jù)是變化的,函數(shù)是不變的,只不過這個(gè)函數(shù)就是屬于這個(gè)對象的。
但是對象的行為一定非要和對象綁定嗎?是不是可以脫離對象而獨(dú)立存在了。比如我們說狗叫,那么叫這個(gè)動作,一定非要和狗綁定嗎,是不是也可以和人綁定的?還有就是比較兩個(gè)數(shù)的大小,這個(gè)行為的對象是誰 ? 通過這些思考我們發(fā)現(xiàn),很多時(shí)候行為和可以獨(dú)立對象獨(dú)立存在的,這些獨(dú)立存在的行為不屬于任何對象,或者我們并不需要關(guān)心他屬于誰,只需要關(guān)注他的目的是什么即可。
以上兩個(gè)問題在java里面都反映的比較明顯,static關(guān)鍵字用來表明這個(gè)行為不和任何對象綁定,比如public static void main ,這個(gè)main方法就不屬于定義它的class所對應(yīng)的對象。還有java里面的Math類,這個(gè)類里面的方法都是public static的,說明這些方法都不屬于任何對象。而java是純面向?qū)ο蟮模荒馨堰@些不屬于任何具體對象的定義為static,而其對應(yīng)的class類,感覺給他定義了一個(gè)命名空間而已。
python中的面向?qū)ο蟮脑O(shè)計(jì)感覺比java要復(fù)雜,但是通過和java面向?qū)ο蟮脑O(shè)計(jì)相比,能夠讓你更深入的了解面向?qū)ο缶幊痰暮诵摹ython中 class如果定義對對象的行為,第一個(gè)參數(shù)比如為self。當(dāng)初自己對這個(gè)設(shè)計(jì)理解很不理解,為什么弄的這么復(fù)雜,后來想想面向?qū)ο笏枷胧鞘裁矗蝗痪兔靼琢耍@個(gè)self就是數(shù)據(jù),方法就是行為,這個(gè)行為要和某個(gè)對象綁定,只不過java里面幫助我們省去了這個(gè)過程,通過創(chuàng)建對象的語法new XXXClass 自動進(jìn)行綁定。java是靜態(tài)的,一旦方法和數(shù)據(jù)進(jìn)行綁定,這個(gè)綁定關(guān)系就不會發(fā)生改變,但是python綁定關(guān)系就可以進(jìn)行改變。如果方法參數(shù)中沒有self,那么這個(gè)方法就和java里面的static方法類似,表示這個(gè)方法屬于某一個(gè)類,不屬于某個(gè)對象。
而javascript面向?qū)ο笤O(shè)計(jì)就是更有意思了,構(gòu)造函數(shù)本身就是一個(gè)function,通過function.apply方法和具體的對象進(jìn)行綁定,在javascript中用this來表示function所綁定的對象。
而在scala中,對象的方法和class 對應(yīng)的static方法就完全分開了。更確切的說,class對應(yīng)的static方法,就不屬于這個(gè)class,所以scala定義了object 這個(gè)概念。所有class中定義的方法都屬于對象的行為,而之前java中所有class static方法,都屬于object。兩者在語法上都已經(jīng)明確區(qū)分了。個(gè)人感覺這個(gè)明顯比java,python,javascript 對static方法的支持簡潔明了的多。
對于面向?qū)ο蟮脑O(shè)計(jì),不同的語言雖然不同,但是其核心思想還是相似的。但是由于編程語言所支持的編程范式不一樣,實(shí)現(xiàn)方式差別還是比較大的。通過學(xué)習(xí)多范式編程語言,能夠加深對這種編程范式的理解。
14年互聯(lián)網(wǎng)技術(shù)、產(chǎn)品、運(yùn)營經(jīng)驗(yàn),前支付寶技術(shù)專家,互金創(chuàng)業(yè)公司CTO,大令保事業(yè)部總經(jīng)理。
在互金領(lǐng)域有比較強(qiáng)的產(chǎn)品以及運(yùn)營經(jīng)驗(yàn),尤其擅長用戶增長、轉(zhuǎn)化、運(yùn)營上的經(jīng)驗(yàn),兼具技術(shù)、產(chǎn)品、運(yùn)營思維。
目前是云貓?jiān)鲩L實(shí)驗(yàn)室 創(chuàng)始人
團(tuán)隊(duì)成員來自阿里等國內(nèi)知名互聯(lián)網(wǎng)公司,曾在互聯(lián)網(wǎng)金融、互聯(lián)網(wǎng)保險(xiǎn)、企業(yè)級SaaS等項(xiàng)目中負(fù)責(zé)用戶增長,團(tuán)隊(duì)管理的工作,擁有豐富的一線流量增長經(jīng)驗(yàn)與實(shí)操手段。
歡迎關(guān)注我們,用技術(shù)驅(qū)動增長
浙公網(wǎng)安備 33010602011771號