架構(gòu)與思想:Phal Api核心設(shè)計(jì)和思想解讀

設(shè)計(jì)軟件有兩種方法:一種是簡(jiǎn)單到明顯沒(méi)有缺陷,另外一種復(fù)雜到缺陷不那么明顯。 --托尼.霍爾

5.1.1 前言

在軟件工程這一學(xué)科和行業(yè)里恢氯,關(guān)于軟件工程的解說(shuō)有很多。有人說(shuō)開(kāi)發(fā)是一門(mén)藝術(shù)鼓寺;有人說(shuō)開(kāi)發(fā)是一種技藝勋拟;也有人說(shuō)開(kāi)發(fā)是一門(mén)哲學(xué)。但個(gè)人認(rèn)同從實(shí)用主義和理性的角度去理解妈候。

例如一個(gè)框架敢靡,我們之所以認(rèn)為它好是因?yàn)槲覀儼l(fā)現(xiàn)這個(gè)框架遵循了編程規(guī)范、適當(dāng)?shù)厥褂昧嗽O(shè)計(jì)模式苦银、巧妙地結(jié)合了設(shè)計(jì)原則啸胧、有著穩(wěn)定的依賴(lài)、代碼復(fù)雜度低幔虏、并且有著很高代碼覆蓋率的單元測(cè)試等等纺念。

也就是說(shuō),好的框架都是可以被解釋的想括。既然可以被解釋量化陷谱,也就可以學(xué)習(xí)、參考和借鑒瑟蜈。

5.1.2 共性和可變性分析

關(guān)于共性和可變性分析烟逊,在《設(shè)計(jì)模式解析》一書(shū)中有著非常到位的講解。

CVA是一種很容易的理念踪栋,按我的理解即:抽離共性焙格、隔離變化。有點(diǎn)類(lèi)似易經(jīng)里面的“變”與“不變”夷都。

誠(chéng)然眷唉,在過(guò)去的教育中(包括大學(xué)在內(nèi)的)予颤,對(duì)于軟件開(kāi)發(fā)都著重談?wù)撁嫦驅(qū)ο箝_(kāi)發(fā),即OOD冬阳,以致于很多人都對(duì)面向?qū)ο箝_(kāi)發(fā)產(chǎn)生了很大的誤解蛤虐。而這種誤解所帶來(lái)的實(shí)際情況就是:我們都在進(jìn)行面向?qū)ο箝_(kāi)發(fā),但卻是標(biāo)準(zhǔn)呆板的面向?qū)ο箝_(kāi)發(fā)肝陪,缺少生氣驳庭,缺少活力

很多人氯窍,都沒(méi)有把我們開(kāi)發(fā)人員作為專(zhuān)業(yè)人士看待饲常,甚至連我們自己都否認(rèn)我們是專(zhuān)業(yè)的。所以很多時(shí)候當(dāng)產(chǎn)品提出需求時(shí)狼讨,我們提供的開(kāi)發(fā)周期往往會(huì)被外界以講價(jià)的方式削減贝淤。何以?為什么醫(yī)生給出的手術(shù)時(shí)間病人沒(méi)有討價(jià)呢政供?因?yàn)楹芎?jiǎn)單播聪,在病人的眼里,醫(yī)生是專(zhuān)業(yè)的布隔。

若我們也想達(dá)到專(zhuān)業(yè)的層次時(shí)离陶,何以為?學(xué)習(xí)衅檀、思考和實(shí)踐招刨,我認(rèn)為至少這三者是必不可少的。

所以术吝,當(dāng)我們?cè)趯?duì)PhalApi進(jìn)行設(shè)計(jì)時(shí)计济,我們進(jìn)行了一次又一次地醞釀、嘗試排苍、思考。我們?cè)谒伎迹哼@些功能是否真的會(huì)在實(shí)際項(xiàng)目中被使用学密?開(kāi)發(fā)人員是否可能很好地進(jìn)行擴(kuò)展淘衙?此種決策是否便于單元測(cè)試、從思路上減少代碼異味腻暮?彤守。。哭靖。

我們謹(jǐn)記敏捷開(kāi)發(fā)具垫,不過(guò)度設(shè)計(jì)。但我們也確實(shí)需要一種思想上的指導(dǎo)试幽。正好筝蚕,我們看到了共性和可變性的分析(commonality and variability analysis, CVA)

5.1.3 CVA和三種視角、抽象類(lèi)之間的關(guān)系

