成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

用費(fèi)曼技巧自學(xué)編程,香不香?

開(kāi)發(fā) 開(kāi)發(fā)工具
“我們家有《大不列顛百科全書(shū)》,我還是小孩子的時(shí)候,父親就常常讓我坐在他腿上,給我讀些《大不列顛百科全書(shū)》。比如說(shuō),我們讀關(guān)于恐龍的部分,書(shū)上可能講雷龍或其他什么龍,書(shū)上會(huì)說(shuō):“這家伙有 25 英尺高,腦袋寬 6 英尺?!?/div>

[[327381]]

引子

有一本講諾貝爾獎(jiǎng)獲得者,物理學(xué)家費(fèi)曼的書(shū),叫做《發(fā)現(xiàn)的樂(lè)趣》,書(shū)中寫(xiě)到一個(gè)費(fèi)曼小時(shí)候的故事:

“我們家有《大不列顛百科全書(shū)》,我還是小孩子的時(shí)候,父親就常常讓我坐在他腿上,給我讀些《大不列顛百科全書(shū)》。比如說(shuō),我們讀關(guān)于恐龍的部分,書(shū)上可能講雷龍或其他什么龍,書(shū)上會(huì)說(shuō):“這家伙有 25 英尺高,腦袋寬 6 英尺。”

這時(shí)父親就停下來(lái),說(shuō):“我們來(lái)看看這句話什么意思。這句話的意思是:假如它站在我們家的前院里,它是那么高,高到足以把頭從窗戶伸進(jìn)來(lái)。不過(guò)呢,它也可能遇到點(diǎn)麻煩,因?yàn)樗哪X袋比窗戶稍微寬了些,要是它伸進(jìn)頭來(lái),會(huì)擠破窗戶。

費(fèi)曼說(shuō):凡是我們讀到的東西,我們都盡量把它轉(zhuǎn)化成某種現(xiàn)實(shí),從這里我學(xué)到一個(gè)本領(lǐng)——凡我所讀的內(nèi)容,我總設(shè)法通過(guò)某種轉(zhuǎn)換,弄明白它究竟什么意思,它到底在說(shuō)什么。

費(fèi)曼技巧

費(fèi)曼技巧,或者說(shuō)費(fèi)曼學(xué)習(xí)法是一種以教促學(xué)的方法,一共有四步(已經(jīng)知道的可以無(wú)視,直接跳過(guò)):

(1) 選擇新概念/新知識(shí), 自己先去學(xué)習(xí)它。

(2) 假裝當(dāng)一個(gè)老師,去教授別人

想象你面對(duì)一群小白,怎么把這個(gè)概念講給他們聽(tīng),讓他們理解呢?

把你講解的思路也寫(xiě)到紙上,如果實(shí)在不想寫(xiě),可以說(shuō)出來(lái)。

非常重要!!!不要讓你的思路停留在大腦中,因?yàn)榇竽X中對(duì)于知識(shí)點(diǎn)之間的關(guān)聯(lián)會(huì)有些想當(dāng)然的、錯(cuò)誤的假設(shè),說(shuō)出來(lái)或者寫(xiě)出來(lái)能找到這些“盲點(diǎn)”!!

(3) 如果你在教授的過(guò)程中遇到了麻煩,卡了殼,返回去學(xué)習(xí)。

重新去看書(shū),搜相關(guān)資料,問(wèn)別人,倒逼自己把這個(gè)概念搞清楚, 然后回到第二步,繼續(xù)給小白講授。

(4) 簡(jiǎn)化你的語(yǔ)言。

目標(biāo)是用你自己的語(yǔ)言,非專(zhuān)業(yè)的詞匯去解釋這個(gè)概念。盡量做到簡(jiǎn)單直白,或者找到比喻來(lái)表達(dá)。

非常簡(jiǎn)單的過(guò)程,對(duì)吧?

實(shí)戰(zhàn)演練

我們來(lái)用個(gè)例子來(lái)演練一下,有請(qǐng)碼農(nóng)翻身頭號(hào)主人公張大胖出場(chǎng)。

張大胖正在學(xué)習(xí)Java,這一天他遇到了一個(gè)新的概念:“動(dòng)態(tài)代理” (注意是學(xué)習(xí)這個(gè)概念,不是具體實(shí)現(xiàn)), 非常抽象,在日常編程中幾乎不會(huì)直接使用,理解起來(lái)有難度。

第一步,自學(xué)

張大胖看了動(dòng)態(tài)代理的介紹,書(shū)上列舉出一堆煩人的代碼來(lái)展示這個(gè)東西是怎么使用的,比如有個(gè)接口(IHelloWorld)及其實(shí)現(xiàn)類(lèi)(HelloWorld), 然后有個(gè)InvocationHandler的實(shí)現(xiàn),最后用Proxy.newProxyInstance(....)創(chuàng)建一個(gè)新的類(lèi)出來(lái),這些都是什么鬼?啰里啰唆的。

