91欧美超碰AV自拍|国产成年人性爱视频免费看|亚洲 日韩 欧美一厂二区入|人人看人人爽人人操aV|丝袜美腿视频一区二区在线看|人人操人人爽人人爱|婷婷五月天超碰|97色色欧美亚州A√|另类A√无码精品一级av|欧美特级日韩特级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線(xiàn)課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

DDD驅(qū)動(dòng)如何設(shè)計(jì)?如何進(jìn)行領(lǐng)域建模?

jf_ro2CN3Fa ? 來(lái)源:技術(shù)瑣話(huà) ? 2023-07-18 14:11 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

7.1什么是DDD

DDD是Eric Evans在2003年出版的《領(lǐng)域驅(qū)動(dòng)設(shè)計(jì):軟件核心復(fù)雜性應(yīng)對(duì)之道》(Domain-Driven Design: Tackling Complexity in the Heart of Software)一書(shū)中提出的具有劃時(shí)代意義的重要概念,是指通過(guò)統(tǒng)一語(yǔ)言、業(yè)務(wù)抽象、領(lǐng)域劃分和領(lǐng)域建模等一系列手段來(lái)控制軟件復(fù)雜度的方法論。

DDD的革命性在于領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)是面向?qū)ο蠓治龅姆椒ㄕ?,它可以利用面向?qū)ο蟮奶匦裕ǚ庋b、多態(tài))有效地化解復(fù)雜性,而傳統(tǒng)J2EE或Spring+Hibernate等事務(wù)性編程模型只關(guān)心數(shù)據(jù)。這些數(shù)據(jù)對(duì)象除了簡(jiǎn)單的setter/getter方法外,不包含任何業(yè)務(wù)邏輯,業(yè)務(wù)邏輯都是以過(guò)程式的代碼寫(xiě)在Service中。這種方式極易上手,但隨著業(yè)務(wù)的發(fā)展,系統(tǒng)也很容易變得混亂復(fù)雜。

7.2初步體驗(yàn)DDD

在介紹DDD之前,我喜歡用這個(gè)銀行轉(zhuǎn)賬的案例來(lái)做一個(gè)DDD和事務(wù)腳本(Transaction Script)的簡(jiǎn)單對(duì)比。我們要實(shí)現(xiàn)一個(gè)銀行轉(zhuǎn)賬的功能,如果用傳統(tǒng)的事務(wù)腳本方式實(shí)現(xiàn),業(yè)務(wù)邏輯通常會(huì)被寫(xiě)在MoneyTransferService中,而Account僅僅是getters和setters的數(shù)據(jù)結(jié)構(gòu),也就是所謂的“貧血模式”。其代碼如下所示:

publicclassMoneyTransferServiceTransactionScriptImpl
implementsMoneyTransferService{
privateAccountDaoaccountDao;
privateBankingTransactionRepositorybankingTransactionRepository;
...
@Override
publicBankingTransactiontransfer(
StringfromAccountId,StringtoAccountId,doubleamount){
AccountfromAccount=accountDao.findById(fromAccountId);
AccounttoAccount=accountDao.findById(toAccountId);
...
doublenewBalance=fromAccount.getBalance()-amount;
switch(fromAccount.getOverdraftPolicy()){
caseNEVER:
if(newBalance

上述代碼有些讀者可能會(huì)比較眼熟,因?yàn)榇蟛糠窒到y(tǒng)都是這么寫(xiě)的。評(píng)審?fù)晷枨螅?a target="_blank">工程師畫(huà)幾張UML圖完成設(shè)計(jì),就開(kāi)始像上面這樣寫(xiě)業(yè)務(wù)代碼了,這樣寫(xiě)基本不用太動(dòng)腦筋,完全是過(guò)程式的代碼風(fēng)格。

同樣的業(yè)務(wù)邏輯,接下來(lái)看使用領(lǐng)域建模是怎么做的。在使用DDD之后,Account實(shí)體除賬號(hào)屬性之外,還包含了行為和業(yè)務(wù)邏輯,比如debit()和credit()方法。

publicclassAccount{
privateStringid;
privatedoublebalance;
privateOverdraftPolicyoverdraftPolicy;
...
publicdoublebalance(){returnbalance;}
publicvoiddebit(doubleamount){
this.overdraftPolicy.preDebit(this,amount);
this.balance=this.balance-amount;
this.overdraftPolicy.postDebit(this,amount);
}
publicvoidcredit(doubleamount){
this.balance=this.balance+amount;
}}

透支策略O(shè)verdraftPolicy也不僅僅是一個(gè)Enum了,而是被抽象成包含業(yè)務(wù)規(guī)則并采用策略模式的對(duì)象。

publicinterfaceOverdraftPolicy{
voidpreDebit(Accountaccount,doubleamount);
voidpostDebit(Accountaccount,doubleamount);}publicclassNoOverdraftAllowedimplementsOverdraftPolicy{
publicvoidpreDebit(Accountaccount,doubleamount){
doublenewBalance=account.balance()-amount;
if(newBalance

而Domain Service只需要調(diào)用Domain Entity對(duì)象完成業(yè)務(wù)邏輯。

publicclassMoneyTransferServiceDomainModelImpl
implementsMoneyTransferService{
privateAccountRepositoryaccountRepository;
privateBankingTransactionRepositorybankingTransactionRepository;
...
@Override
publicBankingTransactiontransfer(
StringfromAccountId,StringtoAccountId,doubleamount){
AccountfromAccount=accountRepository.findById(fromAccountId);
AccounttoAccount=accountRepository.findById(toAccountId);
...
fromAccount.debit(amount);
toAccount.credit(amount);
BankingTransactionmoneyTransferTransaction=
newMoneyTranferTransaction(fromAccountId,toAccountId,amount);
bankingTransactionRepository.addTransaction(moneyTransferTransaction);
returnmoneyTransferTransaction;
}}

通過(guò)DDD重構(gòu)后,雖然類(lèi)的數(shù)量比以前多了一些,但是每個(gè)類(lèi)的職責(zé)更加單一,代碼的可讀性和可擴(kuò)展性也隨之提高。

基于 Spring Cloud Alibaba + Gateway + Nacos + RocketMQ + Vue & Element 實(shí)現(xiàn)的后臺(tái)管理系統(tǒng) + 用戶(hù)小程序,支持 RBAC 動(dòng)態(tài)權(quán)限、多租戶(hù)、數(shù)據(jù)權(quán)限、工作流、三方登錄、支付、短信、商城等功能

項(xiàng)目地址:https://github.com/YunaiV/yudao-cloud

視頻教程:https://doc.iocoder.cn/video/

7.3數(shù)據(jù)驅(qū)動(dòng)和領(lǐng)域驅(qū)動(dòng)

7.3.1數(shù)據(jù)驅(qū)動(dòng)

目前主流的開(kāi)發(fā)模式是由數(shù)據(jù)驅(qū)動(dòng)的。數(shù)據(jù)驅(qū)動(dòng)的開(kāi)發(fā)很容易上手,

有了業(yè)務(wù)需求,創(chuàng)建數(shù)據(jù)庫(kù)表,然后編寫(xiě)業(yè)務(wù)邏輯,開(kāi)發(fā)過(guò)程如圖7-1所示。數(shù)據(jù)驅(qū)動(dòng)以數(shù)據(jù)庫(kù)為中心,其中最重要的設(shè)計(jì)是數(shù)據(jù)模型,但隨著業(yè)務(wù)的增長(zhǎng)和項(xiàng)目的推進(jìn),軟件開(kāi)發(fā)和維護(hù)的難度會(huì)急劇增加。

a6587c8e-2531-11ee-962d-dac502259ad0.png

圖7-1數(shù)據(jù)驅(qū)動(dòng)研發(fā)過(guò)程

以客戶(hù)關(guān)系管理(Customer Relationship Management,CRM)為例,其中很重要的概念有銷(xiāo)售、機(jī)會(huì)、客戶(hù)、私海、公海,實(shí)體的定義分別如下。

銷(xiāo)售(Sales):公司的銷(xiāo)售人員,一個(gè)銷(xiāo)售可以擁有多個(gè)銷(xiāo)售機(jī)會(huì)。

機(jī)會(huì)(Opportunity):銷(xiāo)售機(jī)會(huì),每個(gè)機(jī)會(huì)包含至少一個(gè)客戶(hù)信息,且歸屬于一個(gè)銷(xiāo)售人員。

客戶(hù)(Customer):客戶(hù),也就是銷(xiāo)售的對(duì)象。

私海(Private sea):專(zhuān)屬于某個(gè)銷(xiāo)售人員的領(lǐng)地(Territory),私海里面的客戶(hù),其他銷(xiāo)售人員不能觸碰。

公海(Public sea):公共的領(lǐng)地,所有銷(xiāo)售人員都可以從公海里撿入客戶(hù)到其私海。

按照我們?cè)?jīng)學(xué)習(xí)的數(shù)據(jù)庫(kù)建模理論,對(duì)于上面的場(chǎng)景,不難畫(huà)出圖7-2所示的實(shí)體聯(lián)系(Entity Relationship,ER)圖。

a6656a02-2531-11ee-962d-dac502259ad0.png

圖7-2CRM的ER圖

可以看到,圖7-2所示的ER圖中不存在公海和私海,因?yàn)樗^的機(jī)會(huì)在私海,就是這個(gè)機(jī)會(huì)是不是歸屬某個(gè)銷(xiāo)售,這樣我們只需要看機(jī)會(huì)上是否有salesId。如果有,說(shuō)明機(jī)會(huì)被某個(gè)銷(xiāo)售占有,也就是在私海中;反之,這個(gè)機(jī)會(huì)就在公海中。

在這種開(kāi)發(fā)模式下,最后的產(chǎn)出是幾張數(shù)據(jù)庫(kù)表,以及針對(duì)表中數(shù)據(jù)進(jìn)行操作的事務(wù)腳本,如圖7-3所示。

a67ffa20-2531-11ee-962d-dac502259ad0.png

圖7-3事務(wù)腳本實(shí)現(xiàn)

7.3.2領(lǐng)域驅(qū)動(dòng)

領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)關(guān)心的是業(yè)務(wù)中的領(lǐng)域劃分(戰(zhàn)略設(shè)計(jì))和領(lǐng)域建模(戰(zhàn)術(shù)設(shè)計(jì)),其開(kāi)發(fā)過(guò)程不再以數(shù)據(jù)模型為起點(diǎn),而是以領(lǐng)域模型為出發(fā)點(diǎn),研發(fā)過(guò)程如圖7-4所示。領(lǐng)域模型對(duì)應(yīng)的是業(yè)務(wù)實(shí)體,在程序中主要表現(xiàn)為類(lèi)、聚合根和值對(duì)象,它更加關(guān)注業(yè)務(wù)語(yǔ)義的顯性化表達(dá),而不是數(shù)據(jù)的存儲(chǔ)和數(shù)據(jù)之間的關(guān)系。 這是“領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)”和“數(shù)據(jù)驅(qū)動(dòng)設(shè)計(jì)”之間顯著的區(qū)別。