引用一下《設(shè)計(jì)模式解析》一書(shū)中的圖表:

在這種理念的指導(dǎo)下起宽,我們會(huì)更愿意將接口開(kāi)發(fā)過(guò)程的共性抽離統(tǒng)一起來(lái)洲胖,而可變性部分的則可以由開(kāi)發(fā)人員根據(jù)不同的項(xiàng)目情況進(jìn)行快速定制實(shí)現(xiàn)。

5.1.4 不穩(wěn)定性與抽象度分布

除了常談及到的“低耦合坯沪、高內(nèi)聚”外绿映,在對(duì)代碼進(jìn)行靜態(tài)分析和衡量其可維護(hù)度時(shí),還有一個(gè)值得注意的值腐晾,即:不穩(wěn)定的度量叉弦。

不穩(wěn)定的度量可以根據(jù)以下公式計(jì)算獲得:

I= 離心耦合 / (離心耦合 + 向心耦合)

因此從宏觀上,我們的代碼結(jié)構(gòu)藻糖,從上層到下層淹冰,應(yīng)該向著穩(wěn)定的方向遞增,也就是說(shuō)越底層越應(yīng)穩(wěn)定颖御。對(duì)應(yīng)穩(wěn)定依賴(lài)原則的規(guī)則(SDP)榄棵,包之間的依賴(lài)應(yīng)該朝著穩(wěn)定的方向:不穩(wěn)定的包應(yīng)該依賴(lài)于更穩(wěn)定的包。

又結(jié)合不穩(wěn)定性與抽象分布圖潘拱,我們PhalApi框架的代碼應(yīng)該大部分分布在上圖中的抽象穩(wěn)定區(qū)以實(shí)現(xiàn)框架高層的建設(shè)疹鳄、少部分分布在具體不穩(wěn)定區(qū)以提供一些基礎(chǔ)的功能

5.1.5 創(chuàng)建和使用分離

在框架的特性中芦岂,包括:可重用瘪弓、IoC Container以及SOLID五條原則的運(yùn)用等。這里就部分SOLID原則的運(yùn)用簡(jiǎn)單說(shuō)明一下禽最。

(1)S:?jiǎn)我宦氊?zé)原則

這是我們一直都堅(jiān)持遵守的原則腺怯,因?yàn)椋覀円矆?jiān)持短而美的寫(xiě)法川无,致力于編寫(xiě)優(yōu)雅的代碼呛占、編寫(xiě)人容易理解的代碼

(2)O:開(kāi)放-封閉原則

我們首先希望的是在進(jìn)行接口開(kāi)發(fā)過(guò)程中懦趋,當(dāng)需要新增一個(gè)接口時(shí)是開(kāi)放的晾虑,對(duì)已有的響應(yīng)調(diào)用流程是封閉的。即我們只需要實(shí)現(xiàn)新接口邏輯即可仅叫,不需要改動(dòng)其他過(guò)程的調(diào)用帜篇。因此在OCP原則的指導(dǎo)下,我們通過(guò)結(jié)合工廠(chǎng)方法封裝了對(duì)接口的初始化和調(diào)用诫咱。

(3)D:依賴(lài)倒置原則

PhalApi框架笙隙,最大的特色莫過(guò)于它提供了一種如何快速進(jìn)行接口開(kāi)發(fā)的機(jī)制,但它不強(qiáng)制你使用不必要的功能坎缭,甚至它還鼓勵(lì)你通過(guò)它來(lái)嘗試研發(fā)自己的框架竟痰。更進(jìn)一步签钩,PhalApi引入了新穎明確的概念,一如服務(wù)凯亮。我們把客戶(hù)端調(diào)用的接口稱(chēng)之為接口服務(wù)边臼,把服務(wù)端用到的資源稱(chēng)之為資源服務(wù)。對(duì)于后者假消,PhalApi提供了靈活的DI機(jī)制柠并,以支持各項(xiàng)目定制化的開(kāi)發(fā)。

5.1.6 PhalApi核心架構(gòu)圖

顯然富拗,到目前為止臼予,從核心架構(gòu)圖所折射出PhalApi的結(jié)構(gòu)和代碼是如此的簡(jiǎn)單明了、統(tǒng)一規(guī)范啃沪。至少我是這么認(rèn)為的粘拾,也是一直這樣努力的。

從上圖的核心架構(gòu)圖可以看出创千,中間紅色部分的DI處于匯點(diǎn)位置缰雇,提供各種資源服務(wù)的定位、創(chuàng)建追驴、管理和提供械哟。

