国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【開源與項(xiàng)目實(shí)戰(zhàn):開源實(shí)戰(zhàn)】81 | 開源實(shí)戰(zhàn)三(上):借Google Guava學(xué)習(xí)發(fā)現(xiàn)和開發(fā)通用功能模塊

這篇具有很好參考價(jià)值的文章主要介紹了【開源與項(xiàng)目實(shí)戰(zhàn):開源實(shí)戰(zhàn)】81 | 開源實(shí)戰(zhàn)三(上):借Google Guava學(xué)習(xí)發(fā)現(xiàn)和開發(fā)通用功能模塊。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

上幾節(jié)課,我們拿 Unix 這個(gè)超級(jí)大型開源軟件的開發(fā)作為引子,從代碼設(shè)計(jì)編寫和研發(fā)管理兩個(gè)角度,講了如何應(yīng)對(duì)大型復(fù)雜項(xiàng)目的開發(fā)。接下來,我們?cè)僦v一下 Google 開源的 Java 開發(fā)庫 Google Guava。

Google Guava 是一個(gè)非常成功、非常受歡迎的開源項(xiàng)目。它在 GitHub 上由近 3.7 萬的 stars。在 Java 項(xiàng)目開發(fā)中應(yīng)用很廣泛。當(dāng)然,我們并不會(huì)講解其中的每個(gè)類、接口如何使用,而是重點(diǎn)講解其背后蘊(yùn)含的設(shè)計(jì)思想、使用的設(shè)計(jì)模式。內(nèi)容比較多,我分三節(jié)課來講解。

  • 第一節(jié)課,我們對(duì) Google Guava 做一個(gè)簡單介紹,并借此講一下如何開發(fā)一個(gè)通用的功能模塊。

  • 第二節(jié)課,我們講 Google Guava 中用到的幾種設(shè)計(jì)模式,會(huì)補(bǔ)充講解之前沒有講到的 Immutable 模式。

  • 第三節(jié)課,我們借 Google Guava 補(bǔ)充講解三大編程范式中的最后一個(gè):函數(shù)式編程。

話不多說,讓我們正式開始今天的學(xué)習(xí)吧!

Google Guava 介紹

考慮到你可能不熟悉 Google Guava,我先對(duì)它做下簡單的介紹。

Google Guava 是 Google 公司內(nèi)部 Java 開發(fā)工具庫的開源版本。Google 內(nèi)部的很多 Java 項(xiàng)目都在使用它。它提供了一些 JDK 沒有提供的功能,以及對(duì) JDK 已有功能的增強(qiáng)功能。其中就包括:集合(Collections)、緩存(Caching)、原生類型支持(Primitives Support)、并發(fā)庫(Concurrency Libraries)、通用注解(Common Annotation)、字符串處理(Strings Processing)、數(shù)學(xué)計(jì)算(Math)、I/O、事件總線(EventBus)等等。

我截取了 Google Guava 的包結(jié)構(gòu)圖,貼到了這里,你看起來更加直觀些。

【開源與項(xiàng)目實(shí)戰(zhàn):開源實(shí)戰(zhàn)】81 | 開源實(shí)戰(zhàn)三(上):借Google Guava學(xué)習(xí)發(fā)現(xiàn)和開發(fā)通用功能模塊
我們知道,JDK 的全稱是 Java Development Kit。它本身就是 Java 提供的工具類庫。那現(xiàn)在請(qǐng)你思考一下,既然有了 JDK,為什么 Google 還要開發(fā)一套新的類庫 Google Guava?是否是重復(fù)早輪子?兩者的差異化在哪里?

帶著這個(gè)問題,結(jié)合 Google Guava,我們來學(xué)習(xí)如何在業(yè)務(wù)開發(fā)中,發(fā)現(xiàn)通用的功能模塊,以及如何將它開發(fā)成類庫、框架或者功能組件。等到學(xué)習(xí)完之后,我希望你能自己回答這個(gè)問題。

如何發(fā)現(xiàn)通用的功能模塊?