a68bec2c-2531-11ee-962d-dac502259ad0.png

圖7-4領(lǐng)域驅(qū)動(dòng)研發(fā)過(guò)程

仍以上面的CRM為例。假如我們先不考慮數(shù)據(jù)模型,而是采用面向?qū)ο蠓治觯∣bject Oriented Analysis,OOA)對(duì)這個(gè)場(chǎng)景進(jìn)行領(lǐng)域建模,那么可以得到圖7-5所示的領(lǐng)域模型。

a6a14a4a-2531-11ee-962d-dac502259ad0.png

圖7-5CRM的領(lǐng)域模型

可以看到,在圖7-5中,領(lǐng)域模型的描述更加貼近業(yè)務(wù),一些重要的業(yè)務(wù)術(shù)語(yǔ)和概念沒(méi)有丟失,更完整地表達(dá)了業(yè)務(wù)語(yǔ)義。即使是產(chǎn)品經(jīng)理或者業(yè)務(wù)人員,也不難看懂這樣的領(lǐng)域模型,甚至他們可以和技術(shù)人員一起參與到梳理領(lǐng)域模型和創(chuàng)建活動(dòng)中來(lái)。

通過(guò)DDD的戰(zhàn)略設(shè)計(jì)和戰(zhàn)術(shù)設(shè)計(jì),我們可以為問(wèn)題域劃分出合適的子域,并對(duì)域中的業(yè)務(wù)進(jìn)行建模。圖7-6所示是我們?cè)趯?shí)際工作中為CRM進(jìn)行的領(lǐng)域戰(zhàn)略設(shè)計(jì)。