而左上角的代碼示例則表達(dá)本系統(tǒng)框架運(yùn)行的主流程:創(chuàng)建一個(gè)接口實(shí)例,運(yùn)行響應(yīng)殿雪。

右上解黃色部分則為多變的接口應(yīng)用開(kāi)發(fā)的代碼暇咆,這里特意羅列了兩組接口,意在表明可以在此框架下掛靠多套接口丙曙。

最下面是接口開(kāi)發(fā)過(guò)程中所用到的各種基礎(chǔ)設(shè)施和技術(shù)爸业,如日記、配置讀取亏镰、緩存扯旷、加密、請(qǐng)求和響應(yīng)等索抓。同樣薄霜,除各應(yīng)用項(xiàng)目中形式多變的接口開(kāi)發(fā)外,這塊的底層技術(shù)亦支撐不一而足的需求纸兔。因?yàn)椋琍halApi只是作了共性的抽離否副,即提供一級(jí)抽象且穩(wěn)定的接口或者抽象類(lèi)汉矿,以約定規(guī)約視角中接口的函數(shù)簽名,不作過(guò)多的具體實(shí)現(xiàn)备禀。同時(shí)以DI作為輔助洲拇,支持快速擴(kuò)展奈揍。

5.1.7 PhalApi核心執(zhí)行流程

和其他框架不同,除了有文檔對(duì)基本使用有說(shuō)明外赋续,我們還提供了我們框架核心的設(shè)計(jì)和思想男翰,以便大家洞明其中的原理從而進(jìn)一步優(yōu)化擴(kuò)展。

這里纽乱,扼要說(shuō)明一下PhalApi框架中接口請(qǐng)求背后的核心執(zhí)行流程蛾绎。

從上圖的時(shí)序圖中可以看出,在PhalApi中鸦列,一個(gè)接口的請(qǐng)求處理租冠,只要分為兩個(gè)環(huán)節(jié):接口服務(wù)初始化接口服務(wù)調(diào)用

(1)接口服務(wù)初始化

在Web Service中薯嗤,往往需要對(duì)服務(wù)進(jìn)行注冊(cè)發(fā)布后顽爹,才能開(kāi)放請(qǐng)求。這里免去這一層骆姐,但遵循創(chuàng)建和使用分離的原則镜粤,我們將接口服務(wù)的初始化進(jìn)行了封裝,以便可以統(tǒng)一進(jìn)行初始化玻褪、異常處理和一些權(quán)限ACL的控制

肉渴,甚至接口訪(fǎng)問(wèn)的統(tǒng)計(jì)等操作,更為重要的是接口開(kāi)發(fā)人員可以進(jìn)行無(wú)緒開(kāi)發(fā)归园,而不需要過(guò)多知道如何合法創(chuàng)建接口服務(wù)黄虱。

在1.2. 步驟中,UML時(shí)序圖中的::generateService()表示對(duì)靜態(tài)函數(shù)的調(diào)用庸诱,即對(duì)應(yīng)代碼:

PhalApi_ApiFactory::generateService();

隨后捻浦,可以看到(假設(shè)我們這次請(qǐng)求的服務(wù)為:?service=Demo.DoSth),我們創(chuàng)建了一個(gè)指定接口的實(shí)例(此接口類(lèi)須繼承于PhalApi_Api基類(lèi))桥爽,并以變量a返回實(shí)例朱灿。

如果請(qǐng)求的服務(wù)非法,則會(huì)以400非法請(qǐng)求返回給客戶(hù)端钠四。而正確創(chuàng)建接口服務(wù)a后盗扒,則會(huì)進(jìn)行接口的初始化,其中有接口參數(shù)規(guī)則的解析和注冊(cè)了過(guò)濾器服務(wù)后的檢測(cè)操作缀去。

當(dāng)這一系列的操作都成功執(zhí)行后侣灶,我們將會(huì)得到一個(gè)接口服務(wù)實(shí)例a返回。

因此缕碎,在接口服務(wù)的創(chuàng)建過(guò)程中褥影,我們沒(méi)有過(guò)多地限制,而是預(yù)留了很大的空間給到接口項(xiàng)目定制開(kāi)發(fā)咏雌。

至此凡怎,接口服務(wù)的創(chuàng)建完成校焦。

(2)接口服務(wù)調(diào)用