很多人覺得做業(yè)務(wù)開發(fā)沒有挑戰(zhàn),實(shí)際上,做業(yè)務(wù)開發(fā)也會(huì)涉及很多非業(yè)務(wù)功能的開發(fā),比如我們前面講到的 ID 生成器、性能計(jì)數(shù)器、EventBus、DI 容器,以及后面會(huì)講到的限流框架、冪等框架、灰度組件。關(guān)鍵在于,我們要有善于發(fā)現(xiàn)、善于抽象的能力,并且具有扎實(shí)的設(shè)計(jì)、開發(fā)能力,能夠發(fā)現(xiàn)這些非業(yè)務(wù)的、可復(fù)用的功能點(diǎn),并且從業(yè)務(wù)邏輯中將其解耦抽象出來,設(shè)計(jì)并開發(fā)成獨(dú)立的功能模塊。

在我看來,在業(yè)務(wù)開發(fā)中,跟業(yè)務(wù)無關(guān)的通用功能模塊,常見的一般有三類:類庫(library)、框架(framework)、功能組件(component)等。

其中,Google Guava 屬于類庫,提供一組 API 接口。EventBus、DI 容器屬于框架,提供骨架代碼,能讓業(yè)務(wù)開發(fā)人員聚焦在業(yè)務(wù)開發(fā)部分,在預(yù)留的擴(kuò)展點(diǎn)里填充業(yè)務(wù)代碼。ID 生成器、性能計(jì)數(shù)器屬于功能組件,提供一組具有某一特殊功能的 API 接口,有點(diǎn)類似類庫,但更加聚焦和重量級(jí),比如,ID 生成器有可能會(huì)依賴 Redis 等外部系統(tǒng),不像類庫那么簡單。

前面提到的限流、冪等、灰度,到底是屬于框架還是功能組件,我們要視具體情況而定。如果業(yè)務(wù)代碼嵌套在它們里面開發(fā),那就可以稱它們?yōu)榭蚣?。如果它們只是開放 API 接口,供業(yè)務(wù)系統(tǒng)調(diào)用,那就可以稱它們?yōu)榻M件。不過,叫什么沒有太大關(guān)系,不必太深究概念。

那我們?nèi)绾伟l(fā)現(xiàn)項(xiàng)目中的這些通用的功能模塊呢?

實(shí)際上,不管是類庫、框架還是功能組件,這些通用功能模塊有兩個(gè)最大的特點(diǎn):復(fù)用和業(yè)務(wù)無關(guān)。Google Guava 就是一個(gè)典型的例子。

如果沒有復(fù)用場景,那也就沒有了抽離出來,設(shè)計(jì)成獨(dú)立模塊的必要了。如果與業(yè)務(wù)有關(guān)又可復(fù)用,大部分情況下會(huì)設(shè)計(jì)成獨(dú)立的系統(tǒng)(比如微服務(wù)),而不是類庫、框架或功能組件。所以,如果你負(fù)責(zé)開發(fā)的代碼,與業(yè)務(wù)無關(guān)并且可能會(huì)被復(fù)用,那你就可以考慮將它獨(dú)立出來,開發(fā)成類庫、框架、功能組件等通用功能模塊。

稍微補(bǔ)充一下,我們這里講的是,在業(yè)務(wù)開發(fā)中,如何發(fā)現(xiàn)通用的功能模塊。除了業(yè)務(wù)開發(fā)團(tuán)隊(duì)之外,很多公司還有一些基礎(chǔ)架構(gòu)團(tuán)隊(duì)、架構(gòu)開發(fā)團(tuán)隊(duì),他們除了開發(fā)類庫、框架、功能組件之外,也會(huì)開發(fā)一些通用的系統(tǒng)、中間件,比如,Google MapReduce、Kafka 消息中間件、監(jiān)控系統(tǒng)、分布式調(diào)用鏈追蹤系統(tǒng)等。

如何開發(fā)通用的功能模塊?

當(dāng)我們發(fā)現(xiàn)了通用功能模塊的開發(fā)需求之后,如何將它設(shè)計(jì)開發(fā)成一個(gè)優(yōu)秀的類庫、框架或功能組件呢?今天,我們不講具體的開發(fā)技巧,具體的開發(fā)技巧在后面 Spring 開源實(shí)戰(zhàn)那部分,我們會(huì)講到一些,我今天打算先講一些更普適的開發(fā)思想。我覺得先有了這些,你應(yīng)該更容易理解后面的內(nèi)容。