a6ba018e-2531-11ee-962d-dac502259ad0.jpg

圖7-6CRM的領(lǐng)域劃分

7.3.3ORM

很明顯,領(lǐng)域模型和數(shù)據(jù)模型并不是一一對(duì)應(yīng)的關(guān)系,但也不排除,有些情況領(lǐng)域模型和數(shù)據(jù)模型是趨同的,但是大部分情況都需要做一層映射(Mapping)。為了彌補(bǔ)二者之間的差異,行業(yè)先驅(qū)們做了很多關(guān)于映射工作的嘗試,這種技術(shù)有一個(gè)名稱(chēng)叫作對(duì)象關(guān)系映射(Object Relationship Mapping,ORM),如圖7-7所示。

a6d87678-2531-11ee-962d-dac502259ad0.png

圖7-7對(duì)象關(guān)系映射

ORM曾經(jīng)非?;穑浀卯?dāng)年Hibernate才出現(xiàn)時(shí),我用盡了其中的高級(jí)技巧,比如繼承關(guān)系映射、多對(duì)多關(guān)系映射……結(jié)果弄出來(lái)的東西卻變成了“四不像”,既不像Entity,也不像數(shù)據(jù)對(duì)象(Data Object,DO)。

ORM的問(wèn)題在于它太理想化,期望通過(guò)工具把數(shù)據(jù)建模和領(lǐng)域建模合一,這樣的嘗試注定是很難成功的。仍以上述的CRM案例為例,在數(shù)據(jù)模型中根本就沒(méi)有私海和公海這兩個(gè)實(shí)體,工具是無(wú)法映射的。因此,Hibernate和JPA的衰落是可以預(yù)見(jiàn)的?,F(xiàn)在使用最多的是MyBatis,它很簡(jiǎn)單,完全不理會(huì)復(fù)雜的關(guān)系和對(duì)象之間的復(fù)雜關(guān)系映射,只做數(shù)據(jù)庫(kù)表和DO之間的簡(jiǎn)單映射。

復(fù)雜的數(shù)據(jù)庫(kù)關(guān)系和對(duì)象關(guān)系之間的差異,其本質(zhì)是數(shù)據(jù)模型和領(lǐng)域模型之間的差異,而這種差異的多樣性和靈活性是很難通過(guò)規(guī)則預(yù)先定義的,這也是為什么工具的作用會(huì)很有限?,F(xiàn)在的互聯(lián)網(wǎng)大廠大多使用MyBatis,原因也在于此。因此,如果你打算實(shí)踐DDD,請(qǐng)一定不要讓工具幫你去建模,工具不會(huì)抽象,也不會(huì)思考,還是要老老實(shí)實(shí)自己動(dòng)手去建。






審核編輯:劉清

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • CRM
    CRM
    +關(guān)注

    關(guān)注

    1

    文章

    152

    瀏覽量

    22135
  • 數(shù)據(jù)驅(qū)動(dòng)器

    關(guān)注

    0

    文章

    5

    瀏覽量

    6268
  • ddd
    ddd
    +關(guān)注

    關(guān)注

    0

    文章

    23

    瀏覽量

    3108