在完成復(fù)雜的創(chuàng)建工作后,客戶(hù)端(備注:這里指的是服務(wù)端開(kāi)發(fā)的開(kāi)發(fā)客戶(hù)端)只需要簡(jiǎn)單調(diào)用需要進(jìn)行的操作即可统倒。

而這一塊寨典,則需要接口項(xiàng)目具體開(kāi)發(fā)實(shí)現(xiàn),也是我們項(xiàng)目級(jí)的核心部分房匆。

在獲取接口服務(wù)的背后耸成,我們建議結(jié)合領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)的理念,對(duì)項(xiàng)目代碼進(jìn)行這樣的層級(jí)劃分:

Api接口層:用于接收參數(shù)并響應(yīng)接口的請(qǐng)求坛缕;

Domain領(lǐng)域?qū)樱河糜谔幚韽?fù)雜的領(lǐng)域業(yè)務(wù)邏輯墓猎,保證規(guī)則只出現(xiàn)一次;

Model數(shù)據(jù)源層:更廣義上的Model層赚楚,提供數(shù)據(jù)來(lái)源毙沾,不限于DB;

最后宠页,是我們客戶(hù)端關(guān)心的返回格式左胞。? 默認(rèn)情況下,我們都是以JSON格式返回的举户,但仍然可以輕松支持其他格式的返回烤宙,如JSONP、XML等俭嘁。只需要簡(jiǎn)單地開(kāi)發(fā)實(shí)現(xiàn)躺枕,然后重新注冊(cè)即可。

至此供填,接口服務(wù)的調(diào)用完畢拐云。

5.1.8 DI支持下的輕松擴(kuò)展

當(dāng)使用一個(gè)開(kāi)源框架時(shí),我們既喜歡其強(qiáng)大的一面近她,但矛盾的同時(shí)我們又害怕其中的復(fù)雜性叉瘩,原因莫過(guò)于:學(xué)習(xí)成本高、出現(xiàn)問(wèn)題時(shí)怕駕馭不了粘捎。

而在這里薇缅,在PhalApi這里,這一切都是這么簡(jiǎn)單攒磨,簡(jiǎn)單地又如此明了泳桦。

當(dāng)需要進(jìn)行資源服務(wù)的擴(kuò)展時(shí),我們可以:

實(shí)現(xiàn)自己需要的服務(wù)

實(shí)現(xiàn)指定資源服務(wù)在規(guī)約視角約定的接口娩缰,假設(shè)我們需要用文件來(lái)當(dāng)作新的緩存存儲(chǔ)蓬痒。則需:

classMyCache_FileimplementsPhalApi_Cache{publicfunctionset($key, $value, $expire =600){//...}publicfunctionget($key){//...}publicfunctiondelete($key){//...}}

在入口重新注冊(cè)

當(dāng)實(shí)現(xiàn)自己的功能后,只需要簡(jiǎn)單地在入口文件重新注冊(cè)即可。如:

DI()->cache =newMyCache_File();

最后梧奢,另人興奮的是,原來(lái)全部的調(diào)用代碼都不需要改動(dòng)演痒,即可享受后期調(diào)整升級(jí)后的新功能亲轨!完全避免了曾經(jīng)那種“牽一發(fā)而動(dòng)全身”的痛苦。并且鸟顺,定制開(kāi)發(fā)出來(lái)的實(shí)現(xiàn)類(lèi)惦蚊,還可以跨越業(yè)務(wù)在其他項(xiàng)目中共用。

這不正是我們常常所說(shuō)的代碼重用嗎讯嫂?而如今蹦锋,我們很優(yōu)雅地做到了!

然而欧芽,我們?cè)趯?shí)際開(kāi)發(fā)中收獲到的遠(yuǎn)遠(yuǎn)不是代碼重用這么簡(jiǎn)單莉掂,而是一種更好的開(kāi)發(fā)實(shí)踐。因?yàn)橥ㄟ^(guò)DI使得創(chuàng)建和使用分離千扔,所以我們可以讓高級(jí)的開(kāi)發(fā)同學(xué)實(shí)現(xiàn)服務(wù)功能的開(kāi)發(fā)憎妙,然后再提供給普通的開(kāi)發(fā)同學(xué)使用,新手亦然曲楚,因?yàn)閷?duì)他們來(lái)說(shuō):會(huì)用就行厘唾。當(dāng)然,對(duì)于高級(jí)的同學(xué)龙誊,還應(yīng)該遵循開(kāi)發(fā)的最佳實(shí)踐抚垃,堅(jiān)持單元測(cè)試,以保證我們提供了可靠的接口(廣義上的接口趟大,非HTTP請(qǐng)求的接口)給我們的“客戶(hù)端”使用鹤树。

