Sparrow 框架設(shè)計(jì)哲學(xué)

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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末畦攘,一起剝皮案震驚了整個(gè)濱河市霸妹,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌知押,老刑警劉巖叹螟,帶你破解...
    沈念sama閱讀 218,284評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異台盯,居然都是意外死亡罢绽,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,115評論 3 395
  • 文/潘曉璐 我一進(jìn)店門静盅,熙熙樓的掌柜王于貴愁眉苦臉地迎上來良价,“玉大人,你說我怎么就攤上這事蒿叠∶鞴福” “怎么了?”我有些...
    開封第一講書人閱讀 164,614評論 0 354
  • 文/不壞的土叔 我叫張陵栈虚,是天一觀的道長。 經(jīng)常有香客問我史隆,道長魂务,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,671評論 1 293
  • 正文 為了忘掉前任泌射,我火速辦了婚禮粘姜,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘熔酷。我一直安慰自己孤紧,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,699評論 6 392
  • 文/花漫 我一把揭開白布拒秘。 她就那樣靜靜地躺著号显,像睡著了一般臭猜。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上押蚤,一...
    開封第一講書人閱讀 51,562評論 1 305
  • 那天蔑歌,我揣著相機(jī)與錄音,去河邊找鬼揽碘。 笑死次屠,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的雳刺。 我是一名探鬼主播劫灶,決...
    沈念sama閱讀 40,309評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼掖桦!你這毒婦竟也來了本昏?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,223評論 0 276
  • 序言:老撾萬榮一對情侶失蹤滞详,失蹤者是張志新(化名)和其女友劉穎凛俱,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體料饥,經(jīng)...
    沈念sama閱讀 45,668評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡蒲犬,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,859評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了岸啡。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片原叮。...
    茶點(diǎn)故事閱讀 39,981評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖巡蘸,靈堂內(nèi)的尸體忽然破棺而出奋隶,到底是詐尸還是另有隱情,我是刑警寧澤悦荒,帶...
    沈念sama閱讀 35,705評論 5 347
  • 正文 年R本政府宣布唯欣,位于F島的核電站,受9級特大地震影響搬味,放射性物質(zhì)發(fā)生泄漏境氢。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,310評論 3 330
  • 文/蒙蒙 一碰纬、第九天 我趴在偏房一處隱蔽的房頂上張望萍聊。 院中可真熱鬧,春花似錦悦析、人聲如沸寿桨。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,904評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽亭螟。三九已至挡鞍,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間媒佣,已是汗流浹背匕累。 一陣腳步聲響...
    開封第一講書人閱讀 33,023評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留默伍,地道東北人欢嘿。 一個(gè)月前我還...
    沈念sama閱讀 48,146評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像也糊,于是被迫代替她去往敵國和親炼蹦。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,933評論 2 355

推薦閱讀更多精彩內(nèi)容