第二步,張大胖嘗試教一下小白(當(dāng)然這里的小白至少得懂點(diǎn)兒Java)

張大胖:動(dòng)態(tài)代理嘛,很簡(jiǎn)單,就是給定一個(gè)接口和實(shí)現(xiàn)類(lèi),再加上一個(gè)InvocationHandler , 動(dòng)態(tài)代理這個(gè)技術(shù)可以在運(yùn)行時(shí)創(chuàng)建一個(gè)新的代理類(lèi)出來(lái)。

小白:張老師, 新的代理類(lèi)有什么用?

張大胖:舉個(gè)例子,有個(gè)叫IHelloWorld接口及其實(shí)現(xiàn)類(lèi)HelloWorld,它有一個(gè)叫sayHello()的方法??梢栽趕ayHello()之前和之后,額外加一些日志的輸出。

(在講解一個(gè)概念的時(shí)候,舉例和類(lèi)比很重要,人類(lèi)習(xí)慣于通過(guò)例子來(lái)學(xué)習(xí),從具體走向抽象)

小白:那我直接寫(xiě)一個(gè)新的類(lèi),比如HelloWorldEx,把日志輸出添加到其中不就行了,為什么還要用Proxy.newProxyInstance(......)這么麻煩的方法?

  1. public class HelloWorldEx implements IHelloWorld{ 
  2.     IHelloWorld hw; 
  3.     public HelloWorldEx(IHelloWorld hw){ 
  4.         this.hw = hw; 
  5.     }     
  6.     public void sayHello(){         
  7.         Logger.startLog(); 
  8.         hw.sayHello(); 
  9.         Logger.endLog(); 
  10.     } 

張大胖無(wú)法回答這個(gè)問(wèn)題,卡殼了!

第三步,回過(guò)頭去看書(shū),學(xué)習(xí)。

書(shū)中也沒(méi)有解釋?zhuān)?

仔細(xì)想一想,手動(dòng)寫(xiě)一個(gè)類(lèi)HelloWorldEx和用Proxy.newProxyInstance來(lái)創(chuàng)建,區(qū)別到底是什么?

實(shí)現(xiàn)的功能是相同的,但是HelloWorldEx需要事先寫(xiě)好,編譯后不能改了,相當(dāng)于寫(xiě)死了!如果我想對(duì)Order類(lèi),Employee類(lèi),Department類(lèi),也想加點(diǎn)兒日志,還得寫(xiě)個(gè)OrderEx,EmployeeEx,DepartmentEx的類(lèi),太麻煩了!

而Proxy.newProxyInstance這種方法,可以在程序運(yùn)行的時(shí)候?yàn)槿我忸?lèi)動(dòng)態(tài)地創(chuàng)建增強(qiáng)的類(lèi)。

事先寫(xiě)死的叫做靜態(tài)代理,Proxy.newProxyInstance這種方式叫做動(dòng)態(tài)代理,更加靈活。

張大胖覺(jué)得這么解釋就通了。

小白:為什么要?jiǎng)?chuàng)建新的代理類(lèi),那個(gè)Proxy.newProxyInstance不能直接修改老的HelloWorld類(lèi)嗎?

張大胖再度卡殼,上網(wǎng)搜索,找到了答案,和Python,Ruby等方法不同,Java本質(zhì)是一個(gè)靜態(tài)類(lèi)型的語(yǔ)言,class一旦被裝入JVM,是不能修改,添加,刪除方法的,既然老的class不能修改,只能通過(guò)代理的方式來(lái)創(chuàng)建新的類(lèi)了。

小白:懂了,這個(gè)技術(shù)主要用在什么地方啊? 難道只是加個(gè)日志?

張大胖第三次卡殼,只好再次搜索。

原來(lái)動(dòng)態(tài)代理使用得最多的是AOP,AOP中經(jīng)常會(huì)以聲明的方式提出這樣的要求:

某個(gè)包下所有add開(kāi)頭的方法,在執(zhí)行之前都要調(diào)用Logger.startLog()方法,在執(zhí)行之后都要調(diào)用Logger.endLog()方法。

或者對(duì)于所有以Service結(jié)尾的類(lèi),所有的方法執(zhí)行之前都要調(diào)用tx.begin(),執(zhí)行之后都要調(diào)用tx.commit(), 如果拋出異常的話調(diào)用tx.rollback()。

到此為止,張大胖可以這樣來(lái)給小白講述了:

你不是用過(guò)Spring AOP嗎?AOP中經(jīng)常有這樣的需求...... ,Spring想添加這些日志和事務(wù)的功能,但是卻沒(méi)有辦法去修改用戶的類(lèi),它是框架啊,一是不知道用戶類(lèi)的源碼,二是Java不允許再修改裝載入JVM的class。

沒(méi)辦法,Spring只好在運(yùn)行時(shí)找到用戶的類(lèi),然后操作字節(jié)碼動(dòng)態(tài)創(chuàng)建一個(gè)新類(lèi),新類(lèi)會(huì)對(duì)原有的類(lèi)進(jìn)行增強(qiáng),添加日志,事務(wù)這些功能,注意啊,這些都是在內(nèi)存中動(dòng)態(tài)創(chuàng)建的。