原文標(biāo)題:DDD的精髓

文章出處:【微信號(hào):芋道源碼,微信公眾號(hào):芋道源碼】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    Android APP如何進(jìn)行訪問(wèn)硬件驅(qū)動(dòng)

    本文我們要講的是在用 i.MX8 平臺(tái)開(kāi)發(fā)時(shí),Android APP 如何進(jìn)行訪問(wèn)硬件驅(qū)動(dòng)。
    的頭像 發(fā)表于 12-04 13:50 ?3275次閱讀
    Android APP如<b class='flag-5'>何進(jìn)行</b>訪問(wèn)硬件<b class='flag-5'>驅(qū)動(dòng)</b>

    何進(jìn)行FSM任意狀態(tài)建模

    兩個(gè)快速問(wèn)題:1)我有以下?tīng)顟B(tài)圖:如您所見(jiàn),一些狀態(tài)轉(zhuǎn)換是明確確定的,一些轉(zhuǎn)換是任意的。例如,當(dāng)處于空閑狀態(tài)時(shí),下一狀態(tài)可以是就緒狀態(tài)或保持空閑狀態(tài)。我怎樣才能在VHDL中對(duì)此進(jìn)行建模(不是一切
    發(fā)表于 10-31 07:18

    基于領(lǐng)域建模的數(shù)控系統(tǒng)代碼生成技術(shù)

    為提高數(shù)控軟件系統(tǒng)開(kāi)發(fā)效率,提出基于領(lǐng)域建模的代碼自動(dòng)生成開(kāi)發(fā)方法。該方法在數(shù)控領(lǐng)域元模型的基礎(chǔ)上建立了數(shù)控系統(tǒng)的建模環(huán)境,以模型數(shù)據(jù)到源代碼的映射規(guī)則庫(kù)為基
    發(fā)表于 04-02 08:36 ?11次下載

    綜合航電領(lǐng)域建模技術(shù)研究

    為了方便對(duì)綜合化航空電子系統(tǒng)的領(lǐng)域建模,通過(guò)對(duì)綜合航電系統(tǒng)的領(lǐng)域分析,提出了綜合航電系統(tǒng)的參考模型;在此基礎(chǔ)上,使用通用建模環(huán)境GME設(shè)計(jì)了綜合航電系統(tǒng)的系統(tǒng)級(jí)、模塊級(jí)、分區(qū)級(jí)以及進(jìn)程級(jí)的元模型
    發(fā)表于 01-04 14:55 ?0次下載

    黑客攻防入門(mén)與進(jìn)階ddd

    黑客攻防入門(mén)與進(jìn)階ddd黑客攻防入門(mén)與進(jìn)階ddd
    發(fā)表于 02-23 15:45 ?9次下載

    詳解領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)和spring

    領(lǐng)域驅(qū)動(dòng)設(shè)計(jì) Eric Evans的《領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)》無(wú)疑是軟件設(shè)計(jì)領(lǐng)域最重要的幾本書(shū)之一。 這本書(shū)主要集中在軟件開(kāi)發(fā)中如何處理
    發(fā)表于 09-27 12:51 ?0次下載
    詳解<b class='flag-5'>領(lǐng)域</b><b class='flag-5'>驅(qū)動(dòng)</b>設(shè)計(jì)和spring

    詳解領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)和spring

    領(lǐng)域驅(qū)動(dòng)設(shè)計(jì) Eric Evans的《領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)》無(wú)疑是軟件設(shè)計(jì)領(lǐng)域最重要的幾本書(shū)之一。 這本書(shū)主要集中在軟件開(kāi)發(fā)中如何處理
    發(fā)表于 09-27 12:51 ?0次下載
    詳解<b class='flag-5'>領(lǐng)域</b><b class='flag-5'>驅(qū)動(dòng)</b>設(shè)計(jì)和spring

    何進(jìn)行正確數(shù)據(jù)建模

    理解數(shù)據(jù)是控制任何企業(yè)的先決條件。但只有當(dāng)這些知識(shí)能夠被分享和傳播時(shí),理解才是有用的。有效的數(shù)據(jù)建模應(yīng)該是任何企業(yè)架構(gòu)師的首要關(guān)注點(diǎn)。
    的頭像 發(fā)表于 09-28 02:37 ?4398次閱讀

    何進(jìn)行OPCDCOM配置

    何進(jìn)行OPCDCOM配置(四會(huì)理士電源技術(shù)有限公司招聘)-如何進(jìn)行OPCDCOM配置? ? ? ? ? ? ? ? ? ? ??
    發(fā)表于 09-18 14:23 ?11次下載
    如<b class='flag-5'>何進(jìn)行</b>OPCDCOM配置

    SystemVerilog對(duì)硬件功能如何進(jìn)行建模

    本文定義了通常用于描述使用SystemVerilog對(duì)硬件功能進(jìn)行建模的詳細(xì)級(jí)別的術(shù)語(yǔ)。
    的頭像 發(fā)表于 03-30 11:42 ?2632次閱讀

    用好DDD必須先過(guò)Spring Data這關(guān)

    DDD 是一種領(lǐng)域驅(qū)動(dòng)的設(shè)計(jì)方法,旨在通過(guò)建立對(duì)領(lǐng)域模型的清晰理解來(lái)解決業(yè)務(wù)問(wèn)題。和事務(wù)腳本不同,DDD 使用面向?qū)ο笤O(shè)計(jì)來(lái)應(yīng)對(duì)復(fù)雜的業(yè)務(wù)場(chǎng)
    的頭像 發(fā)表于 03-07 09:38 ?2728次閱讀

    一文理解DDD領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)

    2004年Eric Evans 發(fā)表Domain-Driven Design –Tackling Complexity in the Heart of Software (領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)),簡(jiǎn)稱(chēng)Evans DDD。
    的頭像 發(fā)表于 05-25 14:21 ?1586次閱讀
    一文理解<b class='flag-5'>DDD</b><b class='flag-5'>領(lǐng)域</b><b class='flag-5'>驅(qū)動(dòng)</b>設(shè)計(jì)

    DDD是什么?DDD核心概念梳理

    DDD 是什么,DDD 的英文全稱(chēng)是 Domain-Driven Design,翻譯過(guò)來(lái)就是領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)。
    的頭像 發(fā)表于 09-07 11:12 ?1.2w次閱讀
    <b class='flag-5'>DDD</b>是什么?<b class='flag-5'>DDD</b>核心概念梳理

    cad如何進(jìn)行三維建模

    三維建模是計(jì)算機(jī)輔助設(shè)計(jì)(CAD)中的一項(xiàng)重要技術(shù),它可以幫助設(shè)計(jì)師在計(jì)算機(jī)上創(chuàng)建和編輯三維模型。本文將介紹如何使用CAD軟件進(jìn)行三維建模,包括建模的基本步驟、
    的頭像 發(fā)表于 07-09 10:23 ?3646次閱讀

    DDD學(xué)習(xí)與感悟——向屎山?jīng)_鋒

    軟件系統(tǒng)是通過(guò)軟件開(kāi)發(fā)來(lái)解決某一個(gè)業(yè)務(wù)領(lǐng)域或問(wèn)題單元而產(chǎn)生的一個(gè)交付物。而通過(guò)軟件設(shè)計(jì)可以幫助我們開(kāi)發(fā)出更加健壯的軟件系統(tǒng)。因此,軟件設(shè)計(jì)是從業(yè)務(wù)領(lǐng)域到軟件開(kāi)發(fā)之間的橋梁。而DDD是軟件設(shè)計(jì)中的其中
    的頭像 發(fā)表于 09-24 13:31 ?1006次閱讀
    <b class='flag-5'>DDD</b>學(xué)習(xí)與感悟——向屎山?jīng)_鋒