sparrow 麻雀雖小,五臟俱全
為什么要寫這個(gè)框架?
sparrow 源自中國俗語 麻雀雖小钳榨,但五臟俱全玛界,努力打造一個(gè)全新的低耦合,0依賴的高性能java 開發(fā)基礎(chǔ)框架伤疙。 這個(gè)框架我從11年開始寫,中間重構(gòu)了n遍辆影,最原始的代碼可能都找不到了徒像,之所以堅(jiān)持寫,最初并不是想造新輪子蛙讥。 主要是從中學(xué)習(xí)基礎(chǔ)原理锯蛀。 經(jīng)過近十年的打磨,發(fā)現(xiàn)有些設(shè)計(jì)思想和理念次慢,是值得學(xué)習(xí)的旁涤。比如spring mvc 的設(shè)計(jì)模式,orm ioc 等等迫像。 雖然很多朋友們都了解劈愚,但要真正自己實(shí)現(xiàn)起來也并不是那么容易。而這個(gè)過程對原來的深入理解是很幫助闻妓,所以將這部分開源出來菌羽, 供有同樣需求的朋友參考。在此過程中也發(fā)現(xiàn)了現(xiàn)有框架的一些弊端由缆,比如沒有一個(gè)跨數(shù)據(jù)源的orm注祖。所有項(xiàng)目都需要依賴spring 才能跑起來, 使我們的業(yè)務(wù)依賴很多jar均唉,而大部分的jar包可能是不需要的是晨,代碼變得臃腫,維護(hù)困難舔箭。 為此基于oop的基本思想罩缴,構(gòu)建一層api,最大化的解耦。
為什么選擇簡書?
簡書的slogon 是"創(chuàng)作你的創(chuàng)作",這個(gè)很有意思。所以想在簡書作一個(gè)連載靴庆,和各位朋友交流框架的來龍去脈时捌。
框架的設(shè)計(jì)哲學(xué)和概要
軟件設(shè)計(jì)6大原則,這里推薦幾本書炉抒,martin flower 的重構(gòu), 敏捷軟件開發(fā) 原則奢讨,模式和實(shí)踐。
設(shè)計(jì)原則是軟件設(shè)計(jì)的“魂”焰薄。是oop的基礎(chǔ)拿诸,同樣也是設(shè)計(jì)模式的基礎(chǔ),flower 說重構(gòu)的目的是設(shè)計(jì)模式塞茅。
設(shè)計(jì)原則我總結(jié)一個(gè)單詞solidi 比solid 多一個(gè)i
S (single)單一職責(zé)
這個(gè)原則是最重要亩码,最簡單,也是最難理解的原則野瘦。
小到一個(gè)方法描沟,一個(gè)類,一個(gè)模塊鞭光,大到一個(gè)jar 包吏廉,一個(gè)系統(tǒng),一個(gè)生態(tài)惰许,一個(gè)team都會涉及到這一原則席覆,一個(gè)方法,為了保證方法的單一職責(zé)汹买,并不是隨意拆到最小不能再分為止佩伤,這樣方法可能很碎,而是按需拆晦毙,原則就是能復(fù)用即可生巡。要掌握好粒度,這個(gè)也是最難的地方见妒。舉個(gè)例子障斋,架構(gòu)源于建筑,磚頭都是大小均等的徐鹤,如果是不規(guī)則的石頭和磚頭相比垃环,復(fù)用率就相對低很多。代碼的復(fù)用是軟件設(shè)計(jì)中非常重要的原則返敬。那么代碼復(fù)用就會帶來一個(gè)問題遂庄,復(fù)用多了,必然就會耦合劲赠。那么解決耦合和復(fù)用的的指導(dǎo)方針就是單一職責(zé)涛目。因?yàn)椴鸬帽M量細(xì)秸谢,依賴自然少,復(fù)用也自然就多了霹肝。這句話需要點(diǎn)悟性估蹄。單體應(yīng)用和分布式應(yīng)用也涉及到拆的問題,這個(gè)話題沫换,以后討論臭蚁。
O(open-close)開閉原則
寫框架才發(fā)現(xiàn)這個(gè)原則有多么重要,尤其框架要考慮通用性讯赏,不會考慮個(gè)性化定制功能垮兑,但對于個(gè)性化的業(yè)務(wù)要做到兼容,這就是開閉原則漱挎。JDK 的spi 提供擴(kuò)展點(diǎn)服務(wù)系枪,框架中的具體代碼,以后會和大家分享磕谅。spring 的ioc也實(shí)現(xiàn)了類似功能私爷,核心思想就是oop 的多態(tài)。
l(Liskov Substitution)里氏替換原則
這個(gè)原則的意思就是父類可以由子類替換膊夹,繼承是oop三大特性中的一個(gè)当犯,非常非常的重要,但包括java編程思想中也提到少用繼承割疾,多用復(fù)合(代理也可以理解為一種復(fù)合),其實(shí)這句話的核心語義嘉栓,并不是不允許用繼承宏榕,而是在強(qiáng)調(diào)一件事情,就是繼承可能會重寫父類的方法侵佃,而帶來一些安全隱患麻昼,即子類可以改變父類的行為,這在軟件設(shè)計(jì)被認(rèn)為是不安全的馋辈,所以盡量避免用繼承抚芦。包括java枚舉,也是因?yàn)轭愋桶踩趺鋵?shí)用string也可以實(shí)現(xiàn)相同類型叉抡,但相對來說,不夠安全答毫。所以在我們設(shè)計(jì)方法時(shí)褥民。盡量使用強(qiáng)類型,不要用map 和string 這種弱類型洗搂。這也是為什么jdk? 的string 被設(shè)計(jì)成final 的其中的原因之一(為什么?)消返。包括后來阿里的代碼規(guī)范载弄,重寫的方法一定要用override 關(guān)鍵字,也是這方面的考慮撵颊。
i(ioc)依賴倒置宇攻,控制反轉(zhuǎn)
這個(gè)是老生常談了,這是spring 要解決的根本問題倡勇,就是去掉代碼中的new逞刷,因?yàn)閚ew 這樣的代碼不夠靈活,尤其工程很大的時(shí)侯想改一個(gè)功能译隘,需要到處引用的地方全要改亲桥,成本很大,而ioc只需要相應(yīng)的配置就可以了固耘。
D(Demeter)迪米特法則
又叫作最少知道原則(Least Knowledge Principle 簡寫LKP)题篷,就是說一個(gè)對象應(yīng)當(dāng)對其他對象有盡可能少的了解,不和陌生人說話。
所以要確定哪些是陌生人厅目,哪些是朋友
對于一個(gè)對象番枚,其朋友包括以下幾類:
(1) 當(dāng)前對象本身(this);
(2) 以參數(shù)形式傳入到當(dāng)前對象方法中的對象损敷;
(3) 當(dāng)前對象的成員對象葫笼;
(4) 如果當(dāng)前對象的成員對象是一個(gè)集合,那么集合中的元素也都是朋友拗馒;
(5) 當(dāng)前對象所創(chuàng)建的對象路星。
用排除法,我們不難發(fā)現(xiàn)诱桂,其實(shí)說的陌生人就是指在方法內(nèi)直接new 出來的對象(除pojo外)洋丐,要盡量避免,如果非要調(diào)用挥等,可以使用工廠模式和facade框式友绝。盡量解耦,降低類的使用權(quán)限肝劲,方法的使用權(quán)限迁客,盡量最小化暴露方法和類也是該原則比較好的實(shí)踐。所以private>protect>default (空)>public 方法辞槐,成員變量掷漱,和類都適用。
i(interface )接口隔離
這也是oop三大特性多態(tài)和抽象的實(shí)踐榄檬,將抽象與具體實(shí)現(xiàn)隔離切威。使實(shí)現(xiàn)對上層業(yè)務(wù)透明,即將口的修改對上層業(yè)務(wù)不影響,該原則在框架中體現(xiàn)最為明顯丙号。包括log4j的接口設(shè)計(jì)和jcp 的標(biāo)準(zhǔn)化都是這一原則的最佳實(shí)踐先朦,所以sparrow也盡量不強(qiáng)依賴框架本身缰冤,只定義一些常用的標(biāo)準(zhǔn)化接口,并提供擴(kuò)展點(diǎn)對調(diào)用方實(shí)現(xiàn)喳魏。sparrow-facede這個(gè)模塊即接口定義棉浸。有興趣的同學(xué)可以down源碼,一起交流學(xué)習(xí)刺彩。
框架的的具體模塊github 上有源碼迷郑,在此就不多做介紹了
希望這一系列文章和源碼對大家會有所幫助
下一步會逐步和大家交流框架的的一些模塊的設(shè)計(jì)原理,謝謝
框架剛剛發(fā)布開源创倔,還有一些bug 和不足在所難免嗡害,希望多提寶貴意見!
下載地址
https://github.com/sparrowzoo/sparrow