若如此,我們的開(kāi)發(fā)合作豈不是很更合理护昧、更明朗魂迄、更愉快?哈哈惋耙,我想是的捣炬。

作為一個(gè)框架,我們應(yīng)當(dāng)以發(fā)散的方式去設(shè)計(jì)绽榛;但為了能為應(yīng)用提供可用的功能湿酸,我們又應(yīng)當(dāng)以收斂的方式去實(shí)現(xiàn)。

如果我們提供的功能不足以滿(mǎn)足大部分主流的業(yè)務(wù)場(chǎng)景灭美,那么我們至少需要提供可擴(kuò)展的空間推溃。

正是出于這樣的考慮,我們虔誠(chéng)地引入了DI届腐。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末铁坎,一起剝皮案震驚了整個(gè)濱河市蜂奸,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌硬萍,老刑警劉巖扩所,帶你破解...
    沈念sama閱讀 216,591評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件宾茂,死亡現(xiàn)場(chǎng)離奇詭異猛遍,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)效斑,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,448評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門(mén)买羞,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)袁勺,“玉大人,你說(shuō)我怎么就攤上這事畜普∑诜幔” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 162,823評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵漠嵌,是天一觀的道長(zhǎng)咐汞。 經(jīng)常有香客問(wèn)我,道長(zhǎng)儒鹿,這世上最難降的妖魔是什么化撕? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,204評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮约炎,結(jié)果婚禮上植阴,老公的妹妹穿的比我還像新娘。我一直安慰自己圾浅,他們只是感情好掠手,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,228評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著狸捕,像睡著了一般喷鸽。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上灸拍,一...
    開(kāi)封第一講書(shū)人閱讀 51,190評(píng)論 1 299
  • 那天做祝,我揣著相機(jī)與錄音,去河邊找鬼鸡岗。 笑死混槐,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的轩性。 我是一名探鬼主播声登,決...
    沈念sama閱讀 40,078評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了悯嗓?” 一聲冷哼從身側(cè)響起件舵,我...
    開(kāi)封第一講書(shū)人閱讀 38,923評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎绅作,沒(méi)想到半個(gè)月后芦圾,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,334評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡俄认,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,550評(píng)論 2 333
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了洪乍。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片眯杏。...
    茶點(diǎn)故事閱讀 39,727評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖壳澳,靈堂內(nèi)的尸體忽然破棺而出岂贩,到底是詐尸還是另有隱情,我是刑警寧澤巷波,帶...
    沈念sama閱讀 35,428評(píng)論 5 343
  • 正文 年R本政府宣布萎津,位于F島的核電站,受9級(jí)特大地震影響抹镊,放射性物質(zhì)發(fā)生泄漏锉屈。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,022評(píng)論 3 326
  • 文/蒙蒙 一垮耳、第九天 我趴在偏房一處隱蔽的房頂上張望颈渊。 院中可真熱鬧,春花似錦终佛、人聲如沸俊嗽。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,672評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)绍豁。三九已至,卻和暖如春牙捉,著一層夾襖步出監(jiān)牢的瞬間竹揍,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,826評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工鹃共, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留鬼佣,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,734評(píng)論 2 368
  • 正文 我出身青樓霜浴,卻偏偏與公主長(zhǎng)得像晶衷,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,619評(píng)論 2 354

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

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,078評(píng)論 25 707
  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理晌纫,服務(wù)發(fā)現(xiàn)税迷,斷路器,智...
    卡卡羅2017閱讀 134,652評(píng)論 18 139
  • 人工智能(AI)是當(dāng)今最令人興奮和最有前景的前沿技術(shù)之一。它是計(jì)算機(jī)科學(xué)的一個(gè)領(lǐng)域哥牍,主要涉及到機(jī)器和程序的開(kāi)發(fā)毕泌,這...
    小聲講故事閱讀 201評(píng)論 0 0
  • “我們要的自由,最根本不是財(cái)富嗅辣,財(cái)富只是工具撼泛,我們要的自由,本質(zhì)是時(shí)間的自主權(quán)澡谭≡柑猓” 前段時(shí)間,閨蜜按家人的意愿順利...
    側(cè)側(cè)姐閱讀 552評(píng)論 0 2
  • 山的彼岸閱讀 461評(píng)論 0 0