作為通用的類庫、框架、功能組件,我們希望開發(fā)出來之后,不僅僅是自己項(xiàng)目使用,還能用在其他團(tuán)隊(duì)的項(xiàng)目中,甚至可以開源出來供更多人所用,這樣才能發(fā)揮它更大的價(jià)值,構(gòu)建自己的影響力。

所以,對(duì)于這些類庫、框架、功能組件的開發(fā),我們不能閉門造車,要把它們當(dāng)作“產(chǎn)品”來開發(fā)。這個(gè)產(chǎn)品是一個(gè)“技術(shù)產(chǎn)品”,我們的目標(biāo)用戶是“程序員”,解決的是他們的“開發(fā)痛點(diǎn)”。我們要多換位思考,站在用戶的角度上,來想他們到底想要什么樣的功能。

對(duì)于一個(gè)技術(shù)產(chǎn)品來說,盡管 Bug 少、性能好等技術(shù)指標(biāo)至關(guān)重要,但是否易用、易集成、易插拔、文檔是否全面、是否容易上手等,這些產(chǎn)品素質(zhì)也非常重要,甚至還能起到?jīng)Q定性作用。往往就是這些很容易忽視、不被重視的東西,會(huì)決定一個(gè)技術(shù)產(chǎn)品是否能在眾多的同類中脫穎而出。

具體到 Google Guava,它是一個(gè)開發(fā)類庫,目標(biāo)用戶是 Java 開發(fā)工程師,解決用戶主要痛點(diǎn)是,相對(duì)于 JDK,提供更多的工具類,簡化代碼編寫,比如,它提供了用來判斷 null 值的 Preconditions 類;Splitter、Joiner、CharMatcher 字符串處理類;Multisets、Multimaps、Tables 等更豐富的 Collections 類等等。

它的優(yōu)勢有這樣幾點(diǎn):第一,由 Google 管理、長期維護(hù),經(jīng)過充分的單元測試,代碼質(zhì)量有保證;第二,可靠、性能好、高度優(yōu)化,比如 Google Guava 提供的 Immutable Collections 要比 JDK 的 unmodifiableCollection 性能好;第三,全面、完善的文檔,容易上手,學(xué)習(xí)成本低,你可以去看下它的 Github Wiki。

剛剛講的是“產(chǎn)品意識(shí)”,我們?cè)賮碇v講“服務(wù)意識(shí)”。我經(jīng)常在團(tuán)隊(duì)中說,如果你開發(fā)的東西是提供給其他團(tuán)隊(duì)用的,你一定要有“服務(wù)意識(shí)”。對(duì)于程序員來說,這點(diǎn)可能比“產(chǎn)品意識(shí)”更加欠缺。

首先,從心態(tài)上,別的團(tuán)隊(duì)使用我們開發(fā)出來的技術(shù)產(chǎn)品,我們要學(xué)會(huì)感謝。這點(diǎn)很重要。心態(tài)不同了,做起事來就會(huì)有微妙的不同。其次,除了寫代碼,我們還要有抽出大量時(shí)間答疑、充當(dāng)客服角色的心理準(zhǔn)備。有了這個(gè)心理準(zhǔn)備,別的團(tuán)隊(duì)的人在問你問題的時(shí)候,你也就不會(huì)很煩了。

相對(duì)于業(yè)務(wù)代碼來說,開發(fā)這種被多處復(fù)用的通用代碼,對(duì)代碼質(zhì)量的要求更高些,因?yàn)檫@些項(xiàng)目的影響面更大,一旦出現(xiàn) bug,會(huì)牽連很多系統(tǒng)或其他項(xiàng)目。特別是如果你要把項(xiàng)目開源,影響就更大了。所以,這類項(xiàng)目的代碼質(zhì)量一般都很好,開發(fā)這類項(xiàng)目對(duì)代碼能力的鍛煉更有大。這也是我經(jīng)常推薦別人通過閱讀著名開源項(xiàng)目代碼、參與開源項(xiàng)目來提高技術(shù)的原因。

