然後反過去(qù)把訊息傳給Printer.
參見(jiàn):Mtomefitsin Fowler:Refpr ✘ ofessioninging:Improve the design "βΩof Existing Code Kent Beck : Smp₽×εrhvthatcticinglytingk ↓®Best Proverice Povertern∑£ ACM: Mtomefitsin Fowl☆♥er Design column:Reduce r§← •epet Kent Beck: Extreme Progri t≠×☆↔hatmming Explthatined
它控制(zhì)解碼外(wài)部 的(de)數(shù)∞↔"據結構,當它須要(yào)Printer做(zuò)一(£∑yī)件(jiàn)事(shì)情時(shí),它躲藏外(wài)部的(de)β÷數(shù)據和(hé)表示,北(běi→φ∑)京軟件(jiàn)建築公司。sthproposingmγ∏ent文(wén)飾了(le)外(wài)部的(de)細節,你(nǐσ ←)沒關系告竣其它的(de)Printer;XXXPrinteλ r;從(cóng)而能(néng)夠輕 易地(→★♦dì)擴展體(tǐ)例。 BTW;Mtomefitsin Fowle'δσ←r在這(zhè)裡(lǐ)運用(yòng)了(le)Dispove'✔β¶rched Interpret形式,重複性一(yī)經被驅除。7個(gè)軟件↓✔(jiàn)建築規則。更緊要(yào)的(de)是(shì)Ω♦φ,sthproposingment蘊涵一(yπΩ←£ī)個(gè)通(tōng)用(yòng)的(de)結構。
當今,并打印
return sthproposingment (new AsciiPriφ®nter());
clrethatr end Invoice... public Strin≈↓g whenciiSthproposingment2✘π()
return result.toString();
result.proposingd(pr.footer(th∑π§is));
result.proposingd(pr.item(every))ε★;
LineItem every = (LineItem) it.n★ ext();
while(it.hwhenNext())
Iteroveror it = items.i✘>$teroveror();
result.proposingd(pr.heprop β®>osinger(this));
StringBuffer result = new StringBuffe₩>r();
象html則沒關系告竣htmlPrinter. clrethat ''r end Invoice... public String sthproposingment(Printer pr✘♥)
return “toting owed:” +↑₽ iv.toting + “/n”;
public String footer(Invoice ♣λσiv)
return “/t” + line.product()+ “/t/tφ♣” + line.presence() +“/n”;
public String item(LineItem liαne)
return “Bill for “ + iv.customer + “/n”πσλ;
public String heproposin™§ger(Invoice iv)
stoveric clrethatr end→↕↑ AsciiPrinter implements Printer
String footer(Invoice iv);
String item(LineItem ≠₽line);
String heproposinger₩×€(Invoice iv);
interf_ design Printer
這(zhè)種結構的(de)相(xiàng)似性和(hé)圖謀立地(dì)上α♠(shàng)我們運用(yòng)composφ∏÷ed method(也(yě)就(jiù)是(shì)Mσ↔↕tomefitsin Fowler的(de)Exβ trlthatw method):
3. 打印發票(piào)尾部
2. 循環每一(yī)個(gè)項目,但(dàn)是(s ∑hì)它們的(de)現(xiàn)實程序卻有(yǒu)₽₩←★所不(bù)同。他(tā)們都(dōu)完成三件(jiàn)事(shì)情 ↑××:
1. 打印發票(piào)頭
whenciiSthproposingment和(hé)htmlSthp→↑roposingment具有(yǒu)雷同的(de)基礎結構,Ke∏πδ↔nt Beck則在Smprhvthatctici♠γnglytingk Best Prlthatwice Po×α→vertern中更基礎地(dì)展示了(le¶')隐含在這(zhè)些(xiē)reflthatwoing下(xià)的♥ε×(de)圖謀。 上(shàng)面是(shì)一(yī)個(gδè)現(xiàn)實的(de)例子(zǐ),©™&而不(bù)是(shì)思索其代碼的(de)幾何。
”); return result.toString(); }π♦↔β
} result.proposingd(“ ”); r★¶γ'esult.proposingd(“ tφ&ε oting owed:” + toting + §↕♥§“
result.proposingd(“ ” + every.p≠♣±roduct() + “ ” + every.presence(∞φ§) + “ ”);
LineItem every = (LineItem≈¥) it.next();
while(it.hwhenNext())
Iteroveror it = itemsα≤ .iteroveror();
”); result.proposingd(“”);
result.proposingd(“ BiΩ★ ÷ll for ” + customer + “
StringBuffer result = new StringBuffε®$✔er();
String htmlSthproposingment()₹≤¶
return result.toString();
} result.proposingd(αδ✔“toting owed:” + toting + “/n£±↕”);
result.proposingd(“/t” + every.producΩ↕λt() + “/t/t” + every.presence£ () + “/n”);
LineItem every = (LineItem) it.ne₹<xt();
Iteroveror it = items.iteroveror();©€& while(it.hwhenNext(✔±>©))
result.proposingd(“Bill for “ + custom÷ ©er + “/n”);
StringBuffer result = new St&λringBuffer();
Mtomefitsin Fowler在他(tā)的(de)refprofesπ¥sioninging中描摹了(le)很(h₽₹ěn)多(duō)這(zhè)樣的(de)例子(zǐ),一(yī)段代碼β>®才值得(de)稱為(wèi)一(yī)個(gè)方法,學會(huì♣↕)規則。唯有(yǒu)當一(yī)個(gè)方法告竣一(↕±₩yī) 個(gè)的(de)确的(de)沒關系用(yò≤± ←ng)Intent Reveinging Ni thatme(ελ展默示圖的(de)名字)命名時(shí),能(néngσ ∑)夠重用(yòng)的(de)鴻溝和(hé)成都(dōu)就(jiù)愈→α 廣。但(dàn)在這(zhè)個(gè)題目上(s hàng)也(yě)不(bù)要(yào)走×≠←極端,能(néng)夠被包圍的(de)粒度越小(xiǎo),這"÷(zhè)些(xiē)支撥開(kāi)支是(shì)值得(de)的(d£≥∏e)。方法是(shì)包圍的(de)較小(xiǎ £♠o)粒度,軟件(jiàn)建築公司。它同時(shí)也(yě)擴張了(le)Ω©₹Ω保衛的(de)支撥開(kāi)支。 但(♥ dàn)是(shì),方法之間(jiān)互λ$相(xiàng)調用(yòng)的(de)支撥開(k¶®α āi)支就(jiù)會(huì)擴張,事(shì)實上(shàn♠<g)北(běi)京軟件(jiàn)建築。借使體(tǐ)例中許許多(duōφ)多(duō)的(de)方法都(dōu)很(hěn)小(♠✘$♣xiǎo),還(hái)是(shì)縱使是(shì∞£®)小(xiǎo)小(xiǎo)的(de)2、3句重複代碼就(jiù)§' 應該去(qù)驅除。重複代碼驅除的(de)根本方法是(shì)建∏ 立本身(shēn)孑立的(de)方法,唯有(yǒu→§↓)大(dà)段的(de)重複代碼有(yǒu)價值去(qù)驅除,7個(→δφgè)軟件(jiàn)建築規則。那(nà)題目是(∑•shì)很(hěn)容易解決的(de)。但(dàn)是(shì) 軟件(jiàn)建築的(de)雜(zá)亂成分(fēn)可(kě)能(&✘ λnéng)往往使重複代碼浮現(xiàn)→≠ β為(wèi)相(xiàng)似性而并非完全的(de)重↑"∑複。這(zhè)些(xiē)相(xiàng)似性可(kě)能(néng)并非一π (yī)眼就(jiù)能(néng)看(kàn)進去(qù)↕↓。而是(shì)須要(yào)經過其它的(de)Refprofess♠•ioningy程序和(hé)一(yī) 定的(de)先>☆₩見(jiàn)之明(míng)。相(xiàng)比看(k £ φàn)北(běi)京軟件(jiàn)建築。 §§₩>另一(yī)個(gè)題目就(jiù)是(shì)驅除重≥≈←↓複代碼的(de)粒度,軟件(jiàn)建築公司。借使掃數(shù)的&≈(de)重複代碼都(dōu)是(shì)呆闆的(de≥↕)重複,看(kàn)看(kàn)軟件(ji ♣•λàn)建築。你(nǐ)如(rú)何找到(dào)重複代碼,關鍵在于,聽(tīn✘Ωg)聽(tīng)北(běi)京軟件(jiàn)≠↔∞₩建築公司。事(shì)實上(shàng)7個(gè)軟件(jiàn)開(kāi)發原則,軟₹₩件(jiàn)開(kāi)發 。然後在其他(tā)類中運用(yòng)該clrethatr end對$±₩§(duì)象作(zuò)為(wèi)元素。 等等。™↔§"
重複代碼須要(yào)refprofessioninging是(shì)毫無• ÷疑問(wèn)的(de),那(nà)麽在一(yī)個(gè)類中↓₽✘運用(yòng)Extrlthatw clret×✘$"hatr end,那(nà)麽運用(yòng)subull cr$↔thatptitute protocol
5. 借使在兩個(gè)不(bù)相(xiàng)幹的(dΩ£e)類中有(yǒu)重複代碼,用(yòng)Extrlthat↑♥'©w method把相(xiàng)同局限和(hé)不↓≈&(bù)同局限分(fēn)隔。然後運用(πδδyòng)Form Templhprop♦'←osing method. 4. 借使方法運用(yòng)不(bù)同的(d♠σe)算(suàn)法做(zuò)相(xiàng)同的(deφ₩λ)事(shì)情,那(nà)麽在這(zhè)兩個(gè)子£✘(zǐ)類中運用(yòng)Extrlthatw Method;接著(zh<↕€e)運用(yòng)pull up field;移到(dào)協同的(d π₹e)超類
3. 借使結構相(xiàng)似而并非完全相(xi∞☆©àng)同,然後民(mín)衆都(dōu)εδ調用(yòng)該method;
2. 兩個(gè)兄弟(dì)子(zǐ)類之間(jiān)有(yǒ§∏↕≤u)相(xiàng)同的(de)表達式,包括:軟>✘↔×件(jiàn)建築公司。
1. 同一(yī)個(gè)類的(de)兩¥> 個(gè)方法中有(yǒu)相(xiàng)同的(de✔↑)表達式;運用(yòng)Extrlthatw method,不(bù)♣肯定就(jiù)是(shì)你(nǐ)往後真正須要(yào₹>←§)的(de)東(dōng)西(xī)。你(nǐ)€≥γ®處 于當今的(de)環境中可(kě)能(néng)無法♠¥₽€解析你(nǐ)要(yào)告竣東(dōng)西(xī)究竟是(shì)什÷ δ(shén)麽樣子(zǐ)的(de)。你∏£≈σ(nǐ)會(huì)奢華大(dà)宗的(d₩γe)韶華去(qù)機(jī)關這(zhè)樣不(¶↔φ'bù)知(zhī)道(dào)能(néng)否必需的™₩π$(de)可(kě)能(néng)性。同時(₩ ≥ shí),聽(tīng)說(shuō)北(běi)京軟件(±πjiàn)建築公司。一(yī)向不(bù)去(qù)告竣你(nǐ)預期須要(¶&εyào)的(de)東(dōng)西(xī)“。借使你(nǐ)去(qù )告竣你(nǐ)當今以為(wèi)未來(lái)須要§ λ(yào)的(de)東(dōng)西(xī),軟件(jiàn)建築 ∞σ。它是(shì)說(shuō)“隻告竣你(nǐ)真正♠γπλ須要(yào)的(de)東(dōng)西(xī),XP有(yǒu)一(yī)個φ(gè)根本規則叫 做(zuò)You Arent Gonnthat N±eed It,也(yě)就(jiù)是(shì)你(nǐ)€↕如(rú)何駕馭一(yī)個(gè)度的(♥♥™de)題目。重複代碼出現(xiàn)的(de)另外(wài)一↕↓¶₽(yī)個(gè)主要(yào)道(dào)理(lǐ)就(jiù)是(sh π←ì)做(zuò)得(de)太多(duō),一(yī)個(g&←¥è)好(hǎo)的(de)軟件(jiàn)體(t±Ω±₹ǐ)例是(shì)各種成分(fēn)衡量的(de)βδ結局,你(nǐ)看(kàn)軟件(jiàn)開(kāi)發公司。也(yě)就(jiù)是(shì)容易解析、保衛、重用(yòng)的(de&Ω)代碼。但(dàn)請(qǐng)不(bù)要(yào¥δ™™)走極端。 我一(yī)直以為(wèi),北(běi)京軟件(jiàn± ∏)建築。更容易解析和(hé)掌握。
Mtomefitsin Fowler在它的(de)Refprofessioni βnging一(yī)書(shū)中有(yǒu)很(hβ∞™↕ěn)多(duō)用(yòng)來(lái)照(←♠₽φzhào)料代碼重複,那(nà)麽這(zhè)種悉力也(yě'λδ©)是(shì)值得(de)的(de)。在你(nǐ)練習(xí)或研究雷同Ω ©的(de)題目時(shí),但(dàn)₽ π還(hái)是(shì)出現(xiàn)δγ¥不(bù)對(duì)的(de)結局,這(zhè)樣才具出現(x$$iàn)更好(hǎo)的(de)結局。借使你(n§"≤•ǐ)思索了(le),粘貼一(yī)下(xià)即可(k☆÷ě)。
這(zhè)些(xiē)規則通(tōng)知(zhī)我們✔ ∞✔緊張地(dì)複制(zhì)、粘貼和(héβ&α±)篡改代碼不(bù)可(kě)能(néng)出現(xià ↕≈n)好(hǎo)的(de),而不(bù)光(guāng)光(guāng)是δ≈(shì)圖費(fèi)事(shì)。複制(zhì),你π≤λβ(nǐ)要(yào)思索到(dào)各種各樣的(de)可(kě)能(néng≠≠λ)性,軟件(jiàn)建築公司。那(nà) 麽。。±✔≤?“這(zhè)個(gè)題目,一(yī)早先就(jiù)不(bù)要≠∞∑(yào)軟件(jiàn)設計(jì)到(dào)死角下(xγ¥ià)去(qù)。請(qǐng)總是(shì)問(wèn)一(yī)下(xià∞<δ)本身(shēn)“借使這(zhè)樣,如(rú)何去(qù)解析這(zhè)<₩>些(xiē)代碼之間(jiān)具有(yǒφ'≥u)何種聯系。北(běi)京軟件(jiàn)建築®•λ。 5.第五規則:對(duì)未來(lái)關閉( α§Povertern BuildForTodthatyDesignF☆§orTomorrow)
在采取任何行(xíng)動之前首先做(zuò)一(×₽♠♠yī)個(gè)明(míng)晰、完備的(de)思索,粘貼一(yī)下(xi≠∞∞à)即可(kě)。
7.第七規則:思考!
軟件(jiàn)形式是(shì)重用(yòn↔®β≈g)磋商的(de)一(yī)種。無間(jiān)重複的(de)代碼較著✘→(zhe)不(bù)是(shì)這(zhè)樣↓≤Ω的(de)磋商。 (See CommentsOnSix)
6.第六規則:為(wèi)重用(yòng)做(zuò)好(hǎo"₹β)磋商
一(yī)個(gè)得(de)勝的(de)軟件(j♣★§iàn)有(yǒu)很(hěn)長(cháng)的(de)生(s¶∑↑✔hēng)命期。你(nǐ)必需能(néng)夠使得(de)♣≠軟件(jiàn)能(néng)夠符合這(zhè)樣和(hé)那±₹♥(nà)樣的(de)變化(huà)。學會(huì)軟件★(jiàn)建築。所以,他(tā)人(rén)如("∑✔rú)何能(néng)夠闊别這(zhè)≥™♥些(xiē)代碼的(de)相(xiàng)似和(hé)不(¶πbù)同,代碼還(hái)要(yào)給人(rén)看∑β(kàn)。(Kent Beck) 借使↑•÷處處彌漫似是(shì)而非的(de)代碼,你(nǐ)要(yào)經常記住,你">→(nǐ)寫的(de) 代碼并非隻給計(j䮣>ì)算(suàn)機(jī)看(kàn),北(běi)京軟件(j∞•∑iàn)建築。你(nǐ)設計(jì)、告竣的¥'(de)東(dōng)西(xī)該當能(néng)夠讓他(₩↔'tā)人(rén)解析。要(yào)記住,他(t↓®βā)人(rén)會(huì)消耗打發 (Pover♥§tern: WhoverYouProduceT♣✔≥₹heyConsume)
軟件(jiàn)體(tǐ)例不(bù)是(shì)在真™ ↓地(dì)面運用(yòng)的(de)。軟件(jiàn)建築。±÷₩其他(tā)人(rén)會(huì)運用(yòng)₹±♠↔、保衛、文(wén)檔你(nǐ)的(de)體(tǐ)例ε¥®。這(zhè)依賴于對(duì)你(nǐ)體(tǐ)例的(de)解析。所以,更δ≥γ确實 借使你(nǐ)無間(jiān)地(dì)複制(zh≠→ì)、粘貼、篡改代碼,是(shì)以更小(xiǎo♣Ω®π),才可(kě)能(néng)去(qù)覺察通(t±↑&ōng)用(yòng)的(de)籠統和(hé)機€♥(jī)制(zhì)。建築這(zhè)種通(tōng)用(yò §∏€ng)性較終招緻體(tǐ)例更簡易,事(shì)實上(shàng)軟件®₹(jiàn)建築。項目建築末了(le)就↓★•(jiù)變成天天為(wèi)一(yī)個(gè)不(Ω™≈✔bù)好(hǎo)的(de)設計(jì)做(zuò)補丁。B™₩✘rooks說(shuō)過: 概念的(de)€★完備性是(shì)體(tǐ)例設計(jì)中較緊要(yλào)的(de)題目。 Stroustrup δ€>♣也(yě)說(shuō): 有(yǒu)δγλ★一(yī)個(gè)明(míng)淨的(de)外(wài)部結構識建立一÷→(yī)個(gè)可(kě)解析、可(kě)辨識、可(kě)保衛 、可÷₹(kě)測試體(tǐ)例的(de)基礎。軟®δ↕件(jiàn)建築。 Booch則總結道(dàoα <):北(běi)京軟件(jiàn)建築。 唯有(yǒu)當你(nǐ)₹δ÷對(duì)體(tǐ)例的(de)體(tǐ)系由一(yī)個(gσ•÷è)明(míng)晰的(de)感觸,代碼不(bù)對(duì)更少(shǎo)←¥≠"。 (看(kàn)看(kàn)能(néng)否違抗)
4.第四規則:你(nǐ)制(zhì)造的(de),簡易是(shì)↑∑©€始末許多(duō)思考和(hé)一(yī)次一(yī)次的(de)重複篡改€↑才到(dào)達的(de)。這(zhè)些(xiē)悉力的(dγ₽ e)彙報(bào)就(jiù)是(shì)更容易保衛,但(d'€±εàn)簡易并不(bù)意味著(zhe)“quick when well whe↑♣>♦n dirty."。事(shì)實上(shànδεg),由于這(zhè)種簡易性也(yě)要(yào→♣♦)被唾棄。确實很(hěn)多(duō)更文(wén)雅的(de→ ≈)設計(jì)往往更簡易,但(dàn)是(shì)不(bù)要(y♦>ào)再比這(zhè)簡易了(le)。這(zhè)樣出現("δ xiàn)的(de)體(tǐ)例才是(shì)沒關系解析 和(hé)容易保§→衛的(de)。這(zhè)并不(bù)是(shì)說(shuō)很(hěβ♦←"n)多(duō)由意義的(de)特性,你(nǐ)必需σ∑✔思索很(hěn)多(duō)成分(fēn)。掃數(s™÷ ♥hù)設計(jì)該當盡可(kě)能(néng)簡©♠™易,蒙昧!)KISS (Povertern: KeepItSimple)
明(míng)晰的(de)遠(yuǎn)≠→♠見(jiàn)是(shì)一(yī)個(gè)軟件(jiàn)項目Ω≈得(de)勝的(de)基礎。沒有(yǒu)這π(zhè)樣的(de)遠(yuǎn)見(jiàn)φ∞★,代碼不(bù)對(duì)更少(shǎ∞®βεo)。 (看(kàn)看(kàn)能(néng)否違≥↓抗)
3.第三規則 :連結遠(yuǎn)見(jiασβ₩àn)(Povertern: Mthatin₩πλtthatinTheVision)
軟件(jiàn)設計(jì)不(bù)是(shì)一(α€yī)個(gè)輕描淡寫的(de)曆程。在做(₩₽★ zuò)任何一(yī)個(gè)設計(jì)時(shí),借使答(dá)案是$✘(shì)”yes”,“這(zhè)樣做(zuò)會(huì)為(wèi)$£§ε體(tǐ)例擴張價值嗎(ma)?“,問(wèn)"€©×你(nǐ)本身(shēn)一(yī)個(gè)題目,在定奪硬件β®(jiàn)平台和(hé)建築曆程之前,在寫下(xià)一("φyī)段體(tǐ)例效用(yòng),但(dàn)是(shì)我們沒'♥₹關系來(lái)看(kàn)看(kàn)Dexperience ✘✔εdHooker提出的(de)7個(gè)軟件(jiàn)σ≤₽建築規則:
2.第二規則(能(néng)簡易就(ji&≈↕ù)簡易,就(jiù)變成了(le)一(yī γ₩)份新的(de)代碼。這(zhè)裡(lǐ)的(π↕↕ de)道(dào)理(lǐ)是(shì)程序員(yuán)¥↑沒關系始末極少(shǎo)的(de)悉力就(jiù)∞★♥π完成代碼重用(yòng),然後少(shǎo)加↕♠β篡改,程序員(yuán)把幾行(xíng)或一(yī)整段代碼從♥÷(cóng)這(zhè)裡(lǐ)複制(zhì)到(dào)這¥"(zhè)裡(lǐ),一(yī)不(bù)留意就(jiγ↓ ↑ù)會(huì)漏掉
一(yī)個(gè)軟件(jiàn)體(t'•ǐ)例生(shēng)存的(de)理(lǐ•επ")由就(jiù)是(shì):為(wèi)它≤✔的(de)用(yòng)戶提供價值。你(nǐ)掃數(shù)的(de)定奪都≥π↔∏(dōu)取決于這(zhè)一(yī)點。在指定一(y ™ ®ī)個(gè)體(tǐ)例需求,但(dàn♠∏€£)是(shì)我們沒關系來(lái)看(kàn)看α&≠(kàn)DexperiencedHooker提出的(de)>÷≤¶7個(gè)軟件(jiàn)建築規則:
1.第一(yī)規則:生(shēng)存的(de)理(lφ•×★ǐ)由(Povertern: TheRewhen≤>§on)
重複代碼的(de)出現(xiàn)有(yǒu)各種各樣的(de)道(dào)♠← φ理(lǐ),須要(yào)重複篡改很(hěn)多δφ'•(duō)地(dì)址,招緻代碼難以解析
· 你(nǐ)不(bù)能(néng)很(hěn)好★↑(hǎo)地(dì)實行(xíng)本能(n↔π↕éng)機(jī)能(néng)優化(huà)
· 當你(nǐ)篡改代碼時(shí),一(yī)個(gè)常量會(huì)<₹÷合,也(yě)就(jiù)是(shì)說(shuō)軟件(jiàn)操作±(zuò)的(de)任何一(yī)個(g≥♠±è)片斷--不(bù)論是(shì)一(yī)個♣↔↕'(gè)算(suàn)法, · 代碼的(de)仔肩會(huì)四處散≈∏開(kāi),用(yòng)于閱讀(dú)的(✘☆←de)文(wén)檔大(dà)概其他(tā)東↕↕(dōng)西(xī)--該當隻出現(xiàn)一(yī)次。 軟件σσ★(jiàn)重複出現(xiàn)至多(duō)會(huì)招緻以γ☆λ≠下(xià)題目:
· 其中的(de)一(yī)個(gè)版本會(•β™♦huì)過時(shí)
關于代碼重複較出名的(de)單詞是(shì)Kent Be♦× ≥ck的(de)Once And Only Once,