這個(gè)技術(shù)就是Java的動(dòng)態(tài)代理,不過(guò)它有個(gè)前提要求,就是用戶的類(lèi)需要實(shí)現(xiàn)接口才行。我用一個(gè)簡(jiǎn)單的例子給你說(shuō)下,你就明白細(xì)節(jié)了......

第四步,簡(jiǎn)化,比喻

上面的講解從文字上來(lái)說(shuō)還是非常啰嗦的,用了很大篇幅來(lái)講解“為什么”,因?yàn)槔斫饬藈hy ,剩下的就是細(xì)節(jié)了。

如果你徹底理解了以后,動(dòng)態(tài)代理的技術(shù)細(xì)節(jié)會(huì)在大腦中會(huì)建立這么一幅圖景:

 

$HelloWorld100就是那個(gè)代理類(lèi),它和HelloWorld都實(shí)現(xiàn)了IHelloWorld這個(gè)接口。

如果一定要用個(gè)比喻來(lái)說(shuō),它們倆就是“兄弟關(guān)系”,CgLib提供了另外一種對(duì)現(xiàn)有類(lèi)增強(qiáng)的辦法,動(dòng)態(tài)生成的類(lèi)繼承了現(xiàn)有的類(lèi),兩者是“父子關(guān)系”。

小結(jié)

怎么樣?用這種(假裝)教授別人,層層遞進(jìn)、自我逼問(wèn)的方法是不是很有效果?收益很大?

用這種辦法,實(shí)際上就是逼著你把大腦中的盲點(diǎn)和一些想當(dāng)然的假設(shè)給暴露出來(lái),效果要比單純地閱讀和記憶好得多,趕緊在學(xué)習(xí)中試一下吧!

【本文為51CTO專(zhuān)欄作者“劉欣”的原創(chuàng)稿件,轉(zhuǎn)載請(qǐng)通過(guò)作者微信公眾號(hào)coderising獲取授權(quán)】

 

戳這里,看該作者更多好文

責(zé)任編輯:武曉燕 來(lái)源: 51CTO專(zhuān)欄
相關(guān)推薦

2020-09-25 15:50:41

鴻蒙小米國(guó)產(chǎn)

2020-10-12 09:48:55

SSR JSPPHP

2021-12-05 23:17:18

iOS蘋(píng)果系統(tǒng)

2020-10-21 09:19:27

Flutter開(kāi)源項(xiàng)目

2020-04-28 10:17:51

人工智能技術(shù)智能音箱

2021-06-27 17:33:51

培訓(xùn)員工AI人工智能

2022-03-28 11:06:38

Nacos監(jiān)聽(tīng)配置

2021-12-03 10:46:49

ELKGraylog運(yùn)維

2021-07-08 06:52:41

ESClickHouse Lucene

2021-12-02 06:34:34

GraylogELK日志

2021-04-06 10:48:52

MySQLElasticsear數(shù)據(jù)庫(kù)

2025-06-25 09:31:41

2020-01-21 21:15:16

WiFi網(wǎng)絡(luò)WiFi6

2021-01-11 08:03:30

阿里中臺(tái)項(xiàng)目

2020-07-03 15:10:35

Java Rust 開(kāi)發(fā)

2021-05-19 09:37:45

SessionTokencookie

2021-11-29 06:24:05

物聯(lián)網(wǎng)平臺(tái)物聯(lián)網(wǎng)IOT

2021-12-17 15:05:55

CSSwhenelse

2022-03-22 09:20:57

應(yīng)用線程池技術(shù)

2021-11-02 16:44:40

部署DevtoolsJRebel
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: www.玖玖玖| 天堂网中文 | 欧日韩在线 | 精品久久久网站 | 在线中文视频 | 中文字幕av免费 | 日韩视频区 | 97伊人| 懂色av一区二区三区在线播放 | 欧美一区二区三区在线看 | 日韩精品无码一区二区三区 | 一区二区三区欧美在线 | 精品欧美一区二区中文字幕视频 | 欧美久久久久 | 久久久久国产精品 | 成人网av | 看片天堂 | 91精品国产日韩91久久久久久 | 亚洲国产精品一区二区三区 | 精品国产欧美一区二区 | 精品国产一区久久 | 欧美国产一区二区 | 最新毛片网站 | 污视频免费在线观看 | 日日操网站 | 中文字幕欧美一区 | 久草新在线 | 久久99国产精一区二区三区 | 亚洲精品一区中文字幕乱码 | 日韩精品一区二区三区第95 | 日韩免费视频一区二区 | 日本成人在线免费视频 | 欧美日韩视频在线播放 | 国产在线精品一区二区 | 亚洲欧美日韩精品 | 伊人二区 | 欧美一区二区三区四区视频 | 久久中文免费视频 | 久久国产精品视频观看 | 亚洲国产伊人 | 99精品一区二区三区 |