具體到 Google Guava,它是 Google 員工開發(fā)的,單元測試很完善,注釋寫得很規(guī)范,代碼寫得也很好,可以說是學(xué)習(xí) Google 開發(fā)經(jīng)驗(yàn)的一手資料,建議你如果有時(shí)間的話,可以認(rèn)真閱讀一下它的代碼。

盡管開發(fā)這些通用功能模塊更加鍛煉技術(shù),但我們也不要重復(fù)造輪子,能復(fù)用的盡量復(fù)用。而且,在項(xiàng)目中,如果你想把所有的通用功能都開發(fā)為獨(dú)立的類庫、框架、功能組件,這就有點(diǎn)大動(dòng)干戈了,有可能會(huì)得不到領(lǐng)導(dǎo)的支持。畢竟從項(xiàng)目中將這部分通用功能獨(dú)立出來開發(fā),比起作為項(xiàng)目的一部分來開發(fā),會(huì)更加耗時(shí)。

所以,權(quán)衡一下的話,我建議初期先把這些通用的功能作為項(xiàng)目的一部分來開發(fā)。不過,在開發(fā)的時(shí)候,我們做好模塊化工作,將它們盡量跟其他模塊劃清界限,通過接口、擴(kuò)展點(diǎn)等松耦合的方式跟其他模式交互。等到時(shí)機(jī)成熟了,我們?cè)賹⑺鼜捻?xiàng)目中剝離出來。因?yàn)橹澳K化做的好,耦合程度低,剝離出來的成本也就不會(huì)很高。

重點(diǎn)回顧

好了,今天的內(nèi)容到此就講完了。我們一塊來總結(jié)回顧一下,你需要重點(diǎn)掌握的內(nèi)容。

做業(yè)務(wù)開發(fā)也會(huì)涉及很多非業(yè)務(wù)功能的開發(fā)。我們要有善于發(fā)現(xiàn)、善于抽象的能力,并且具有扎實(shí)的設(shè)計(jì)、開發(fā)能力,能夠發(fā)現(xiàn)這些非業(yè)務(wù)的、可復(fù)用的功能點(diǎn),并且從業(yè)務(wù)邏輯中將其解耦抽象出來,設(shè)計(jì)并開發(fā)成獨(dú)立的功能模塊,比如類庫、框架、功能組件。

實(shí)際上,不管是類庫、框架還是功能組件,這些通用功能模塊最大的兩個(gè)特點(diǎn)就是復(fù)用和業(yè)務(wù)無關(guān)。如果你開發(fā)的這塊代碼,業(yè)務(wù)無關(guān)并且可能會(huì)被復(fù)用,那就可以考慮將它獨(dú)立出來,開發(fā)成類庫、框架、功能組件等。

當(dāng)我們發(fā)現(xiàn)了通用功能模塊的開發(fā)需求之后,如何將它設(shè)計(jì)開發(fā)成一個(gè)優(yōu)秀的類庫、框架或功能組件呢?這里我們講了一些更普適的開發(fā)思想,比如產(chǎn)品意識(shí)、服務(wù)意識(shí)、代碼質(zhì)量意識(shí)、不要重復(fù)造輪子等。

除此之外,我特別建議你去閱讀一下 Google Guava 的開源代碼。它的代碼不復(fù)雜,很容易讀懂,不會(huì)有太大閱讀負(fù)擔(dān),但它是你獲取 Google 公司開發(fā)經(jīng)驗(yàn)的一手資料,特別是在單元測試、編碼規(guī)范方面。

課堂討論

針對(duì)你正在參與開發(fā)的項(xiàng)目,思考一下,有哪些通用的功能模塊可以抽象出來,設(shè)計(jì)開發(fā)成獨(dú)立的類庫、框架、功能組件?它們都可能會(huì)包括哪些功能點(diǎn)呢?試著自己設(shè)計(jì)一下吧!文章來源地址http://www.zghlxwxcb.cn/news/detail-508300.html

到了這里,關(guān)于【開源與項(xiàng)目實(shí)戰(zhàn):開源實(shí)戰(zhàn)】81 | 開源實(shí)戰(zhàn)三(上):借Google Guava學(xué)習(xí)發(fā)現(xiàn)和開發(fā)通用功能模塊的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包