外鏈工作是個(gè)辛苦活,所以我們站長(zhǎng)朋友的辛勞不能空費(fèi),靜下心來(lái)看看自己做了多少無(wú)用外鏈吧。發(fā)外鏈不是隨意找一個(gè)網(wǎng)站,而后寫幾個(gè)文字,放上個(gè)鏈接這么簡(jiǎn)單的,我們應(yīng)當(dāng)要有更加全面的斟酌,控制一些外鏈的發(fā)布技能,讓發(fā)外鏈的工作更加高效。
“可是王總,我們的系統(tǒng)不能支持這種非實(shí)物的服務(wù)預(yù)訂銷售,它可能對(duì)我們?cè)械木W(wǎng)站造成宏大的沖擊,我們需要三個(gè)月的時(shí)間對(duì)這個(gè)業(yè)務(wù)進(jìn)行全方面的評(píng)估…”
人物先容:
無(wú)用外鏈二:須要登錄才干查看的外鏈
王總——“寵物商店”的總經(jīng)理,從美國(guó)留學(xué)后回國(guó)創(chuàng)建“寵物商店”網(wǎng)站。一路來(lái)唾手可得的成功讓他養(yǎng)成了執(zhí)拗跋扈的行事風(fēng)格。
用大比例構(gòu)造對(duì)你的系統(tǒng)進(jìn)行領(lǐng)域劃分
許多論壇版塊會(huì)有我們站長(zhǎng)友人去回帖做外鏈,“頂啊”、“支持樓主”、“知道了”等等這種沒有任何意思的回帖到處可見,現(xiàn)在很多外鏈發(fā)布職員在這樣盲目標(biāo)操作,這些垃圾外鏈的意義就可想而知。
Spark以商品詳情頁(yè)這個(gè)Use Case為例展現(xiàn)了以領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)的重構(gòu)類圖:
領(lǐng)域?qū)ν?頁(yè)面、AJAX、ESB調(diào)用)只裸露領(lǐng)域服務(wù),其它所有范疇類都是包內(nèi)自閉的,對(duì)外不可見。
Spark —— Jack Chen的大學(xué)同窗,一家貿(mào)易軟件公司的高等征詢參謀。最近熱衷于宣傳“領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)”的最佳實(shí)際。
Jack Chen周一一早就被高興的王總給喊進(jìn)了辦公室,馬上就被王總?cè)映鰜?lái)的idea嚇傻了。
外鏈對(duì)于一個(gè)網(wǎng)站如許主要,想必大家都很明白,尤其是一個(gè)愿望從搜索引擎獲得流量的網(wǎng)站,如果你沒有海量的優(yōu)質(zhì)內(nèi)容,那么外鏈會(huì)成為網(wǎng)站獲得搜索引擎親睞的最重要指標(biāo)。很多人都意識(shí)到了這一點(diǎn),每天也在不停的發(fā)外鏈、換友鏈,但是你有沒有想過(guò),自己發(fā)外鏈的過(guò)程中做了多少無(wú)用功?
“好吧,Spark,我否認(rèn)你給推舉的書無(wú)比棒,你說(shuō)的也很有情理。我讀了它,明確并一些概念——例如:領(lǐng)域宰割 、Entity、Service、Value Object…,可我對(duì)于該如何去做還是一頭霧水。你能不能直接把你從重構(gòu)項(xiàng)目中失掉的最佳實(shí)踐直接分享給我呢?不然的話,周一王胖子是不會(huì)放過(guò)交不出謎底的我的!”。讀完了這本書,Jack Chen感到很有播種,但又不知道怎么開始,打個(gè)電話給領(lǐng)域建模的先行者Spark也許真的是解決問(wèn)題最快的方法。
圖1 原寵物商店UseCase匯總圖
事務(wù)配置在DomainService的invoke()方法上,即事務(wù)把持以Use Case為粒度進(jìn)行節(jié)制。
一、概要領(lǐng)域劃分
無(wú)用外鏈四:博客外鏈及獨(dú)立博客評(píng)論
在Spark的贊助下,Jack Chen勝利的脫離了窘境。當(dāng)初他正在公司里踴躍推行本人的領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)框架,他們公司的網(wǎng)站正在以每三周一次的重構(gòu)速度疾速迭代演進(jìn)。他象Spark一樣,成為了一個(gè)領(lǐng)域驅(qū)動(dòng)的布道者。
基礎(chǔ)倉(cāng)庫(kù)Repository通過(guò)Infrastructure中的DAO封裝了對(duì)實(shí)體的操作,如create()、update()、delete()、findById()、findList()
這一點(diǎn),是《領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)》這本書沒有過(guò)多提及的內(nèi)容。這個(gè)需要聯(lián)合你們公司的本來(lái)技術(shù)框架用最小化改革本錢最大化收益的方式來(lái)建立領(lǐng)域驅(qū)動(dòng)的技術(shù)框架。下面是一個(gè)可以普遍使用的領(lǐng)域驅(qū)動(dòng)的技術(shù)框架,可以在這之上增加更多的個(gè)性元素構(gòu)成你公司自己的框架。
序幕
就象大家所聽說(shuō)過(guò)的那些神奇小子創(chuàng)業(yè)故事一樣,幾只從大西洋游回的海龜找到了一個(gè)巨大的idea——在互聯(lián)網(wǎng)上創(chuàng)辦在線商店銷售寵物。幸好的是他們找到了投資者而且發(fā)展的很不錯(cuò)。但是隨著時(shí)間的推移,當(dāng)初“完善”的技術(shù)架構(gòu)跟著越來(lái)越多的裝進(jìn)籃子的需求后變得不堪重負(fù)。作為公司首席架構(gòu)師的Jack Chen已經(jīng)被這幾個(gè)月“雞毛蒜皮”的需求折磨失眠好幾天啦。
下面我們就按照這個(gè)次序來(lái)實(shí)踐一下:
三、建立技術(shù)框架
每個(gè)寵物醫(yī)院天天都只能接收一定數(shù)目的預(yù)約,從這個(gè)概念上來(lái)說(shuō),它與什物商品有相似的庫(kù)存概念??墒俏以撛趺慈ケ戆姿鼈兡?
圖2 寵物商店領(lǐng)域通道圖
通道圖是一個(gè)對(duì)業(yè)務(wù)領(lǐng)域建模異常有幫助的工具,它可以同時(shí)抒發(fā)出履行序列與分片的作用。
外鏈沒有被收錄只能起到吸引蜘蛛的作用,并不能提升網(wǎng)站的權(quán)重和排名。良多人一天發(fā)了數(shù)十個(gè)外鏈,最后可能只收錄了多少個(gè)甚至一個(gè)都沒有收錄,那么你所做的外鏈簡(jiǎn)直起不到什么作用。我們?cè)诎l(fā)外鏈的進(jìn)程中必定要注意統(tǒng)計(jì),哪里發(fā)的外鏈?zhǔn)珍浛?,哪些外鏈不收錄。這里大家可以使用“
無(wú)用外鏈三:帶有跳轉(zhuǎn)的外鏈
圖3 領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)參考技術(shù)框架圖
布道
無(wú)用外鏈五:論壇水貼回復(fù)
了無(wú)生趣的Jack Chen在王總的辦公室門口彷徨了N圈,仍是不勇氣去迎接那一通暴風(fēng)暴雨般的中英文雙語(yǔ)版的恥辱漫罵?!耙苍S事件是有轉(zhuǎn)折的,我好象在哪里據(jù)說(shuō)過(guò)有種銀彈可以解決這種系統(tǒng)重構(gòu)的問(wèn)題的”?!霸撌攀?成都龍泉有哪些網(wǎng)站建設(shè)公司?,誰(shuí)把Spark送給我的《領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)》墊在顯示器下啦,他始終在向我布道這本書給他的名目帶來(lái)的種種神奇轉(zhuǎn)變,興許我也可以嘗嘗它的威力”。
銀彈
依照需求的緊迫度來(lái)重構(gòu)各個(gè)領(lǐng)域的設(shè)計(jì)與編碼
起源:InfoQ
增長(zhǎng)行動(dòng)表ProductExt用于存儲(chǔ)商品的擴(kuò)展信息,如預(yù)約時(shí)光段、預(yù)約醫(yī)院。并為表建立逐一對(duì)應(yīng)的實(shí)體Entity。
最要命的是:我真的要把這些所有受影響的Use Case都翻出來(lái)去讓它們支持虛擬物品的業(yè)務(wù)嗎?我怎么可能在2個(gè)月內(nèi)實(shí)現(xiàn)這些重構(gòu)?
評(píng)估
二、找出受影響的領(lǐng)域與接口
商品業(yè)務(wù)倉(cāng)庫(kù)ProductRepository擴(kuò)大了基礎(chǔ)倉(cāng)庫(kù),客戶程序可以用productId為參數(shù),通過(guò)ProductVo.getProduct()方法取得商品具體信息的業(yè)求實(shí)現(xiàn),因?yàn)闃I(yè)務(wù)倉(cāng)庫(kù)的的公然方法對(duì)外返回的都是Value Object,因而不會(huì)直接暴露Entity類型給客戶程序。
無(wú)用外鏈一:沒有被收錄的外鏈
樹立一個(gè)合適你們公司的領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)的技巧框架
之外,在【圖2】 頂用綠色標(biāo)識(shí)出來(lái)的Use Case是因?yàn)樵鎏碇巍霸诰€預(yù)約”這種虛構(gòu)商品所需要進(jìn)行代碼重構(gòu)的局部。這部門工作假如工期比擬緊,可以優(yōu)先使用模式的方法來(lái)進(jìn)行代碼重構(gòu),這樣也可以在之后更加輕易用領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)的辦法再次重構(gòu)。
“什么,這個(gè)問(wèn)題說(shuō)來(lái)話長(zhǎng)?沒關(guān)系,我已經(jīng)在你家門口了,你同我緩緩說(shuō)”,Jack Chen帶著星巴克咖啡+肯德基全家桶+久久鴨脖+諂諛的笑顏呈現(xiàn)在Spark家門口。
“在線預(yù)約”是個(gè)虛擬的商品,它可不需要真的需要去檢貨跟包裝發(fā)貨,如果然的那么做啦,我就太傻了。
有些外鏈?zhǔn)珍浐芎茫切枰卿浤芰Σ榭?,這種外鏈搜尋引擎是看不到的,對(duì)于我們網(wǎng)站來(lái)說(shuō)也沒有任何意義。有人習(xí)慣在論壇發(fā)布一篇文章,在文章的結(jié)尾加上自己的外鏈,自己在登錄狀況可以看到,但是別人或搜索引擎只能看到文章的前面一部分,后面的就看不到了。這種情況我們可以把外鏈放到文章的開頭盡量靠前。
商品信息需要增加“預(yù)約時(shí)間”這個(gè)屬性,客戶在下訂單時(shí)會(huì)把它作為標(biāo)識(shí)一個(gè)預(yù)約的要害因素。
基本設(shè)施的引用,基礎(chǔ)設(shè)施是用來(lái)承載援用非領(lǐng)域調(diào)用的樁,我們?cè)趹?yīng)用領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)的時(shí)候往往是從一個(gè)舊的體系重構(gòu)開端。這時(shí)我們不可能請(qǐng)求所有的業(yè)務(wù)子系統(tǒng)彼此調(diào)用都通過(guò)Domain Service調(diào)用,這時(shí)咱們能夠通過(guò)Infrastructure精美的把調(diào)用封裝在業(yè)務(wù)倉(cāng)庫(kù)的業(yè)務(wù)方式內(nèi)。
獨(dú)立博客評(píng)論普通可以加錨文本,但是現(xiàn)在不帶“nofollow”標(biāo)簽的博客評(píng)論很少了。另外,很多主流博客也有這種情況,好比網(wǎng)易博客等,起不到我們盼望的外鏈效果。
為了支持“在線預(yù)約”這種特別的產(chǎn)品,它會(huì)影響到大部分的Use Case,詳細(xì)列舉如下:
基礎(chǔ)倉(cāng)庫(kù)的引入,基礎(chǔ)倉(cāng)庫(kù)是一個(gè)形象的倉(cāng)庫(kù),它封裝了大批常用工具方法、業(yè)務(wù)對(duì)象性命周期保護(hù)(實(shí)體OR映射、DAO調(diào)用)、外部接口調(diào)用??梢韵陆禈I(yè)務(wù)倉(cāng)庫(kù)不用要的反復(fù)編碼與龐雜性。業(yè)務(wù)倉(cāng)庫(kù)是繼續(xù)基礎(chǔ)倉(cāng)庫(kù)的子類。
這個(gè)框架的各個(gè)元素基礎(chǔ)上在 《領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)》一書中都可以找到對(duì)應(yīng)的說(shuō)明,但這里需要解釋一下我建立這個(gè)框架的個(gè)性懂得:
Jack Chen立刻把自己之前畫的Use Case重畫了一遍,然后用期望的眼神看著Spark等候著認(rèn)可?!澳愕倪^(guò)錯(cuò)是過(guò)于重視Case或者操作者身份,領(lǐng)域的劃分不是基于功效或角色來(lái)進(jìn)行的,通常來(lái)說(shuō)我們是將內(nèi)聚水平較高的Use Case歸到一個(gè)高低文中。盡量使得領(lǐng)域自閉程度較高,并占有雷同的業(yè)務(wù)語(yǔ)言環(huán)境。例如基于你的Use Case圖,我會(huì)畫出以下的領(lǐng)域”
這些大家個(gè)別都已經(jīng)留神到了,比方西祠和搜搜問(wèn)問(wèn)的外鏈,它們權(quán)重固然高,然而對(duì)外鏈都做了跳轉(zhuǎn),對(duì)于網(wǎng)站權(quán)重的晉升后果甚微。有些論壇也是屬于這種情形,大家宣布外鏈的時(shí)候多注意一下。
圖4 重構(gòu)后的商品詳情頁(yè)類圖
本文由淘寶客推廣 供稿,轉(zhuǎn)載請(qǐng)注明出處。
找出這個(gè)需求影響的領(lǐng)域及對(duì)外接口
Jack Chen即時(shí)就被威風(fēng)凜凜的王總打斷了,“三個(gè)月的評(píng)估?我需要在兩個(gè)月內(nèi)就給我上線這個(gè)新業(yè)務(wù)。我們的投資人十分認(rèn)可我的idea,并要求我們立刻把這個(gè)項(xiàng)目上線,它可能會(huì)輔助我們提高超年的IPO價(jià)錢。你清楚嗎? DO IT ASAP!”
四、重構(gòu)受影響領(lǐng)域的設(shè)計(jì)與編碼
GetProductService服務(wù)類通過(guò)invoke()服務(wù)方法 對(duì)外(商品詳情頁(yè)面)提供服務(wù),它通調(diào)用業(yè)務(wù)倉(cāng)庫(kù)中的業(yè)務(wù)方法,并將接口規(guī)格化。
“好吧,也許這個(gè)該死的王胖子是對(duì)的。我們這個(gè)將技術(shù)與業(yè)務(wù)混在一起的亂攤子也是到了該整頓收拾的時(shí)候。”喃喃自語(yǔ)發(fā)了半小時(shí)怨言后的Jack Chen終于恢復(fù)到畸形狀態(tài)上來(lái)了,我想我應(yīng)該看看我們現(xiàn)在是什么樣子的,為了支持這個(gè)該死的“在線為寵物醫(yī)院提供在線預(yù)約的服務(wù)”的需求我們需要做出哪些改變。于是Jack Chen在白板上很快的就畫出了下面的Use Case圖來(lái)。
“我有一個(gè)很cool的主意,我們可以在線為寵物病院供給在線預(yù)約的服務(wù)業(yè)務(wù)。而不僅僅是賣掉它們,你曉得這象征著什么嗎?這是一個(gè)年產(chǎn)值上百億的市場(chǎng)!!!”。
Spark聽完了Jack Chen對(duì)于現(xiàn)狀及需要的描寫之后,一幅氣定神閑的樣子訕訕地說(shuō)出“這個(gè)很簡(jiǎn)略嘛,你現(xiàn)在需要做的只是這樣一些事情:”
從領(lǐng)域的角度來(lái)看,成都網(wǎng)頁(yè)設(shè)計(jì),只有商品對(duì)外暴露出來(lái)的接口是會(huì)影響到各個(gè)領(lǐng)域,需要優(yōu)先建破商品領(lǐng)域(ProductDomain)及讀取商品信息服務(wù)接口(GetProductService)來(lái)進(jìn)行重構(gòu)。
Jack Chen ——“寵物商店”的首席架構(gòu)架構(gòu)師,領(lǐng)有豐盛的軟件設(shè)計(jì)與建模教訓(xùn),但對(duì)新惹事物持猜忌立場(chǎng)。
引子