锘??xml version="1.0" encoding="utf-8" standalone="yes"?> 闂錛氱敱浜巐og4cpp-0.3.5rc3浠呮彁渚涗簡vc6鐨勫伐紼嬫枃浠訛紝鍥犳錛屼嬌鐢╲s2005鎵撳紑鍚庯紝闇瑕佽繘琛岃漿鎹€備絾鏄漿鎹㈠悗錛屼笉鑳芥紜紪璇戯紝鎻愮ずCustom Build Step鏃跺嚭鐜頒簡閿欒銆?/p>
鍒嗘瀽錛氬洜涓簂og4cpp鍦ㄧ敓鎴怤TEventLogAppender.dll鏃訛紝闇瑕佽繛鎺TEventLogCategories.mc鏂囦歡銆傛墍浠ワ紝欏圭洰璁劇疆浜嗚嚜瀹氫箟鐨勭敓鎴愭楠ゅ幓鐢熸垚NTEventLogAppender.dll銆備絾浠巚c6鐨勫伐紼嬫枃浠惰漿鎹㈡椂錛岃繖浜涙楠ゅ嵈娌℃湁姝g‘鐨勮漿鎹㈣繃鏉ャ備粠鑰屽嚭鐜頒笂榪伴棶棰樸?/p>
瑙e喅鏂規硶錛氶噸鏂板~鍐機ustom Build Step欏廣?/p>
鍏朵腑錛孋ommandLine濉啓浠ヤ笅鍐呭錛?/p>
if not exist $(OutDir) md $(OutDir) Outputs濉啓錛?(OutDir)\NTEventLogAppender.dll 閫傜敤鑼冨洿錛歭og4cpp欏圭洰銆乴og4cppDLL欏圭洰鐨凞ebug鍜孯elease閰嶇疆銆傚悓鏃訛紝璇ユ柟娉曢傜敤浜巚s2003(vc7.1)銆?/p>
涓嶅湪鍚屼竴涓寘鍐呯殑鍙備笌鑰呫佺敤渚嬨佺被銆佹瀯浠跺拰鍖咃紝鍚嶇О鍙互鐩稿悓銆備笉鍚岀殑妯″瀷鍏冪礌鎷ユ湁鐩稿悓鐨勫悕縐版椂錛岃繖浜涘厓绱犺縐頒負鈥滈噸杞解?br />閲嶈澆鍏佽浣犺繘琛屽熀浜庡璇█鏋勪歡鐨勫紑鍙戙?br />閲嶈澆鍏佽鐢ㄤ緥瑙嗗浘涓殑鍙備笌鑰呭拰閫昏緫瑙嗗浘涓殑綾繪嫢鏈夌浉鍚岀殑鍚嶇О
濡傛灉鍦ㄥ叾瀹冨寘涓瓨鍦ㄥ叿鏈夌浉鍚屽悕縐扮殑璁捐鍏冪礌錛岀郴緇熶細鎻愮ず浣狅紝姝ゆ椂鐐光滅‘瀹氣濆嵆鍙?br /> 閫昏緫瑙嗗浘:鎻忚堪緋葷粺璁捐妯″瀷錛屽寘鍚笌緋葷粺緇撴瀯鏈閲嶈鎰忎箟鐨勯儴鍒嗭紝姣斿錛岀郴緇熷垎瑙f垚涓虹殑瀛愮郴緇燂紝瀛愮郴緇熷垎瑙f垚澶氫釜綾伙紝浠ュ強榪欎簺鍏冪礌鐨勮亴璐o紝鍏崇郴錛屾搷浣滃拰灞炴?/p>
榪涚▼瑙嗗浘錛氭弿榪扮郴緇熷垎瑙f垚綰跨▼鍙婅繘紼嬬殑榪囩▼錛屾弿榪扮嚎紼嬶紙榪涚▼錛夐氳妯¤瘯絳?/p>
閮ㄧ講瑙嗗浘錛氭弿榪拌繍琛岀郴緇熺殑鐗╃悊紜歡錛堝寘鍚綉緇滐級閰嶇疆錛岃鏄庢瘡涓妭鐐圭殑璁$畻鏈猴紝CPU錛屾搷浣滅郴緇熶互鍙婂畠浠簰鑱旂殑鎯呭喌錛岃繕瑕佸寘鎷繘紼嬪埌鑺傜偣涔嬮棿鐨勬槧灝勫叧緋匯?/p>
瀹炴柦瑙嗗浘錛氭弿榪扮郴緇熷湪鏋勫緩鏃剁殑鍒嗚В鍚庣殑瀛愮郴緇燂紙鍖咃級鐨勬儏鍐碉紝鐗瑰埆鏄寘鎷摢浜涚粍鎴愰儴鍒嗙敱鍝簺鍥㈤槦寮鍙戯紝浠ュ強璐叆錛屽鍖咃紝寮鍙戣繘搴︾瓑鍐呭銆傞」鐩粡鐞嗗簲璇ュ榪欎釜瑙嗗浘鏈鎰熷叴瓚c?br />浣跨敤vs2005(vc8)緙栬瘧log4cpp-0.3.5rc3
"mc.exe" -h $(OutDir) -r $(OutDir) $(SolutionDir)NTEventLogCategories.mc
"RC.exe" -r -fo $(OutDir)\$(InputName).res $(ProjectDir)\$(InputName).rc
"link.exe" /MACHINE:IX86 -dll -noentry -out:$(OutDir)\NTEventLogAppender.dll $(OutDir)\$(InputName).res
鍦ㄥ埄鐢≧ational Rose瀵圭郴緇熷緩妯℃椂錛屽彲鑳戒細閬囧埌鍚屼竴涓寤烘ā鐨勫璞″湪涓嶅悓鍖呬腑鍏鋒湁涓嶅悓鑱岃矗鐨勯棶棰樸?br />姣斿錛屸滅敤鎴封濊繖涓璞★紝鍦ㄤ笟鍔¢鍩熸ā鍨嬩腑錛屽畠鏄竴涓笟鍔″伐浜烘垨涓氬姟涓昏(business actor)錛屽湪緋葷粺鐢ㄤ緥妯″瀷涓紝鎴戜滑闇瑕佸垱寤哄彟涓涓唬琛ㄧ郴緇熸墽琛岃咃紙Actor)鐨勫厓绱犮俁ational Rose浠ュ悕縐版爣璇嗕笉鍚岀殑妯″瀷鍏冪礌錛屼技鍥懼啀鍒涘緩涓涓彨"鐢ㄦ埛"鐨凙ctor鍒欎細瓚呮垚閲嶅悕銆?br />榪欏悇閲嶅悕錛屽彲浠ョО涓哄厓绱犫滈噸杞解濄?br />
涓嬮潰浠嬬粛濡備綍榪涜鈥滃厓绱犻噸杞解?br />
鍒涘緩涓涓噸杞藉厓绱?br />1錛変粠宸ュ叿綆變腑鍒涘緩涓涓柊鐨勫厓绱?br />2錛夊弻鍑繪柊鍏冪礌錛屾垨鑰呭崟鍑籅rowse>Specification錛屾墦寮瑙勮寖紿楀彛
3錛夊湪鍚嶇О瀛楁涓緭鍏ュ悕縐?br />4錛夊崟鍑籓K鎸夐挳聽 杞敞:
聽聽聽 浠婂ぉ鏈夌綉鍙嬮棶鍒拌繖涓棶棰?浜庢槸鍦ㄧ綉涓婃悳绱簡涓涓?杞創榪欐.鐩鎬技鐨勫お澶氫簡,鍑哄涓嶈.鍦ㄦ鎰熻阿鍘熶綔鑰呯簿褰╄瑙?
涓銆侀澶囩煡璇嗏旂▼搴忕殑鍐呭瓨鍒嗛厤
涓涓敱c/C++緙栬瘧鐨勭▼搴忓崰鐢ㄧ殑鍐呭瓨鍒嗕負浠ヤ笅鍑犱釜閮ㄥ垎
1銆佹爤鍖猴紙stack錛夆斅犵敱緙栬瘧鍣ㄨ嚜鍔ㄥ垎閰嶉噴鏀韭狅紝瀛樻斁鍑芥暟鐨勫弬鏁板鹼紝灞閮ㄥ彉閲忕殑鍊肩瓑銆傚叾鎿嶄綔鏂瑰紡綾諱技浜庢暟鎹粨鏋勪腑鐨勬爤銆?
2銆佸爢鍖猴紙heap錛壜犫斅犱竴鑸敱紼嬪簭鍛樺垎閰嶉噴鏀撅紝聽鑻ョ▼搴忓憳涓嶉噴鏀撅紝紼嬪簭緇撴潫鏃跺彲鑳界敱OS鍥炴敹聽銆傛敞鎰忓畠涓庢暟鎹粨鏋勪腑鐨勫爢鏄袱鍥炰簨錛屽垎閰嶆柟寮忓掓槸綾諱技浜庨摼琛紝鍛靛懙銆?
3銆佸叏灞鍖猴紙闈欐佸尯錛夛紙static錛夆旓紝鍏ㄥ眬鍙橀噺鍜岄潤鎬佸彉閲忕殑瀛樺偍鏄斁鍦ㄤ竴鍧楃殑錛屽垵濮嬪寲鐨勫叏灞鍙橀噺鍜岄潤鎬佸彉閲忓湪涓鍧楀尯鍩燂紝聽鏈垵濮嬪寲鐨勫叏灞鍙橀噺鍜屾湭鍒濆鍖栫殑闈欐佸彉閲忓湪鐩擱偦鐨勫彟涓鍧楀尯鍩熴偮?聽紼嬪簭緇撴潫鍚庢湁緋葷粺閲婃斁
4銆佹枃瀛楀父閲忓尯聽鈥斿父閲忓瓧絎︿覆灝辨槸鏀懼湪榪欓噷鐨勩偮犵▼搴忕粨鏉熷悗鐢辯郴緇熼噴鏀?
5銆佺▼搴忎唬鐮佸尯鈥斿瓨鏀懼嚱鏁頒綋鐨勪簩榪涘埗浠g爜銆?
浜屻佷緥瀛愮▼搴?
榪欐槸涓涓墠杈堝啓鐨勶紝闈炲父璇︾粏 //main.cpp聽
int聽a聽=聽0;聽鍏ㄥ眬鍒濆鍖栧尯聽
char聽*p1;聽鍏ㄥ眬鏈垵濮嬪寲鍖郝?br />
main()聽
{聽
int聽b;//聽鏍埪?/span>
char聽s[]聽=聽"abc";聽//鏍埪?/span>
char聽*p2;聽//鏍埪?/span>
char聽*p3聽=聽"123456";聽123456\0";//鍦ㄥ父閲忓尯錛宲3鍦ㄦ爤涓娿偮?/span>
static聽int聽c聽=0錛浡?/span>//鍏ㄥ眬錛堥潤鎬侊級鍒濆鍖栧尯聽
p1聽=聽(char聽*)malloc(10);聽
p2聽=聽(char聽*)malloc(20);聽
//鍒嗛厤寰楁潵寰?0鍜?0瀛楄妭鐨勫尯鍩熷氨鍦ㄥ爢鍖恒偮?/span>
strcpy(p1,聽"123456");聽//123456\0鏀懼湪甯擱噺鍖猴紝緙栬瘧鍣ㄥ彲鑳戒細灝嗗畠涓巔3鎵鎸囧悜鐨?123456"浼樺寲鎴愪竴涓湴鏂廣偮?/span>
}聽聽
涓夈佸爢鍜屾爤鐨勭悊璁虹煡璇?
3.1鐢寵鏂瑰紡
stack:
鐢辯郴緇熻嚜鍔ㄥ垎閰嶃偮犱緥濡傦紝澹版槑鍦ㄥ嚱鏁頒腑涓涓眬閮ㄥ彉閲徛爄nt聽b;聽緋葷粺鑷姩鍦ㄦ爤涓負b寮杈熺┖闂?
heap:
闇瑕佺▼搴忓憳鑷繁鐢寵錛屽茍鎸囨槑澶у皬錛屽湪c涓璵alloc鍑芥暟
濡俻1聽=聽(char聽*)malloc(10);
鍦–++涓敤new榪愮畻絎?
濡俻2聽=聽(char聽*)malloc(10);
浣嗘槸娉ㄦ剰p1銆乸2鏈韓鏄湪鏍堜腑鐨勩?
3.2 鐢寵鍚庣郴緇熺殑鍝嶅簲
鏍堬細鍙鏍堢殑鍓╀綑絀洪棿澶т簬鎵鐢寵絀洪棿錛岀郴緇熷皢涓虹▼搴忔彁渚涘唴瀛橈紝鍚﹀垯灝嗘姤寮傚父鎻愮ず鏍堟孩鍑恒?
鍫嗭細棣栧厛搴旇鐭ラ亾鎿嶄綔緋葷粺鏈変竴涓褰曠┖闂插唴瀛樺湴鍧鐨勯摼琛紝褰撶郴緇熸敹鍒扮▼搴忕殑鐢寵鏃訛紝
浼氶亶鍘嗚閾捐〃錛屽鎵劇涓涓┖闂村ぇ浜庢墍鐢寵絀洪棿鐨勫爢緇撶偣錛岀劧鍚庡皢璇ョ粨鐐逛粠絀洪棽緇撶偣閾捐〃涓垹闄わ紝騫跺皢璇ョ粨鐐圭殑絀洪棿鍒嗛厤緇欑▼搴忥紝鍙﹀錛屽浜庡ぇ澶氭暟緋葷粺錛屼細鍦ㄨ繖鍧楀唴瀛樼┖闂翠腑鐨勯鍦板潃澶勮褰曟湰嬈″垎閰嶇殑澶у皬錛岃繖鏍鳳紝浠g爜涓殑delete璇彞鎵嶈兘姝g‘鐨勯噴鏀炬湰鍐呭瓨絀洪棿銆傚彟澶栵紝鐢變簬鎵懼埌鐨勫爢緇撶偣鐨勫ぇ灝忎笉涓瀹氭濂界瓑浜庣敵璇風殑澶у皬錛岀郴緇熶細鑷姩鐨勫皢澶氫綑鐨勯偅閮ㄥ垎閲嶆柊鏀懼叆絀洪棽閾捐〃涓?
3.3鐢寵澶у皬鐨勯檺鍒?
鏍堬細鍦╓indows涓?鏍堟槸鍚戜綆鍦板潃鎵╁睍鐨勬暟鎹粨鏋勶紝鏄竴鍧楄繛緇殑鍐呭瓨鐨勫尯鍩熴傝繖鍙ヨ瘽鐨勬剰鎬濇槸鏍堥《鐨勫湴鍧鍜屾爤鐨勬渶澶у閲忔槸緋葷粺棰勫厛瑙勫畾濂界殑錛屽湪聽WINDOWS涓嬶紝鏍堢殑澶у皬鏄?M錛堜篃鏈夌殑璇存槸1M錛屾諱箣鏄竴涓紪璇戞椂灝辯‘瀹氱殑甯告暟錛夛紝濡傛灉鐢寵鐨勭┖闂磋秴榪囨爤鐨勫墿浣欑┖闂存椂錛屽皢鎻愮ずoverflow銆傚洜姝わ紝鑳戒粠鏍堣幏寰楃殑絀洪棿杈冨皬銆?
鍫嗭細鍫嗘槸鍚戦珮鍦板潃鎵╁睍鐨勬暟鎹粨鏋勶紝鏄笉榪炵畫鐨勫唴瀛樺尯鍩熴傝繖鏄敱浜庣郴緇熸槸鐢ㄩ摼琛ㄦ潵瀛樺偍鐨勭┖闂插唴瀛樺湴鍧鐨勶紝鑷劧鏄笉榪炵畫鐨勶紝鑰岄摼琛ㄧ殑閬嶅巻鏂瑰悜鏄敱浣庡湴鍧鍚戦珮鍦板潃銆傚爢鐨勫ぇ灝忓彈闄愪簬璁$畻鏈虹郴緇熶腑鏈夋晥鐨勮櫄鎷熷唴瀛樸傜敱姝ゅ彲瑙侊紝鍫嗚幏寰楃殑絀洪棿姣旇緝鐏墊椿錛屼篃姣旇緝澶с?
3.4鐢寵鏁堢巼鐨勬瘮杈冿細
鏍堢敱緋葷粺鑷姩鍒嗛厤錛岄熷害杈冨揩銆備絾紼嬪簭鍛樻槸鏃犳硶鎺у埗鐨勩?
鍫嗘槸鐢眓ew鍒嗛厤鐨勫唴瀛橈紝涓鑸熷害姣旇緝鎱紝鑰屼笖瀹規槗浜х敓鍐呭瓨紕庣墖,涓嶈繃鐢ㄨ搗鏉ユ渶鏂逛究.
鍙﹀錛屽湪WINDOWS涓嬶紝鏈濂界殑鏂瑰紡鏄敤VirtualAlloc鍒嗛厤鍐呭瓨錛屼粬涓嶆槸鍦ㄥ爢錛屼篃涓嶆槸鍦ㄦ爤鏄洿鎺ュ湪榪涚▼鐨勫湴鍧絀洪棿涓繚鐣欎竴蹇唴瀛橈紝铏界劧鐢ㄨ搗鏉ユ渶涓嶆柟渚褲備絾鏄熷害蹇紝涔熸渶鐏墊椿
3.5鍫嗗拰鏍堜腑鐨勫瓨鍌ㄥ唴瀹?
鏍堬細聽鍦ㄥ嚱鏁拌皟鐢ㄦ椂錛岀涓涓繘鏍堢殑鏄富鍑芥暟涓悗鐨勪笅涓鏉℃寚浠わ紙鍑芥暟璋冪敤璇彞鐨勪笅涓鏉″彲鎵ц璇彞錛夌殑鍦板潃錛岀劧鍚庢槸鍑芥暟鐨勫悇涓弬鏁幫紝鍦ㄥぇ澶氭暟鐨凜緙栬瘧鍣ㄤ腑錛屽弬鏁版槸鐢卞彸寰宸﹀叆鏍堢殑錛岀劧鍚庢槸鍑芥暟涓殑灞閮ㄥ彉閲忋傛敞鎰忛潤鎬佸彉閲忔槸涓嶅叆鏍堢殑銆?
褰撴湰嬈″嚱鏁拌皟鐢ㄧ粨鏉熷悗錛屽眬閮ㄥ彉閲忓厛鍑烘爤錛岀劧鍚庢槸鍙傛暟錛屾渶鍚庢爤欏舵寚閽堟寚鍚戞渶寮濮嬪瓨鐨勫湴鍧錛屼篃灝辨槸涓誨嚱鏁頒腑鐨勪笅涓鏉℃寚浠わ紝紼嬪簭鐢辮鐐圭戶緇繍琛屻?
鍫嗭細涓鑸槸鍦ㄥ爢鐨勫ご閮ㄧ敤涓涓瓧鑺傚瓨鏀懼爢鐨勫ぇ灝忋傚爢涓殑鍏蜂綋鍐呭鏈夌▼搴忓憳瀹夋帓銆?
3.6瀛樺彇鏁堢巼鐨勬瘮杈?
char聽s1[]聽=聽"aaaaaaaaaaaaaaa";
char聽*s2聽=聽"bbbbbbbbbbbbbbbbb";
aaaaaaaaaaa鏄湪榪愯鏃跺埢璧嬪肩殑錛?
鑰宐bbbbbbbbbb鏄湪緙栬瘧鏃跺氨紜畾鐨勶紱
浣嗘槸錛屽湪浠ュ悗鐨勫瓨鍙栦腑錛屽湪鏍堜笂鐨勬暟緇勬瘮鎸囬拡鎵鎸囧悜鐨勫瓧絎︿覆(渚嬪鍫?蹇?
姣斿錛?
void聽main()聽
{聽
char聽a聽=聽1;聽
char聽c[]聽=聽"1234567890";聽
char聽*p聽="1234567890";聽
a聽=聽c[1];聽
a聽=聽p[1];聽
return;聽
}聽
瀵瑰簲鐨勬眹緙栦唬鐮?10:聽a聽=聽c[1];聽
00401067聽8A聽4D聽F1聽mov聽cl,byte聽ptr聽[ebp-0Fh]聽
0040106A聽88聽4D聽FC聽mov聽byte聽ptr聽[ebp-4],cl聽
11:聽a聽=聽p[1];聽
0040106D聽8B聽55聽EC聽mov聽edx,dword聽ptr聽[ebp-14h]聽
00401070聽8A聽42聽01聽mov聽al,byte聽ptr聽[edx+1]聽
00401073聽88聽45聽FC聽mov聽byte聽ptr聽[ebp-4],al聽
絎竴縐嶅湪璇誨彇鏃剁洿鎺ュ氨鎶婂瓧絎︿覆涓殑鍏冪礌璇誨埌瀵勫瓨鍣╟l涓紝鑰岀浜岀鍒欒鍏堟妸鎸囬拡鍊艱鍒癳dx涓紝鍦ㄦ牴鎹甧dx璇誨彇瀛楃錛屾樉鐒舵參浜嗐?
3.7灝忕粨錛?
鍫嗗拰鏍堢殑鍖哄埆鍙互鐢ㄥ涓嬬殑姣斿柣鏉ョ湅鍑猴細
浣跨敤鏍堝氨璞℃垜浠幓楗閲屽悆楗紝鍙鐐硅彍錛堝彂鍑虹敵璇鳳級銆佷粯閽便佸拰鍚冿紙浣跨敤錛夛紝鍚冮ケ浜嗗氨璧幫紝涓嶅繀鐞嗕細鍒囪彍銆佹礂鑿滅瓑鍑嗗宸ヤ綔鍜屾礂紕椼佸埛閿呯瓑鎵熬宸ヤ綔錛屼粬鐨勫ソ澶勬槸蹇嵎錛屼絾鏄嚜鐢卞害灝忋?
浣跨敤鍫嗗氨璞℃槸鑷繁鍔ㄦ墜鍋氬枩嬈㈠悆鐨勮彍鑲達紝姣旇緝楹葷儲錛屼絾鏄瘮杈冪鍚堣嚜宸辯殑鍙e懗錛岃屼笖鑷敱搴﹀ぇ銆?
鍫嗗拰鏍堢殑鍖哄埆涓昏鍒嗭細
鎿嶄綔緋葷粺鏂歸潰鐨勫爢鍜屾爤錛屽涓婇潰璇寸殑閭d簺錛屼笉澶氳浜嗐?
榪樻湁灝辨槸鏁版嵁緇撴瀯鏂歸潰鐨勫爢鍜屾爤錛岃繖浜涢兘鏄笉鍚岀殑姒傚康銆傝繖閲岀殑鍫嗗疄闄呬笂鎸囩殑灝辨槸錛堟弧瓚沖爢鎬ц川鐨勶級浼樺厛闃熷垪鐨勪竴縐嶆暟鎹粨鏋勶紝絎?涓厓绱犳湁鏈楂樼殑浼樺厛鏉冿紱鏍堝疄闄呬笂灝辨槸婊¤凍鍏堣繘鍚庡嚭鐨勬ц川鐨勬暟瀛︽垨鏁版嵁緇撴瀯銆?
铏界劧鍫嗘爤錛屽爢鏍堢殑璇存硶鏄繛璧鋒潵鍙紝浣嗘槸浠栦滑榪樻槸鏈夊緢澶у尯鍒殑錛岃繛鐫鍙彧鏄敱浜庡巻鍙茬殑鍘熷洜銆?br />
url: http://www.shnenglu.com/ace
鐢ㄤ緥瑙嗗浘:瀵圭郴緇熷姛鑳芥ч渶姹傚妯★紝鎻忚堪緋葷粺鐨勮涓猴紝鎻ず緋葷粺鈥滄槸浠涔堚?/p>
Customers, who need to be sure that the system that is getting built is the one that they want.
瀹㈡埛錛屼粬浠渶瑕佺‘瀹氬嵆灝嗘瀯寤虹殑緋葷粺鏄粬浠渶瑕佺殑緋葷粺銆?/p>
Managers, who need to have an overall understanding of what the system will do in order to effectively plan and monitor the project.
緇忕悊錛屼粬浠渶瑕佸灝嗙潃鎵嬬殑緋葷粺鏈変竴涓叏灞鐨勪簡瑙o紝浠ヤ究浜庡欏圭洰鏈夋晥鐨勮鍒掑拰鐩戞帶銆?/p>
Analysts, who need to describe and document what the system is going to do.
鍒嗘瀽鍛橈紝浠栦滑闇瑕佸灝嗚鐫鎵嬬殑緋葷粺榪涜鎻忚堪鍜屾枃妗e寲銆?/p>
Developers, who need to understand what the system needs to do in order to develop it.
寮鍙戜漢鍛橈紝浠栦滑闇瑕佺悊瑙g郴緇熶互渚夸簬寮鍙戝畠銆?/p>
Tester錛?who need to know what the system is supposed to do so that聽 they can verify that is does it.
嫻嬭瘯浜哄憳錛屼粬浠渶瑕佺煡閬撴湡鏈涚郴緇熷疄鐜扮殑鍔熻兘錛屼互渚夸簬瀹冧滑楠岃瘉緋葷粺鏄墽琛岃繖浜涘姛鑳姐?/p>
Technical writers,who need to know what the system is supposed to so that they can describe it.
鏀寔鏂囨。鎾板啓鑰咃紝浠栦滑闇姹傝鐭ラ亾鏈熸湜鐨勭郴緇熶互渚嬫弿榪板畠銆?br />聽
User-experience designers, who need to understand the users' goals and how the will use the system to achieve these goals.
鐢ㄦ埛浣撻獙璁捐浜哄憳錛屼粬浠渶瑕佺悊瑙g敤鎴風殑鐩爣鍜屼粬浠皢鎬庢牱浣跨敤緋葷粺杈懼埌浠栦滑鐨勭洰鏍囥?/p>
鍦ㄦ偍緇存姢瀹夊叏綾誨瀷鍜岄伩鍏嶉泦鎴愮數璺埇鍑芥暟鏃?浣犲彲浠ヤ嬌鐢–++鐨勫己澶х殑鍔涢噺榪涜娑堟伅浼犻掋?/p>
Anthony鏄疛ust Software Solution鏈夐檺鍏徃鐨勪竴浣嶈蔣浠跺紑鍙戣呭拰鎵ц綆$悊鑰呫傚彲浠ラ氳繃anthony@justsoftwaresolutions.co.uk涓庝箣鑱旂郴銆?/p>
浣跨敤閫氱敤鐨勬秷鎭紶閫掓柟寮忎紶閫掓暟鎹湪C++紼嬪簭涓緢鏅亶銆傝繖縐嶆妧鏈粡甯哥敤浜庡湪綰跨▼闂翠互鍙婁粠/鍒癎UI緇勪歡闂翠紶閫掓暟鎹備絾鏄秷鎭紶閫掍粛鐒跺緢闅懼疄鐜板緱鑹ソ錛岃繖鏄洜涓哄湪甯歌鐨勬秷鎭紶閫掓柟寮忎腑錛屾毚闇插嚭浜嗚繃澶氱殑钘曞悎銆佺己灝戠被鍨嬪畨鍏ㄥ拰闆嗘垚鐢佃礬鑸殑娑堟伅澶勭悊鍑芥暟銆?/p>
鍦ㄦ湰鏂囦腑錛屾垜鎻愬嚭浜嗕竴縐嶆妧鏈紝榪欑鎶鏈埄鐢–++鐨勫己澶у姏閲忔潵閬垮厤涓婅堪緙洪櫡鈥斺斿湪娑堟伅浼犻掍腑閬垮厤涓嶉傚綋鐨勮棔鍚堬紝緇存姢綾誨瀷瀹夊叏錛屼互鍙婃秷闄ら泦鎴愮數璺埇鐨勬秷鎭鐞嗗嚱銆? The only translation units that need to known the details of a message are those containning the source and handler functions for that specific message type.) 闇瑕佽漿鎹㈢殑鍗曞厓錛屽嵆闇瑕佺煡閬撶殑娑堟伅璇︾粏鍐呭鏄寘鍚簡鐗瑰畾娑堟伅鐨勭被鍨嬬殑婧愪唬鐮佸拰澶勭悊鍑芥暟銆?/p>
澶ф搴旂敤寰楁渶涓哄箍娉涚殑娑堟伅浼犻掓妧鏈槸浣跨敤涓涓甫鏈夌壒孌婃垚鍛樻潵琛ㄧず娑堟伅綾誨瀷鐨勭粨鏋勪綋錛岃娑堟伅綾誨瀷鏄秷鎭殑鏍囪瘑銆傝繖縐嶆柟寮忚騫挎硾搴旂敤褰掑拵浜庝嬌鐢ㄤ簡鍩轟簬C鐨凙PI錛屾瘮濡俋11鍜孧icrosoft Windows銆傚湪榪欑鏂規硶涓紝娑堟伅緇撴瀯浣撲腑瑕佷箞鏈変竴涓氱敤鐨勫瓧浣撶敤浜庡尯鍒笉鍚屾秷鎭殑鎰忎箟錛岃繖涓瓧孌靛彲琚墍鏈夋秷鎭噸鐢紝鎴栬呭畠鏄洿澶х粨鏋勭殑絎竴涓垚鍛橈紝瀹冪殑綾誨瀷鐢辯被鍨嬩唬鐮佹潵紜畾銆俉indows API浣跨敤鍓嶉潰鐨勬妧鏈紝鑰孹11浣跨敤鍚庨潰鐨勬柟娉曘傛棤璁虹敤鍝鏂瑰紡錛屽鐞嗘秷鎭殑浠g爜閮介』媯鏌ョ被鍨嬬紪鐮侊紝鐢ㄤ互鍐沖畾鎬庝箞澶勭悊璇ユ秷鎭?/p>
榪欎簺鎶鏈殑闂鏄?緙轟箯綾誨瀷瀹夊叏錛岄泦鎴愮數璺埇鐨勫鐞嗗嚱鏁幫紝闇瑕佺鐞嗙被鍨嬬紪鐮佹潵紜繚娑堟伅鍞竴鎬х殑閫傚綋灞傛銆傜壒鍒殑錛岀己涔忕被鍨嬪畨鍏ㄦ剰鍛崇潃浣跨敤涔嬪墠錛屼嬌鐢ㄤ唬鐮佸繀欏繪妸娑堟伅鏁版嵁杞崲鎴愰傚綋鐨勭被鍨嬨傝繖涓姝ユ槸鏋佹槗鍑洪敊鐨勶紝灝ゅ叾鍦ㄥ綋澶嶅埗鍜岀矘璐翠唬鐮佹椂(榪欑闈炲父鐨勬墜孌靛父鍙戠敓鍦ㄤ負澶勭悊鐩鎬技娑堟伅緙栧啓浠g爜鐨勬椂鍊?錛岀紪璇戝櫒涓嶄細鍦ㄨ繖縐嶉敊璇粰鍑轟換浣曡鍛娿?/p>
緙轟箯綾誨瀷瀹夊叏榪樻湁涓涓澶栫殑闂鈥斺斿嵆瀹冧笉鍙兘綆鍗曟湁鏁堢殑閫氳繃娑堟伅緋葷粺浼犻掕祫婧愭垨鍙橀暱鐨勬暟鎹紝 榪欐槸鍥犱負娑堟伅鐨勫彂閫佹柟鎬繪槸涓嶈兘鐭ラ亾浣曟椂錛堟垨鏄惁錛夎娑堟伅宸茶澶勭悊榪囦簡銆?/p>
鍦ㄨ繖閮ㄥ垎錛岄泦鎴愮數璺埇鐨勬秷鎭鐞嗗嚱鏁版槸蹇呴』鐢ㄤ簬紜畾娑堟伅綾誨瀷鐨勪駭鐗╋紝閫氳繃宸叉帴鏀剁殑娑堟伅鏉ユ秷鎭被鍨嬶紝鐒跺悗寰楀埌濡備綍澶勭悊瀹冪殑鏂瑰紡銆傝繖縐嶅鐞嗗嚱鏁板線寰瀹炵幇涓轟竴涓緢澶х殑switch璇彞鎴栨槸涓涓瞚f eles if銆備竴浜涙鏋訛紝濡侻FC錛屾彁渚涗竴浜涘畯鏉ュ噺寮辮繖縐嶉棶棰樼殑褰卞搷錛屽畠榪欎笉鑳藉畬鍏ㄦ秷闄よ繖涓棶棰樸?/p>
鏈鍚庣殑闂鏄鐞嗙被鍨嬩唬鐮併傚畠蹇呴』瑕佹眰鎺ユ敹娑堟伅浠g爜娓呮鍦扮煡閬撴槸鍝竴涓秷鎭紝浠ヤ究浜庢紜殑澶勭悊瀹冦傛墍浠ワ紝綾誨瀷浠g爜闇瑕佸湪澶勭悊瀹冪殑鐩稿叧浠g爜涓‘淇濆敮涓鎬с傛瘮濡傦紝鍦╓indows API涓紝鎸囧畾鑼冨洿鐨勬秷鎭被鍨嬪湪涓嶅悓鐨勫簲鐢ㄧ▼搴忎腑浠h〃涓嶅悓鐨勬剰涔夛紝騫朵笖錛屽湪鍚屼竴涓簲灝辯敤紼嬪簭涓紝鍏跺畠鑼冨洿鐨勬秷鎭被鍨嬪湪涓嶅悓紿楀彛鎴朑UI緇勪歡涓唬琛ㄤ笉鍚岀殑鎰忎箟銆?閫氬父,闇瑕佹墍鏈夌被鍨嬩唬鐮佺殑鍒楄〃錛岃鍒楄〃瑕佹眰鍦ㄧ粰瀹氱殑鑼冨洿涓繚鎸佸敮涓錛屼互渚夸簬媯鏌ュ畠浠殑鍞竴鎬с傚垪琛ㄥ父甯告槸浠ュご鏂囦歡鐨勫艦寮忕粰鍑猴紝澶存枃浠朵腑瀹氫箟浜嗙被鍨嬩唬鐮侊紝鍖呭惈鍦ㄩ渶瑕佺煡閬撴秷鎭被鍨嬬殑鎵鏈夊湴鏂廣傝繖縐嶆柟寮忓鏄撳鑷村簲鐢ㄧ▼搴忎笉鍚岄儴鍒嗕箣闂寸殑钘曞悎,鑰岃繖浜涢儴鍒嗕箣闂村嵈娌℃湁浠諱綍鍏崇郴銆傜敱浜庤繖縐嶈繃搴︾殑钘曪紝綆鍗曠殑鍙樻洿瀵艱嚧榪囧鐨勯噸鏂扮紪璇戙?/p>
闈㈠悜瀵硅薄鎶鏈?br />
瀵硅薄鎶鏈殑涓涓父瑙佺壒寰佹槸鎵鏈夌浉鍏蟲秷鎭被媧劇敓鑷竴涓氱敤鐨勫熀綾匯傝鐗瑰緛鐢ㄧ紪璇戝櫒鑳借璇嗙殑鐪熷疄綾誨瀷浠f浛浜嗘樉寮忕殑綾誨瀷浠g爜銆備笉浠呭姝わ紝瀹冭繕鏈変簡涓涓噸瑕佺殑錛岃秴瓚奀椋庢牸鎶鏈殑浼樼偣鈥斺旂被鍨嬪畨鍏ㄣ傚畠鎻愪緵鐨勯氱敤鍩虹被鐨勬瀽鏋勫嚱鏁版槸铏氬嚱鏁幫紝鎵浠ユ淳鐢熺殑娑堟伅綾昏兘鑷敱鍦扮鐞嗚祫婧愶紝濡傚彉闀跨殑鏁版嵁錛岃繖浜涙暟鎹彲浠ュ湪鏋愭瀯鍑芥暟涓噴鏀俱備粎鏈夌殑闇姹傛槸鎺ュ彈娑堟伅鐨勪唬鐮佽兘姝g‘鍦伴攢姣佹秷鎭璞★紝鏃犺瀹冧滑鏄惁琚鐞嗐?/p>
綆$悊綾誨瀷浠g爜鐜板湪琚浛鎹負綆$悊綾匯傝繖鏄竴涓洿鍔犵畝鍗曠殑浠誨姟錛岀敱浜庡彲鑳界殑娑堟伅鍚嶅瓧鐨勮寖鍥存槸娌℃湁闄愬埗鐨勶紝鍙兘瀛樺湪鍚嶅瓧鍐茬獊錛屼絾榪欎竴鐐瑰彲浠ラ氳繃鍚嶅瓧絀洪棿鏉ヨВ鍐熾?/p>
鏈綆鍗曠殑OOP鎶鏈氨鏄敤dynamic_cast媯鏌ュ疄闄呯殑娑堟伅綾誨瀷浠f浛媯鏌ユ秷鎭紪鐮併傜劧鑰岋紝榪欎緷鐒墮潰涓寸潃闆嗘垚鐢佃礬鑸湴娑堟伅澶勭悊鏂瑰紡鈥斺旂幇鍦ㄩ氳繃鍖呮嫭dynamic_cast鐨勬瘮杈冮摼涔熶紭浜庨氳繃綾誨瀷緙栫爜瀛楁姣旇緝閾俱傚鍒楄〃1:
[鍒楄〃1]
涓鑸岃█錛岀敱浜庝粎浠呮槸娑堟伅鐨勬簮浠g爜鍜屾帴鍙楁秷鎭殑婧愪唬鐮侀渶姹傜煡閬撶浉鍏崇殑娑堟伅錛屾墍浠ヤ緷璧栧緱鍒伴檷浣庛傜劧鍚庯紝闆嗘垚鐢佃礬鑸湴澶勭悊鍑芥暟鐜板湪闇瑕佺煡閬撴秷鎭殑鏈夊叧緇嗚妭錛屾墍浠ynamic_cast闇瑕佹秷鎭殑瀹屾暣瀹氫箟鈥斺斿鏋滃垎媧劇粰鍙﹀鐨勫嚱鏁板鐞嗗疄闄呯殑娑堟伅錛孋椋庢牸鎶鏈殑澶勭悊鍑芥暟涓嶉渶姹傜煡閬撴秷鎭殑緇嗚妭銆?/p>
(Direct testing of a class's type using dynamic_cast is generally indicative of a design problem;)綾葷殑綾誨瀷鐢╠ynamic_cast鐨勭洿嫻嬭瘯涓鑸彲琛ㄧず涓鴻璁¢棶棰?鐒惰岋紝綆鍗曞湴鎶婅櫄鍑芥暟鏀懼湪娑堟伅綾諱腑璧蜂笉鍒頒換浣曚綔鐢ㄢ斺斿畠灝嗘妸娑堟伅澶勭悊涓庢秷鎭紶緇曞湪涓璧鳳紝榪欎釜娑堟伅浣垮湪絎竴涓湴鏂瑰彂閫佹秷鎭殑鐩殑澶辮觸銆?/p>
鍙岄噸鍒嗘淳鐨勫叧閿偣鏄紝鍦ㄦ秷鎭被涓殑铏氬嚱鏁板甫鏈変竴涓綔涓哄弬鏁扮殑澶勭悊鍣紝鐒跺悗鍦ㄥ鐞嗗櫒涓婃妸鑷凡浣滀負鍙傛暟浼犻掍紶閫掔粰鍙︿竴涓嚱鏁板茍瀹屾垚璋冪敤銆傚洜涓鴻繖閲岀殑絎簩嬈″埌澶勭悊鍣ㄧ殑鍥炶皟宸茬粡鍦ㄥ疄闄呯殑媧劇敓綾諱腑瀹屾垚錛屾墍浠ョ湡瀹炵殑娑堟伅綾誨瀷宸茬粡鐭ラ亾錛屽湪澶勭悊鍣ㄤ笂鑳借皟鐢ㄩ傚綋鐨勫嚱鏁幫紝鏃犺榪欎釜鍑芥暟鏄氳繃閲嶈澆鐨勬柟寮忓疄鐜拌繕鏄彟澶栫嫭绔嬪懡鍚嶇殑鍑芥暟鏉ュ疄鐜?鍒楄〃2)銆?/p>
[鍒楄〃2]
渚濊禆浜庨噸杞界殑鏂瑰紡鏉ュ尯鍒笉鍚岀殑娑堟伅鏈夊埄浜庡ぇ澶氭暟騫寵 鈥斺旂幇鍦ㄥ湪姣忎釜娑堟伅綾諱腑铏氬嚱鏁扮殑瀹炵幇鏂瑰紡鏄浉鍚岀殑錛屽鏋滈渶瑕侊紝鍙互閫氳繃瀹忔潵涓鑷村湴鍖呰錛屾垨閫氳繃浠庝竴涓秷鎭埌鍙︿竴涓秷鎭腑鐩存帴澶嶅埗錛屼笉浼氭湁鍑洪敊鐨勬満浼氥?/p>
鍙岄噸鍒嗘淳瀛樺湪涓涓己鐐光斺旈珮搴﹁棔鍚堛傜敱浜庨氳繃閲嶈澆鏂瑰紡鍦ㄥ鐞嗗櫒綾諱腑鐨勯夋嫨澶勭悊鍑芥暟錛屽湪娑堟伅綾諱腑铏氬嚱鏁扮殑瀹炵幇闇瑕佺煡閬撳鐞嗗櫒綾葷殑瀹氫箟鐨勫叏閮紝鍥犳蹇呴』娉ㄦ剰鍒板湪緋葷粺涓瘡涓叾瀹冪殑綾葷殑鍚嶅瓧銆備笉鍏夎繖浜涳紝濡傛灉瑕佹敮鎸佷笉鍚岀殑澶勭悊鍣ㄧ被錛屽鐞嗗嚱鏁板繀欏誨湪閫氱敤鐨勫鐞嗗櫒鐨勫熀綾諱腑澹版槑涓鴻櫄鍑芥暟錛屾墍浠ユ瘡涓鐞嗗櫒綾誨繀欏誨湪緋葷粺涓敞鎰忓埌鎵鏈夌殑娑堟伅綾誨瀷(鍒楄〃3)銆傚鍔犳垨鍒犻櫎涓涓秷鎭被鍨嬩細寮曡搗搴旂敤紼嬪簭澶ч儴鍒嗕唬鐮侀噸鏂扮紪璇戙?/p>
[鍒楄〃3]
鍔ㄦ佸弻閲嶅垎媧?br />
錛圛t was against this backdrop that I developed the technique I call "Dynamic Double Dispatch."錛夋垜寮鍙戜簡涓縐嶆妧鏈紝鎴戠О鍏朵負鈥滃姩鎬佸弻閲嶅垎媧鋸濓紝榪欑鎶鏈敤浜庤В鍐充笂榪伴棶棰樸傚敖綆℃湁鍩烘湰鐨勫弻閲嶅垎媧炬妧鏈紝浣嗛夋嫨鐨勬秷鎭鐞嗗嚱鏁頒嬌鐢ㄧ殑鏄湪緙栬瘧闃舵紜畾鐨勯噸杞芥妧鏈?灝界鍙戠幇鍦ㄦ紜殑娑堟伅澶勭悊鍣ㄧ被涓殑瀹炵幇鏄嬌鐢ㄨ櫄鍑芥暟鏈哄埗),鑰屽姩鎬佸弻閲嶅垎媧炬槸鍦ㄨ繍琛屾椂媯鏌ュ湪澶勭悊鍣ㄤ笂閫傚綋鐨勫鐞嗗嚱鏁扮殑銆傜粨璁烘槸鍔ㄦ佸弻閲嶅垎媧炬秷闄や簡鍙岄噸鍒嗘淳鐨勪緷璧栭棶棰樸傛秷鎭被鍨嬩笉鍦ㄩ渶瑕佹敞鎰忓埌鍏跺畠鐨勬秷鎭被鍨嬶紝騫朵笖澶勭悊鍣ㄧ被浠呴渶瑕佹敞鎰忓埌瀹冪殑瀹冭澶勭悊鐨勬秷鎭?/p>
鍔ㄦ佹鏌ョ殑鍏抽敭鐐規槸錛氭瘡涓涓秷鎭被鍨嬫湁涓涓嫭绔嬬殑鍩虹被鈥斺斿鐞嗗櫒綾諱粠閫傚綋鐨勶紝璁捐涓哄鐞嗘秷鎭殑鍩虹被媧劇敓銆傜劧鍚庡湪姣忎釜娑堟伅綾諱腑鐨勫垎媧懼嚱鏁拌兘鐢╠ynamic_cast鏉ユ鏌ヤ粠姝f淳鍩虹被媧劇敓鐨勫鐞嗗櫒綾伙紝鍥犺屽疄鐜頒簡姝g‘鐨勫鐞嗗嚱鏁般?鍒楄〃4)
[鍒楄〃4]
(Of course, having a completely separate handler base class for each message type would add excessive complication, as the dispatch function for each message type would now be specific to that message type, and the base classes would have to be written separately, despite being fundamentally the same, except for the message type they referenced.)
璇氱劧錛屼負姣忎釜娑堟伅綾誨瀷鍒嗗埆緙栧啓鐨勫鐞嗗櫒鍩虹被灝嗗鍔犺繃澶氱殑澶嶆潅鎬э紝鍚屾牱鍦幫紝姣忎釜娑堟伅綾誨瀷鍚勮嚜鐨勫垎媧懼嚱鏁扮幇鍦ㄩ渶瑕佺壒鍒寚瀹氾紝鍩虹被涔熼渶姹傚垎鍒紪鍐?鐒跺悗闄や簡瀹冧滑寮曠敤鐨勬秷鎭被鍨嬪鍩虹鏄浉鍚岀殑銆傛秷闄よ繖縐嶉噸澶嶇殑鍏抽敭鏄嬌鍩虹被鎴愪負妯℃澘錛岀敤娑堟伅綾誨瀷浣滀負妯℃澘鍙傛暟鈥斺斿垎媧懼嚱鏁板紩鐢ㄥ埌妯℃澘鐨勫疄鐜板ソ浜庢寚瀹氱被鍨嬶紱璇風湅鍒楄〃5銆?/p>
聽
[鍒楄〃5]
鍑轟簬綆鍖栧師鍥狅紝鍦ㄦ秷鎭被涓殑鍒嗘淳鍑芥暟鍑犱箮鐩稿悓錛屼絾涔熶笉鏄畬鍏ㄧ浉鍚屸斺斿畠浠繀欏繪槑紜殑鎸囧畾灞炰簬瀹冧滑鐨勬寚瀹氭秷鎭被錛屼互渚夸簬杞崲涓洪傚綋鐨勫鐞嗗櫒鍩虹被銆傚儚杞歡涓澶氫簨鎯呬竴鏍鳳紝榪欎釜闂鍙互澧炲姞涓涓澶栫殑灞傛潵瑙e喅鈥斺斿垎媧懼嚱鏁板彲浠ュ鎵樼粰鍗曚釜妯℃澘鍑芥暟錛岃繖涓ā鏉垮嚱鏁頒嬌鐢ㄦā鏉垮弬鏁扮被鍨嬫潵紜畾娑堟伅綾誨瀷鍜屾妸澶勭悊鍣ㄨ漿鎹㈠埌閫傚綋鐨勭被鍨嬩笂銆?鍒楄〃6)
聽
[鍒楄〃6]
閫氳繃榪涗竴姝ユ娊璞″湪娑堟伅瀵硅薄涓垎媧懼嚱鏁扮殑涓嶅悓涔嬪,鎴戜滑鎶婂伐浣滈泦涓埌涓涓湴鏂光斺旀ā鏉垮嚱鏁扮殑瀹氫箟錛涘畠鎻愪緵浜嗕負淇敼琛屼負鐨勫崟涓鐐廣傚湪娑堟伅綾諱腑鍓╀笅鐨勫垎媧懼嚱鏁伴兘鏄浉鍚岀殑錛岃繖瓚充互鎶婂畠浠畝鍖栧埌闅愯棌緇嗚妭鐨勫畯涓垨鍦ㄦ秷鎭被涔嬮棿涓愬瓧澶嶅埗銆?/p>
鏈鐞嗙殑娑堟伅
榪勪粖涓烘錛屾垜浠睍紺虹殑 dynamicDispach妯℃澘鍑芥暟鐨勪唬鐮佸亣瀹氬鐞嗙殑綾繪槸浠庨傚綋鐨凷pecificMessageHandler鏄淳鐢熺殑錛涘鏄笉鏄繖鏍鳳紝 dynamic_cast灝嗘姏鍑簊td::bad_cast寮傚父銆傛湁鏃惰繖灝辮凍澶熶簡錛屼絾鏄湁鐨勬椂鍊欙紝鏈夋洿閫傚綋鐨勮涓衡斺斾篃璁告洿濂界殑鍋氭硶鏄姏寮冩秷鎭紝榪欎笉鑳借鎺ュ彈娑堟伅鐨勪唬鐞嗗鐞嗘垨璋冪敤catch-all澶勭悊鍣ㄣ備婦渚嬫潵璇達紝dynamicDispatch 鍑芥暟鑳借璋冩暣錛岀敤鍩轟簬鎸囬拡鐨勮漿鎹唬鏇垮熀浜庡紩鐢ㄧ殑杞崲錛屾墍浠ョ粨鏋滃煎彲浠ヤ笌NULL榪涜嫻嬭瘯銆?/p>
緙虹偣(Trade-Off)鍦ㄥ摢閲岋紵
鏈夊姝ゅ鐨勪紭鐐癸紝涓瀹氬瓨鍦ㄥ畠鐨勭己鐐癸紝閭e畠鐨勭己鐐瑰湪鍝噷鍛紵鍦ㄨ繖閲岋紝鏈変袱涓己鐐廣傜涓涓槸錛氶澶栫殑鍔ㄦ佽漿鎹紝涓や釜铏氬嚱鏁拌皟鐢ㄤ細褰卞搷鎬ц兘銆傚鏋滄ц兘涓婃槸涓涓棶棰橈紝榪欏氨鏄竴涓枒闂紝浣嗘槸錛屽湪寰堝鎯呭喌涓嬶紝鑺遍攢鍦ㄨ繖閲岀殑棰濆鐨勬椂闂存槸涓嶅煎緱鍏蟲敞鐨勩傚彲浠ヤ嬌鐢ㄧ浉搴旂殑宸ュ叿鏉ョ瀹氬埌搴曞摢閲屾墠鏄湡姝g殑鎬ц兘鐡墮鎵鍦ㄣ?/p>
絎簩涓己鐐規槸:闇瑕佷負姣忎釜娑堟伅澶勭悊浠庢寚瀹氱殑鍩虹被媧劇敓娑堟伅澶勭悊鍣ㄣ傚洜涓哄鐞嗘柊鐨勬秷鎭被鍨嬮渶瑕佷慨鏀逛袱涓湴鏂光斺旈傚綋鐨勫熀綾誨垪琛ㄥ叆鍙e拰澶勭悊鍑芥暟錛屾墍浠ヨ繖鍙兘鎴愪負閿欒鐨勬潵婧愶紝閬楀け澶勭悊鍑芥暟瀹規槗琚彂鐜幫紝鍥犱負榪欐槸鍏ㄥ眬鐐癸紝浣嗘槸閬楀け鍩虹被鍦ㄤ唬鐮佽繍琛屾椂鍙駭鐢熶笉鏄撴煡瑙夌殑緙洪櫡銆傚洜涓烘病鏈夊鐞嗗嚱鏁扮殑鏃跺欎粎浠呮槸涓嶈皟鐢ㄥ畠銆傝繖浜涢敊璇湪鍗曞厓嫻嬭瘯鐨勬椂鍊欐槸寰堝鏄撹鎶撳嚭鏉ョ殑錛屾墍浠ユ墍瀹炶瘽錛岃繖浜涗笉渚夸箣澶勯兘鎴愪笉浜嗗ぇ闂銆?/p>
聽
From: Brian Sun @ 鐖爲鐨勬場娉http://www.blogjava.net/briansun]
{鍏抽敭瀛梷
嫻嬭瘯椹卞姩寮鍙?Test Driven Development/TDD
嫻嬭瘯鐢ㄤ緥/TestCase/TC
璁捐/Design
閲嶆瀯/Refactoring
{TDD鐨勭洰鏍噠
Clean Code That Works
榪欏彞璇濈殑鍚箟鏄紝浜嬪疄涓婃垜浠彧鍋氫袱浠朵簨鎯咃細璁╀唬鐮佸鏁堬紙Work錛夊拰璁╀唬鐮佹磥鍑錛圕lean錛夛紝鍓嶈呮槸鎶婁簨鎯呭仛瀵癸紝鍚庤呮槸鎶婁簨鎯呭仛濂姐傛兂鎯崇湅錛屽叾瀹炴垜浠鉤鏃舵墍鍋氱殑鎵鏈夊伐浣滐紝闄ゅ幓鏃犵敤鐨勫伐浣滃拰閿欒鐨勫伐浣滀互澶栵紝鐪熸姝g‘鐨勫伐浣滐紝騫朵笖鏄湡姝f湁鎰忎箟鐨勫伐浣滐紝鍏跺疄涔熷氨鍙湁涓ゅぇ綾伙細澧炲姞鍔熻兘鍜屾彁鍗囪璁★紝鑰孴DD 姝f槸鍦ㄨ繖涓師鍒欎笂浜х敓鐨勩傚鏋滄偍鐨勫伐浣滃茍闈炴垜浠兂璞$殑榪欐牱錛岋紙榪欐剰鍛崇潃鎮ㄨ繕瀛樺湪絎笁綾繪紜湁鎰忎箟鐨勫伐浣滐紝鎴栬呮偍鎵瑕佸仛鐨勬牴鏈拰鎴戜滑鍦ㄨ鐨勬槸涓ゅ洖浜嬶級錛岄偅涔堣繖鍛婅瘔鎴戜滑鎮ㄥ茍涓嶉渶瑕乀DD錛屾垨鑰呬笉閫傜敤TDD銆傝屽鏋滄垜浠伓鐒剁寽瀵癸紙榪欏浜庢垜鏉ヨ鏄伓鐒訛紝鑰屽浜嶬ent Beck鍜孧artin Fowler榪欐牱鐨勫ぇ甯堟潵璇村垯鏄緵鍕ゅ伐浣滅殑鎴愭灉錛夛紝閭d箞鎭枩鎮紝TDD鏈夊彲鑳芥垚涓烘偍鏄捐憲鎻愬崌宸ヤ綔鏁堢巼鐨勪竴浠舵硶瀹濄傝涓嶈灝嗕俊灝嗙枒錛岃嫢鍗寵嫢紱伙紝鍥犱負浠諱綍涓欏規柊鐨勬妧鏈斺斿彧瑕佹槸浠庢牴鏈笂鏀瑰彉浜虹殑琛屼負鏂瑰紡鐨勬妧鏈斺斿氨蹇呯劧浣垮緱鐩鎬俊瀹冪殑浜鴻秺鏉ヨ秺鐩鎬俊錛屼笉淇$殑浜鴻秺鏉ヨ秺涓嶄俊銆傝繖灝卞ソ姣斿娓告吵錛屽敮涓鑳藉浼氭父娉崇殑閫斿緞灝辨槸浜茶嚜涓嬪幓娓革紝闄ゆ涔嬪鍒棤浠栨硶銆傝繖涔熷ソ姣旀垚鍔熷錛屽嵆浣挎妸鍗¤愬熀鎴栧笇灝斿崥澹殑涔﹀掕儗濡傛祦涔熶笉鑳芥嫢鏈夌Н鏋佺殑蹇冩侊紝鍙綋浣犱互縐瀬鐨勫績鎬佸幓鎴愬氨浜嗕竴鐣簨涓氫箣鍚庯紝浣犲氨鍐嶄篃紱諱笉寮瀹冧簡銆傜浉淇℃垜錛孴DD涔熸槸榪欐牱錛佹兂璇曠敤TDD鐨勪漢浠紝璇烽伒寰笅闈㈢殑姝ラ錛?/p>
緙栧啓TestCase --> 瀹炵幇TestCase --> 閲嶆瀯 錛堢‘瀹氳寖鍥村拰鐩爣錛?/td> 聽 錛堝鍔犲姛鑳斤級 聽 錛堟彁鍗囪璁★級
[鍙嬫儏鎻愮ず錛氭晱鎹峰緩妯′腑鐨勪竴涓浉褰撻噸瑕佺殑瀹炶返琚О涓猴細Prove it With Code錛岃繖縐嶆兂娉曞拰TDD涓嶈皨鑰屽悎銆俔
{TDD鐨勪紭鐐箎
銆庡厖婊″惛寮曞姏鐨勪紭鐐廣?/b>
銆庝笉鏄捐屾槗瑙佺殑浼樼偣銆?/b>
銆庢湁浜夎鐨勪紭鐐廣?/b>
緙栧啓TestCase --> 瀹炵幇TestCase --> 閲嶆瀯 錛堜笉鍙繍琛岋級 聽 錛堝彲榪愯錛?/td> 聽 錛堥噸鏋勶級
姝ラ | 鍒跺搧 |
錛?錛夊揩閫熸柊澧炰竴涓祴璇曠敤渚?/td> | 鏂扮殑TestCase |
錛?錛夌紪璇戞墍鏈変唬鐮侊紝鍒氬垰鍐欑殑閭d釜嫻嬭瘯寰堝彲鑳界紪璇戜笉閫氳繃 | 鍘熷鐨凾ODO List |
錛?錛夊仛灝藉彲鑳藉皯鐨勬敼鍔紝璁╃紪璇戦氳繃 | Interface |
錛?錛夎繍琛屾墍鏈夌殑嫻嬭瘯錛屽彂鐜版渶鏂扮殑嫻嬭瘯涓嶈兘緙栬瘧閫氳繃 | 錛?Red Bar) |
錛?錛夊仛灝藉彲鑳藉皯鐨勬敼鍔紝璁╂祴璇曢氳繃 | Implementation |
錛?錛夎繍琛屾墍鏈夌殑嫻嬭瘯錛屼繚璇佹瘡涓兘鑳介氳繃 | 錛?Green Bar) |
錛?錛夐噸鏋勪唬鐮侊紝浠ユ秷闄ら噸澶嶈璁?/td> | Clean Code That Works |
{FAQ}
[浠涔堟椂鍊欓噸鏋勶紵]
濡傛灉鎮ㄥ湪杞歡鍏徃宸ヤ綔錛屽氨鎰忓懗鐫鎮ㄦ垚澶╅兘浼氬拰鎯抽氳繃閲嶆瀯鏀瑰杽浠g爜璐ㄩ噺鐨勬兂娉曟墦浜ら亾錛屼笉浠呮偍濡傛錛屾偍鐨勫ぇ閮ㄥ垎鍚屼簨涔熼兘濡傛銆傚彲鏄紝絀剁珶浠涔堟椂鍊欒閲嶆瀯錛屼粈涔堟儏鍐典笅搴旇閲嶆瀯鍛紵鎴戠浉淇℃偍鍜屾偍鐨勫悓浜嬪彲鑳芥湁寰堝涓嶅悓鐨勭湅娉曪紝鏈甯歌鐨勭瓟妗堟槸鈥滆閲嶆瀯鏃墮噸鏋勨濓紝鈥滃啓涓嶄笅鍘葷殑鏃跺欓噸鏋勨濓紝鍜屸滀笅涓嬈¤凱浠e紑濮嬩箣鍓嶉噸鏋勨濓紝鎴栬呭共鑴嗗氨鏄滄渶榪戞病鏃墮棿錛屽氨涓嶉噸鏋勪簡錛屼笅嬈℃湁鏃墮棿鐨勬椂鍊欓噸鏋勫惂鈥濄傛濡傛偍宸茬粡棰勮鍒版垜鎯寵鐨勨斺旇繖浜涙兂娉曢兘鏄閲嶆瀯鐨勮瑙c傞噸鏋勪笉鏄竴縐嶆瀯寤鴻蔣浠剁殑宸ュ叿錛屼笉鏄竴縐嶈璁¤蔣浠剁殑妯″紡錛屼篃涓嶆槸涓涓蔣浠跺紑鍙戣繃紼嬩腑鐨勭幆鑺傦紝姝g‘鐞嗚В閲嶆瀯鐨勪漢搴旇鎶婇噸鏋勭湅鎴愪竴縐嶄功鍐欎唬鐮佺殑鏂瑰紡錛屾垨涔犳儻錛岄噸鏋勬椂鏃跺埢鍒繪湁鍙兘鍙戠敓銆傚湪TDD涓紝闄ゅ幓緙栧啓嫻嬭瘯鐢ㄤ緥鍜屽疄鐜版祴璇曠敤渚嬩箣澶栫殑鎵鏈夊伐浣滈兘鏄噸鏋勶紝鎵浠ワ紝娌℃湁閲嶆瀯浠諱綍璁捐閮戒笉鑳藉疄鐜般傝嚦浜庝粈涔堟椂鍊欓噸鏋勫槢錛岃繕瑕佸垎寮鐪嬶紝鏈変笁鍙ヨ瘽鏄垜鐨勭粡楠岋細瀹炵幇嫻嬭瘯鐢ㄤ緥鏃墮噸鏋勪唬鐮侊紝瀹屾垚鏌愪釜鐗規ф椂閲嶆瀯璁捐錛屼駭鍝佺殑閲嶆瀯瀹屾垚鍚庤繕瑕佽寰楅噸鏋勪竴涓嬫祴璇曠敤渚嬪摝銆?/p>
[浠涔堟椂鍊欒璁★紵]
榪欎釜闂姣斿墠闈竴涓闅懼洖絳旂殑澶氾紝瀹炶瘽瀹炶錛屾湰浜哄湪渚濈収TDD寮鍙戣蔣浠剁殑鏃跺欎篃甯稿父琚繖涓棶棰樺洶鎵幫紝鎬繪槸瑙夊緱鏈変簺闂搴旇鍦ㄥ啓嫻嬭瘯鐢ㄤ緥涔嬪墠瀹氫笅鏉ワ紝鑰屾湁浜涢棶棰樺簲璇ュ湪鏂板涓涓竴涓祴璇曠敤渚嬬殑榪囩▼涓嚜鐒跺嚭鐜幫紝姘村埌娓犳垚銆傛墍浠ワ紝鎴戠殑寤鴻鏄紝璁捐鐨勬椂鏈哄簲璇ョ敱寮鍙戣呰嚜宸辨妸鎻★紝涓嶈鍙楀埌TDD鏂瑰紡鐨勯檺鍒訛紝浣嗘槸錛屼笉闇瑕佷簨鍏堢‘瀹氱殑浜嬩竴瀹氫笉鑳戒簨鍏堢‘瀹氾紝鍏嶅緱鎹嗕綇浜嗚嚜宸辯殑鎵嬭剼銆?/p>
[浠涔堟椂鍊欏鍔犳柊鐨凾estCase錛焆
娌′簨鍋氱殑鏃跺欍傞氬父鎴戜滑璁や負錛屽鏋滀綘瑕佸鍔犱竴涓柊鐨勫姛鑳斤紝閭d箞鍏堝啓涓涓笉鑳介氳繃鐨?TestCase錛涘鏋滀綘鍙戠幇浜嗕竴涓猙ug錛岄偅涔堝厛鍐欎竴涓笉鑳介氳繃鐨凾estCase錛涘鏋滀綘鐜板湪浠涔堥兘娌℃湁錛屼粠0寮濮嬶紝璇峰厛鍐欎竴涓笉鑳介氳繃鐨?TestCase銆傛墍鏈夌殑宸ヤ綔閮芥槸浠庝竴涓猅estCase寮濮嬨傛澶栵紝榪樿娉ㄦ剰鐨勬槸錛屼竴浜涘ぇ甯堣姹傛垜浠瘡嬈″彧鍏佽鏈変竴涓猅estCase浜孩鐏紝鍦ㄨ繖涓?TestCase娌℃湁Green涔嬪墠涓嶅彲浠ュ啓鍒殑TestCase錛岃繖縐嶈姹傚彲浠ラ傚綋鑰冭檻錛屼絾鍗充嬌鏈夊涓猅estCase浜孩鐏篃涓嶈绱э紝騫舵湭榪濆弽TDD 鐨勪富瑕佺簿紲炪?/p>
[TestCase璇ユ庝箞鍐欙紵]
嫻嬭瘯鐢ㄤ緥鐨勭紪鍐欏疄闄呬笂灝辨槸涓や釜榪囩▼錛氫嬌鐢ㄥ皻涓嶅瓨鍦ㄧ殑浠g爜鍜屽畾涔夎繖浜涗唬鐮佺殑鎵ц緇撴灉銆傛墍浠ヤ竴涓?TestCase涔熷氨搴旇鍖呮嫭涓や釜閮ㄥ垎鈥斺斿満鏅拰鏂█銆傜涓嬈″啓TestCase鐨勪漢浼氭湁寰堝ぇ鐨勪笉閫傚簲鐨勬劅瑙夛紝鍥犱負浣犱箣鍓嶆墍鍐欑殑鎵鏈変笢瑗塊兘鏄湪瑙e喅闂錛岀幇鍦ㄨ浣犳彁鍑洪棶棰樼‘瀹炰笉澶т範鎯紝涓嶈繃涓嶇敤鎷呭績錛屼綘姝e湪鍋氭紜殑浜嬫儏錛岃岃繖涓笘鐣屼笂鏈闅劇殑浜嬫儏涔熶笉鍦ㄤ簬濡備綍瑙e喅闂錛岃屽湪浜巃sk the right question錛?/p>
[TDD鑳藉府鍔╂垜娑堥櫎Bug鍚楋紵]
絳旓細涓嶈兘錛佸崈涓囦笉瑕佹妸鈥滄祴璇曗濆拰鈥滈櫎铏濇販涓轟竴璋堬紒鈥滈櫎铏濇槸鎸囩▼搴忓憳閫氳繃鑷繁鐨勫姫鍔涙潵鍑忓皯bug鐨勬暟閲忥紙娑堥櫎bug榪欐牱鐨勫瓧鐪兼垜浠繕鏄笉瑕佽涓哄ソ^_^錛夛紝鑰屸滄祴璇曗濇槸鎸囩▼搴忓憳涔﹀啓浜у搧浠ュ鐨勪竴孌典唬鐮佹潵紜繚浜у搧鑳芥湁鏁堝伐浣溿傝櫧鐒禩DD鎵緙栧啓鐨勬祴璇曠敤渚嬪湪涓瀹氱▼搴︿笂涓哄鎵綽ug鎻愪緵浜嗕緷鎹紝浣嗕簨瀹炰笂錛屾寜鐓DD鐨勬柟寮忚繘琛岀殑杞歡寮鍙戞槸涓嶅彲鑳介氳繃TDD鍐嶆壘鍒癰ug鐨勶紙鎯蟲兂鎴戜滑鍓嶉潰璇寸殑鈥滃畬宸ユ椂瀹屽伐鈥濓級錛屼綘鎯沖晩錛屽綋鎴戜滑鐨勪唬鐮佸畬鎴愮殑鏃跺欙紝鎵鏈夌殑嫻嬭瘯鐢ㄤ緥閮戒寒浜嗙豢鐏紝榪欐椂闅愯棌鍦ㄤ唬鐮佷腑鐨刡ug涓涓兘涓嶄細闇插嚭椹剼鏉ャ?/p>
浣嗘槸錛屽鏋滆闂滄祴璇曗濆拰鈥滈櫎铏濅箣闂存湁浠涔堣仈緋伙紝鎴戠浉淇¤繕鏄湁寰堝璇濆彲浠ヨ鐨勶紝姣斿TDD浜嬪疄涓婂噺灝戜簡bug鐨勬暟閲忥紝鎶婃煡鎵綽ug鎴樺焦鐨勫叧娉ㄧ偣浠庡叏綰挎垬鍦烘彁鍗囧埌浠g爜鎴樺満浠ヤ笂銆傝繕鏈夛紝bug鐨勬渶鍙曚箣澶勪笉鍦ㄤ簬闅愯棌涔嬫繁錛岃屽湪浜庢弧澶╅亶閲庛傚鏋滀綘鍙戠幇浜嗕竴涓敤鎴峰緢涓嶅鏄撴墠鑳藉彂鐜扮殑bug錛岄偅涔堜笉涓瀹氬宸ヤ綔鍋氬嚭浜嗕粈涔堟澃鍑鴻礎鐚紝浣嗘槸濡傛灉浣犲彂鐜頒竴孌典唬鐮佷腑錛宐ug鐨勫瘑搴︽垨紱繪暎紼嬪害榪囬珮錛岄偅涔堟伃鍠滀綘錛屼綘搴旇鎶涘純騫墮噸鍐欒繖孌典唬鐮佷簡銆俆DD閬垮厤浜嗚繖縐嶆儏鍐碉紝鎵浠ュ皢瀵繪壘bug鐨勫伐浣滈檷浣庡埌浜嗕竴涓柊鐨勪綆搴︺?/p>
[鎴戣涓轟竴涓狥eature緙栧啓TestCase榪樻槸涓轟竴涓被緙栧啓TestCase錛焆
鍒濆鑰呭父闂殑闂銆傝櫧鐒舵垜浠粠TDD 鐨勮鏄庝功涓婄湅鍒板簲璇ヤ負涓涓壒鎬х紪鍐欑浉搴旂殑TestCase錛屼絾涓轟粈涔堣憲鍚嶇殑TDD澶у笀鎵鍐欑殑TestCase閮芥槸鍜岀被/鏂規硶涓涓瀵瑰簲鐨勫憿錛熶負浜嗚В閲婅繖涓棶棰橈紝鎴戝拰鎴戠殑鍚屼簨浠兘鍋氫簡寰堝璇曢獙錛屾渶鍚庢垜浠緱鍒頒簡涓涓粨璁猴紝铏界劧鎴戜笉鐭ラ亾鏄惁姝g‘錛屼絾鏄鏋滄偍娌℃湁絳旀錛屽彲浠ュ涓旂浉淇℃垜浠?/p>
鎴戜滑鐨勭爺絀剁粨鏋滆〃鏄庯紝閫氬父鍦ㄤ竴涓壒鎬х殑寮鍙戝紑濮嬫椂錛屾垜浠拡瀵圭壒鎬х紪鍐欐祴璇曠敤渚嬶紝濡傛灉鎮ㄥ彂鐜拌繖涓壒鎬ф棤娉曠敤TestCase琛ㄨ揪錛岄偅涔堣灝嗚繖涓壒鎬х粏鍒嗭紝鐩磋嚦鎮ㄥ彲浠ヤ負鎵嬩笂鐨勭壒鎬у啓鍑篢estCase涓烘銆備粠榪欓噷寮濮嬫槸鏈瀹夊叏鐨勶紝瀹冧笉浼氬鑷翠換浣曡璁′笂閲嶅ぇ鐨勫け璇備絾鏄紝闅忕潃鎮ㄤ笉鏂殑閲嶆瀯浠g爜錛屼笉鏂殑閲嶆瀯 TestCase錛屼笉鏂殑渚濇嵁TDD鐨勬濇兂鍋氫笅鍘伙紝鏈鍚庡綋浜у搧浼撮殢嫻嬭瘯鐢ㄤ緥闆嗕竴璧峰彂甯冪殑鏃跺欙紝鎮ㄥ氨浼氫笉緇忔剰鐨勫彂鐜扮粡榪囬噸鏋勪互鍚庣殑嫻嬭瘯鐢ㄤ緥寰堝彲鑳芥槸鍜屼駭鍝佷腑鐨勭被/鏂規硶涓涓瀵瑰簲鐨勩?/p>
[浠涔堟椂鍊欏簲璇ュ皢鍏ㄩ儴嫻嬭瘯閮借繍琛屼竴閬嶏紵]
Good Question錛佸ぇ甯堜滑瑕佹眰鎴戜滑姣忔閲嶆瀯涔嬪悗閮借瀹屾暣鐨勮繍琛屼竴閬嶆祴璇曠敤渚嬨傝繖涓姹傚彲浠ョ悊瑙o紝鍥犱負閲嶆瀯寰堝彲鑳戒細鏀瑰彉鏁翠釜浠g爜鐨勭粨鏋勬垨璁捐錛屼粠鑰屽鑷翠笉鍙瑙佺殑鍚庢灉錛屼絾鏄鏋滄垜姝e湪寮鍙戠殑鏄竴涓狤RP鎬庝箞鍔烇紵榪愯涓閬嶅畬鏁寸殑嫻嬭瘯鐢ㄤ緥鍙兘灝嗚姳璐規暟涓皬鏃訛紝鍐典笖鐜板湪寰堝閲嶆瀯閮芥槸鐢卞伐鍏峰仛鍒扮殑錛岃繖涓姹傜殑鍙鎬у拰鍓嶆彁鏉′歡閮芥湁鎵鍔ㄦ憞銆傛墍浠ユ垜璁や負鍘熷垯涓婁綘鍙互鎸戝嚑涓綘瑙夊緱鍙兘鍙楀埌鏈閲嶆瀯褰卞搷鐨凾estCase鍘籸un錛屼絾鏄鏋滆繍琛屾暣涓祴璇曞寘鍙鑺辮垂鏁扮鐨勬椂闂達紝閭d箞涓嶄粙鎰忎綘鎸夊ぇ甯堢殑瑕佹眰鍘誨仛銆?/p>
[浠涔堟椂鍊欐敼榪涗竴涓猅estCase錛焆
澧炲姞鐨勬祴璇曠敤渚嬫垨閲嶆瀯浠ュ悗鐨勪唬鐮佸鑷翠簡鍘熸潵鐨凾estCase鐨勫け鍘諱簡鏁堟灉錛屽彉寰楁棤鎰忎箟錛岀敋鑷沖彲鑳藉鑷撮敊璇殑緇撴灉錛岃繖鏃舵槸鏀硅繘TestCase鐨勬渶濂芥椂鏈恒備絾鏄湁鏃朵綘浼氬彂鐜幫紝榪欐牱鍋氫粎浠呭鑷翠簡鍘熸潵鐨凾estCase鍦ㄨ璁′笂鏄噧鑲跨殑錛屾垨鑰呮槸鍐椾綑鐨勶紝榪欓兘涓嶈绱э紝鍙瀹冩病鏈夊け鏁堬紝浣犱粛鐒朵笉鐢ㄥ幓鏀硅繘瀹冦傝浣忥紝TestCase涓嶆槸浣犵殑浜у搧錛屽畠涓嶈濂界湅錛屼篃涓嶈鎬庝箞澶瀛︼紝鐢氳嚦娌℃湁鎬ц兘瑕佹眰錛屽畠鍙鑳藉畬鎴愬畠鐨勪嬌鍛藉氨鍙互浜嗏斺旇繖涔熻瘉鏄庝簡鎴戜滑鍚庨潰鎵璇寸殑鈥滅敤Ctrl-C/Ctrl-V緙栧啓嫻嬭瘯鐢ㄤ緥鈥濈殑鍙鎬с?/p>
浣嗘槸錛岀編鍥戒漢鐨勬兂娉曞叾瀹炶窡鎴戜滑榪樻槸涓嶅お涓鏍鳳紝鎷挎墭灝煎反璧炵殑MindMap鏉ヨ鍚э紝鍏跺疄鐢籑indMap鍙槸涓轟簡琛ㄧ幇鑷繁鐨勬濊礬錛屾垨璁板繂鏌愪簺閲嶈鐨勪簨鎯咃紝浣嗘墭灝煎嵈寤鴻澶у鎶奙indMap鐢繪垚涓浠惰壓鏈搧錛岀敋鑷寵繕鏈夊緢澶氳壓鏈鎶婅嚜宸辯敾鐨勬娊璞℃淳MindMap鎷垮嚭鏉ュ府鍔╂墭灝煎仛瀹d紶銆傚悓鏍鳳紝澶у笀浠篃瑕佹眰鎴戜滑鎶奣estCase鍐欑殑璺熶唬鐮佷竴鏍瘋川閲忕簿鑹紝鍙垜鎯寵鐨勬槸錛岀幇鍦ㄥ浗鍐呮湁鍑犱釜鍏徃鑳芥妸浜у搧鐨勪唬鐮佸啓鐨勭簿鑹紵錛熻繕鏄竴姝ヤ竴姝ユ參鎱㈡潵鍚с?/p>
[涓轟粈涔堝師鏉ラ氳繃鐨勬祴璇曠敤渚嬬幇鍦ㄤ笉鑳介氳繃浜嗭紵]
榪欐槸涓涓鎶ワ紝Red Alert錛佸畠鍙兘琛ㄨ揪浜嗕袱灞傛剰鎬濃斺旈兘涓嶆槸浠涔堝ソ鎰忔濃斺?錛変綘鍒氬垰榪涜鐨勯噸鏋勫彲鑳藉け璐ヤ簡錛屾垨瀛樺湪涓浜涢敊璇湭琚彂鐜幫紝鑷沖皯閲嶆瀯鐨勭粨鏋滃拰鍘熸潵鐨勪唬鐮佷笉絳変環浜嗐?錛変綘鍒氬垰澧炲姞鐨凾estCase鎵琛ㄨ揪鐨勬剰鎬濊窡鍓嶉潰宸茬粡鏈夌殑TestCase鐩稿啿紿侊紝涔熷氨鏄錛屾柊澧炵殑鍔熻兘榪濊儗浜嗗凡鏈夌殑璁捐錛岃繖縐嶆儏鍐靛ぇ閮ㄥ垎鍙兘鏄箣鍓嶇殑璁捐閿欎簡銆備絾鏃犺鍝敊浜嗭紝鏃犺鏄偅灞傛剰鎬濓紝鎯蟲壘鍒拌繖涓棶棰樼殑鏍規簮閮芥瘮TDD鐨勬甯稿伐浣滆闅俱?/p>
[鎴戞庝箞鐭ラ亾閭i噷璇ユ湁涓涓柟娉曡繕鏄鏈変竴涓被錛焆
榪欎釜闂涔熸槸甯稿父鍑虹幇鍦ㄦ垜鐨勮剳嫻蜂腑錛屾棤璁轟綘鏄涓嬈℃帴瑙DD鎴栬呭凡緇忔垚涓?TDD涓撳錛岃繖涓棶棰橀兘浼氱紶緇曠潃浣犱笉鏀俱備笉榪囬棶棰樼殑絳旀鍙互鍙傝冨墠闈㈢殑鈥滀粈涔堟椂鍊欒璁♀濅竴鑺傦紝絳旀涓嶆槸鍞竴鐨勩傚叾瀹炲鏁版椂鍊欎綘涓嶅繀鑰冭檻鏈潵錛屼粖澶╁彧鍋氫粖澶╃殑浜嬶紝鍙鏈夐噸鏋勫伐鍏鳳紝浠庢柟娉曞埌綾誨拰浠庣被鍒版柟娉曢兘寰堝鏄撱?/p>
[鎴戣鍐欎竴涓猅estCase錛屽彲鏄笉鐭ラ亾浠庡摢閲屽紑濮嬶紵]
浠庢渶閲嶈鐨勪簨寮濮嬶紝what matters most錛熶粠鑴氫笅寮濮嬶紝浠庢墜澶翠笂鐨勫伐浣滃紑濮嬶紝浠庣溂鍓嶇殑浜嬪紑濮嬨備粠涓涓病鏈塙I鐨勬牳蹇冪壒鎬у紑濮嬶紝浠庣畻娉曞紑濮嬶紝鎴栬呬粠鏈鏈夊彲鑳借借鏃墮棿鐨勬ā鍧楀紑濮嬶紝浠庝竴涓渶涓ラ噸鐨刡ug寮濮嬨傝繖鏄疶DD涓諱箟鑰呭拰榧犵洰瀵稿厜鑰呯殑涓涓叡鍚岀偣錛屼笉鍚岀偣鏄墠鑰呮棭宸叉垚绔瑰湪鑳搞?/p>
[涓轟粈涔堟垜鐨勬祴璇曟繪槸鐪嬭搗鏉ユ湁鐐規剼锠紵]
鍝︼紵鏄悧錛熸潵錛屾彙涓墜錛屾垜鐨勪篃鏄紒涓嶅繀鎷呭績榪欎竴鐐癸紝浜嬪疄涓婏紝澶у笀浠粰鐨勪緥瀛愪篃鐩稿綋鎰氳牏錛屾瘮濡備竴涓瀬绔殑渚嬪瓙鏄鍐欎竴涓袱涓猧nt鍙橀噺鐩稿姞鐨勬柟娉曪紝澶у笀鍏堟柇璦2+3=5錛屽啀鏂█5+5=10錛岄毦閬撹繖浜涗唬鐮佷笉鏄緢鎰氳牏鍚楋紵鍏跺疄榪欏彧鏄竴涓瀬绔殑渚嬪瓙錛屽綋浣犲垵嬈℃帴瑙DD鏃訛紝鍐欒繖鏍風殑浠g爜娌′粈涔堜笉濂斤紝浠ュ悗褰撲綘鐔熺粌鏃跺氨浼氬彂鐜拌繖鏍峰啓娌″繀瑕佷簡錛岃璁頒綇錛岃唉铏氭槸閫氬線TDD鐨勫繀緇忎箣璺紒浠庣粡鍏稿紑鍙戞柟娉曡漿鍚慣DD灝卞儚浠庨潰鍚戣繃紼嬭漿鍚戦潰鍚戝璞′竴鏍峰洶闅撅紝浣犲彲鑳戒粈涔堥兘鎳傦紝浣嗕綘鍐欏嚭鏉ョ殑綾繪病鏈変竴涓函OO鐨勶紒鎴戠殑鍚屼簨榪樺憡璇夋垜鐪熸鐨勫お鏋佹嫵錛屽叾閫熷害鏄緢蹇殑錛屼笉姣斾換浣曚竴涓揩鎷寵鎱紝浣嗘槸鍒濆鑰咃紙閫氬父鏄寚瀛︿範澶瀬鎷崇殑鍓?0騫達級澶笉瀹規槗鎶婃瘡涓Э鍔塊兘鍋氬錛屾墍浠ュ彧鑳芥參鎱㈡潵銆?/p>
[浠涔堝満鍚堜笉閫傜敤TDD錛焆
闂殑濂斤紝紜疄鏈夊緢澶氬満鍚堜笉閫傚悎浣跨敤TDD銆傛瘮濡傚杞歡璐ㄩ噺瑕佹眰鏋侀珮鐨勫啗浜嬫垨縐戠爺浜у搧鈥斺旂宸炲叚鍙鳳紝浜哄懡鍏沖ぉ鐨勮蔣浠垛斺斿尰鐤楄澶囷紝絳夌瓑錛屽啀姣斿璁捐寰堥噸瑕佸繀欏繪彁鍓嶅仛濂界殑杞歡錛岃繖浜涢兘涓嶉傚悎TDD錛屼絾鏄笉閫傚悎TDD涓嶄唬琛ㄤ笉鑳藉啓TestCase錛屽彧鏄綔鐢ㄤ笉鍚岋紝鍦頒綅涓嶅悓緗簡銆?/p>
{Best Practise}
[寰瑧闈㈠緙栬瘧閿欒]
瀛︾敓鏃朵唬鏈瀹蟲曠殑灝辨槸緙栬瘧閿欒錛岀紪璇戦敊璇彲鑳戒細琚佸笀瑙嗕負涓婅涓嶈鐪熷惉璇劇殑璇佹嵁錛屾垨鑰呭悓瀛﹂棿鐩鎬簰鍢茬瑧鐨勭牆鐮併傜敋鑷崇寮瀛︽牎寰堝騫寸殑鑰佺▼搴忓憳渚濈劧瀹蟲曞畠灝卞儚瀹蟲曡繜鍒頒竴鏍鳳紝娼滄剰璇嗛噷浼間箮緙栬瘧閿欒鏋佹湁鍙兘鍜屽伐璧勬寕閽╋紙鎴栬呭拰鏅哄晢鎸傞挬錛屽弽姝i兘涓嶆槸浠涔堝ソ浜嬶級銆傚叾瀹烇紝鍙鎻愪氦鍒扮増鏈鐞嗙殑浠g爜娌℃湁緙栬瘧閿欒灝卞彲浠ヤ簡錛屼笉瑕佹媴蹇冭嚜宸辨墜涓婄殑浠g爜鐨勭紪璇戦敊璇紝閫氬父錛岀紪璇戦敊璇兘闆嗕腑鍦ㄤ笅闈笁涓柟闈細
錛?錛変綘鐨勪唬鐮佸瓨鍦ㄤ綆綰ч敊璇?br />錛?錛夌敱浜庢煇浜汭nterface鐨勫疄鐜板皻涓嶅瓨鍦紝鎵浠ヨ嫻嬭瘯浠g爜鏃犳硶緙栬瘧
錛?錛夌敱浜庢煇浜涗唬鐮佸皻涓嶅瓨鍦紝鎵浠ユ祴璇曚唬鐮佹棤娉曠紪璇?br />璇鋒敞鎰忕浜岀偣涓庣涓夌偣瀹屽叏涓嶅悓錛屽墠鑰呰〃鏄庤璁″凡瀛樺湪錛岃屽疄鐜頒笉瀛樺湪瀵艱嚧鐨勭紪璇戦敊璇紱鍚庤呭垯鎸囦粎鏈塗estCase鑰屽叾瀹冧粈涔堥兘娌℃湁鐨勬儏鍐碉紝璁捐鍜屽疄鐜伴兘涓嶅瓨鍦紝娌℃湁Interface涔熸病鏈塈mplementation銆?/p>
鍙﹀錛岀紪璇戝櫒榪樻湁涓涓紭鐐癸紝閭e氨鏄互鏈鏁忔嵎鐨勮韓鎵嬪憡璇変綘錛屼綘鐨勪唬鐮佷腑鏈夐偅浜涢敊璇傚綋鐒跺鏋滀綘鎷ユ湁Eclipse榪欐牱鍙互鍙婃椂鎻愮ず緙栬瘧閿欒鐨処DE錛屽氨涓嶉渶瑕佽繖鏍風殑鍔熻兘浜嗐?/p>
[閲嶈浣犵殑璁″垝娓呭崟]
鍦ㄩ潪TDD鐨勬儏鍐典笅錛屽挨鍏舵槸浼犵粺鐨勭戝竷妯″瀷鐨勬儏鍐典笅錛岀▼搴忓憳涓嶄細涓嶇煡閬撹鍋氫粈涔堬紝浜嬪疄涓婏紝鎬繪槸鏈夎璁℃垨鑰呭埆鐨勪粈涔堝埗鍝佸湪寮曞紼嬪簭鍛樺紑鍙戙備絾鏄湪TDD鐨勬儏鍐典笅錛岃繖縐嶄紭鍔挎病鏈変簡錛屾墍浠ヤ竴涓鍒掓竻鍗曞浣犳潵璇村崄鍒嗛噸瑕侊紝鍥犱負浣犲繀欏昏嚜宸卞彂鐜拌鍋氫粈涔堛備笉鍚屾ф牸鐨勪漢瀵逛簬榪欎竴鐐逛細鏈変笉鍚岀殑鍙嶅簲錛屾垜鐩鎬俊騫蟲椂鍋氫簨娌′粈涔堣鍒掕渚濋潬鍒漢瀹夋帓鐨勪漢錛堟墍璋撳皢鎵嶏級鍙兘鐣ユ湁涓嶉傚簲錛屼笉榪囦笉瑕佺揣錛孴asks鍜孋alendar錛堝張縐版晥鐜囨墜鍐岋級鏃╁凡鎴愪負鐜頒唬涓婄彮鏃忕殑蹇呭宸ュ叿浜嗭紱鑰屽鉤鏃跺伐浣滅敓媧誨氨寰堟湁璁″垝鎬х殑浜猴紝姣斿鎴?)錛屽氨浼氭洿鍠滄榪欑鑷繁鍙互鎺屾帶Plan鐨勬柟寮忎簡銆?/p>
[搴熼粶姣忔棩浠g爜璐ㄩ噺媯鏌
濡傛灉鎴戞病鏈夎閿欑殑璇濓紝PSP瀵逛簬涓漢浠g爜媯鏌ョ殑瑕佹眰鏄洰涓ユ牸鐨勶紝鑰屽悓鏍鋒槸鍦ㄩ拡瀵逛釜浜虹殑闂涓婏紝 TDD鍗村緩璁綘搴熼粶姣忔棩浠g爜璐ㄩ噺媯鏌ワ紝鍒搗鐤戝績錛屽洜涓轟綘鎬繪槸鍦ㄥ仛TestCase瑕佹眰浣犲仛鐨勪簨鎯咃紝騫朵笖鎬繪槸鏈夊姙娉曪紙鑷姩鐨勶級媯鏌ヤ唬鐮佹湁娌℃湁鍋氬埌榪欎簺浜嬫儏 鈥斺旂孩鐏仠緇跨伅琛岋紝鎵浠ユ瘡鏃ヤ唬鐮佹鏌ョ殑鏃墮棿鍙兘琚妭鐪侊紝瀵逛簬涓涓弗鏍肩殑PSP瀹炶返鑰呮潵璇達紝榪欎釜鎴愭湰榪樻槸寰堝彲瑙傜殑錛?/p>
姝ゅ錛屽浜庢瘡鏃ヤ唬鐮佽川閲忔鏌ョ殑鍙︿竴涓ソ澶勶紝灝辨槸甯姪浣犺璇嗚嚜宸辯殑浠g爜錛屽叏闈㈢殑浠庡畯瑙傘佸井瑙傘佸悇涓搴﹀瑙嗚嚜宸辯殑鎴愭灉錛岀幇鍦紝褰撲綘渚濈収TDD鍋氫簨鏃訛紝榪欎釜浼樼偣涔熶笉闇瑕佷簡錛岃繕璁板緱鍓嶉潰璇寸殑TDD鐨勭浜屼釜浼樼偣鍚楋紝鍥犱負浣犲凡緇忓叏闈㈢殑浣跨敤浜嗕竴閬嶄綘鐨勪唬鐮侊紝榪欏畬鍏ㄥ彲浠ヨ揪鍒扮洰鐨勩?/p>
浣嗘槸錛岄棶棰樺線寰涔熷茍涓嶉偅涔堢畝鍗曪紝鐜板湪鏈夋病鏈変漢鑳藉憡璇夋垜錛屾垜濡備綍鍏ㄩ潰瀹¤鎴戞墍鍐欑殑嫻嬭瘯鐢ㄤ緥鍛紵鍒繕浜嗭紝瀹冧滑涔熸槸浠ヤ唬鐮佺殑褰㈠紡瀛樺湪鐨勫摝銆傚懙鍛碉紝浣嗘効榪欎釜闂娌℃湁鎶婁綘鍚撳埌錛屽洜涓烘垜鐩鎬俊鍒扮洰鍓嶄負姝紝瀹冭繕涓嶆槸鐡墮闂錛屽喌涓斿湪緙栧啓浜у搧浠g爜鐨勬椂鍊欎綘榪樻槸浼氳嚜涓葷殑鍙戠幇寰堝嫻嬭瘯浠g爜涓婄殑娌¤冭檻鍒扮殑鍦版柟錛屽彲浠ュ氨姝や慨鏀逛竴涓嬨傞亾鐞嗗氨鏄姝わ紝涓栫晫涓婃病鏈変換浣曟柟娉曡兘浠f浛浣犳濊冪殑榪囩▼錛屾墍浠ヤ篃娌℃湁浠諱綍鏂規硶鑳介樆姝綘鐘敊璇紝TDD浠呰兘璁╀綘鏇村鏄撳彂鐜拌繖浜涢敊璇屽凡銆?/p>
[濡傛灉鏃犳硶瀹屾垚涓涓ぇ鐨勬祴璇曪紝灝變粠鏈灝忕殑寮濮媇
濡傛灉鎴戞棤娉曞紑濮嬫庝箞鍔烇紝鏁欑涔︿笂鏈変釜寰堝ソ鐨勪緥瀛愶細鎴戣鍐欎竴涓數褰卞垪琛ㄧ殑綾伙紝鎴戜笉鐭ラ亾濡備綍涓嬫墜錛屽浣曞啓嫻嬭瘯鐢ㄤ緥錛屼笉瑕佺揣錛岄鍏堟兂璞¢潤鎬佺殑緇撴灉錛屽鏋滄垜鐨勭數褰卞垪琛ㄥ垰鍒氬緩绔嬪憿錛岄偅涔堝畠搴旇鏄┖鐨勶紝OK錛屽氨鍐欒繖涓柇璦鍚э紝鏂█涓涓垰鍒氬垵濮嬪寲鐨勭數褰卞垪琛ㄦ槸絀虹殑銆傝繖涓嶆槸鎰氳牏錛岃繖鏄粏鑺傦紝濂ヨ繍浼氫簲欏瑰叏鑳界殑閲戠墝寰椾富鐜涗附鑾猜烽噾鏄繖鏍瘋鐨勶細鈥滄垚鍔熶漢澹殑鍏卞悓鐐瑰湪浜庘︹﹀鏋滅洰鏍囦笉澶熸竻鏅幫紝浠栦滑浼氶鍏堝仛閫氬線鎴愬姛閬撹礬涓婄殑姣忎竴涓粏灝忔楠も︹︹濄?/p>
[灝濊瘯緙栧啓鑷繁鐨剎Unit]
Kent Beck寤鴻澶у姣忓綋鎺ヨЕ涓涓柊鐨勮璦鎴栧紑鍙戝鉤鍙扮殑鏃跺欙紝灝辮嚜宸卞啓榪欎釜璇█鎴栧鉤鍙扮殑xUnit錛屽叾瀹炲嚑涔庢墍鏈夊父鐢ㄧ殑璇█鍜屽鉤鍙伴兘宸茬粡鏈変簡鑷繁鐨?xUnit錛岃屼笖閮芥槸澶у悓灝忓紓錛屼絾鏄負浠涔堝ぇ甯堢粰鍑轟簡榪欐牱鐨勫緩璁憿銆傚叾瀹濳ent Beck鐨勬剰鎬濇槸璇撮氳繃榪欐牱鐨勬柟寮忎綘鍙互寰堝揩鐨勪簡瑙h繖涓璦鎴栧鉤鍙扮殑鐗規э紝鑰屼笖xUnit紜疄寰堢畝鍗曪紝鍙鐭ラ亾鍘熺悊寰堝揩灝辮兘鍐欏嚭鏉ャ傝繖瀵逛簬閭d簺鍠滄鑷繁鍐欏簳灞備唬鐮佺殑浜猴紝鎴栬呭枩嬈㈡帶鍒跺姏鐨勪漢鑰岃█鏄釜濂芥秷鎭?/p>
[鍠勪簬浣跨敤Ctrl-C/Ctrl-V鏉ョ紪鍐橳estCase]
涓嶅繀鎷呭績TestCase浼氭湁浠g爜鍐椾綑鐨勯棶棰橈紝璁╁畠鍐椾綑濂戒簡銆?/p>
[姘歌繙閮芥槸鍔熻兘First錛屾敼榪涘彲浠ョ◢鍚庤繘琛宂
涓婇潰榪欎釜鏍囬榪樺彲浠ユ敼鎴愬彟澶栦竴鍙ヨ瘽錛氶伩鍏嶈繃娓¤璁★紒
[娣樻卑闄堟棫鐨勭敤渚媇
鑸嶄笉寰楀瀛愬涓嶇潃鐙箋備笉瑕佸彲鎯滈檲鏃х殑鐢ㄤ緥錛屽洜涓哄畠浠彲鑳戒粠姒傚康涓婂凡緇忔槸閿欒鐨勪簡錛屾垨浠呬粎浼氬緱鍑洪敊璇殑緇撴灉錛屾垨鑰呭湪鏌愭閲嶆瀯涔嬪悗澶卞幓浜嗘剰涔夈傚綋鐒朵篃涓嶄竴瀹氶潪瑕佸垹闄ゅ畠浠紝浠嶵estSuite涓櫎鍘伙紙JUnit錛夋垨鍔犱笂Ignored錛圢Unit錛夋爣絳句篃鏄竴涓ソ鍔炴硶銆?/p>
[鐢═estCase鍋氳瘯楠宂
濡傛灉浣犲湪寮濮嬫煇涓壒鎬ф垨浜у搧鐨勫紑鍙戜箣鍓嶅鏌愪釜棰嗗煙涓嶅お鐔熸倝鎴栦竴鏃犳墍鐭ワ紝鎴栬呭鑷繁鍦ㄨ棰嗗煙閲岀殑鑳藉姏涓鏃犳墍鐭ワ紝閭d箞浣犱竴瀹氫細閫夋嫨鍋氳瘯楠岋紝鍦ㄦ湁鍗曞厓嫻嬭瘯浣滃伐鍏風殑鎯呭喌涓嬶紝寤鴻浣犵敤TestCase鍋氳瘯楠岋紝榪欑湅璧鋒潵灝卞儚浣犲湪鍐欎竴涓獙璇佸姛鑳芥槸鍚﹀疄鐜扮殑 TestCase涓鏍鳳紝鑰屼簨瀹炰笂涔熶竴鏍鳳紝鍙笉榪囦綘鎵楠岃瘉鐨勪笉鏄唬鐮佹湰韜紝鑰屾槸榪欎簺浠g爜鎵渚濊禆鐨勭幆澧冦?/p>
[TestCase涔嬮棿搴旇灝介噺鐙珛]
淇濊瘉鍗曠嫭榪愯涓涓猅estCase鏄湁鎰忎箟鐨勩?/p>
[涓嶄粎嫻嬭瘯蹇呴』瑕侀氳繃鐨勪唬鐮侊紝榪樿嫻嬭瘯蹇呴』涓嶈兘閫氳繃鐨勪唬鐮乚
榪欐槸涓涓皬鎶宸э紝涔熸槸涓嶅悓浜庤璁℃濊礬鐨勪笢瑗褲傚儚瓚婄晫鐨勫兼垨鑰呬貢鐮侊紝鎴栬呯被鍨嬩笉絎︾殑鍙橀噺錛岃繖浜涜緭鍏ラ兘鍙兘浼氬鑷存煇涓紓甯哥殑鎶涘嚭錛屾垨鑰呭鑷翠竴涓爣紺衡渋llegal parameters鈥濈殑榪斿洖鍊鹼紝榪欎袱縐嶆儏鍐典綘閮藉簲璇ユ祴璇曘傚綋鐒舵垜浠棤娉曟灇涓炬墍鏈夐敊璇殑杈撳叆鎴栧閮ㄧ幆澧冿紝榪欏氨鍍忔垜浠棤娉曟灇涓炬墍鏈夋紜殑杈撳叆鍜屽閮ㄧ幆澧冧竴鏍鳳紝鍙TestCase鑳借鏄庨棶棰樺氨鍙互浜嗐?/p>
[緙栧啓浠g爜鐨勭涓姝ワ紝鏄湪TestCase涓敤Ctrl-C]
榪欐槸涓涓珮綰ф妧宸э紝鍛冿紝鏄殑錛屾垜鏄繖涓剰鎬濓紝鎴戜笉鏄榪欎釜鎶宸ч毦浠ユ帉鎻★紝鑰屾槸璇磋繖涓妧宸у綋涓斾粎褰撲綘宸茬粡鏄竴涓猅DD楂樻墜鏃訛紝浣犳墠鑳戒綋浼氬埌瀹冪殑欖呭姏銆傚嬈′嬌鐢═DD鐨勪漢閮芥湁榪欐牱鐨勪綋浼氾紝鏃㈢劧鎴戠殑TestCase宸茬粡鍐欑殑寰堝ソ浜嗭紝寰堣兘璇存槑闂錛屼負浠涔堟垜鐨勪唬鐮佷笉鑳戒粠TestCase鎷瘋礉涓浜涗笢瑗挎潵鍛€傚綋鐒訛紝榪欒姹備綘鐨凾estCase宸茬粡鍏鋒湁寰堝ソ鐨勮〃杈捐兘鍔涳紝姣斿鏂█f (5)=125鐨勬柟寮忔樉鐒舵病鏈夋柇璦f(5)=5^(5-2)琛ㄨ揪鏇村鐨勫唴瀹廣?/p>
[嫻嬭瘯鐢ㄤ緥鍖呭簲璇ュ敖閲忚璁℃垚鍙互鑷姩榪愯鐨刔
濡傛灉浜у搧鏄渶瑕佷氦浠樻簮浠g爜鐨勶紝閭f垜浠簲璇ュ厑璁哥敤鎴峰浠g爜榪涜淇敼鎴栨墿鍏呭悗鍦ㄨ嚜宸辯殑鐜涓媟un鏁翠釜嫻嬭瘯鐢ㄤ緥鍖呫傛棦鐒墮氬父鎯呭喌涓嬬殑浜у搧鏄彲浠ヨ嚜鍔ㄨ繍琛岀殑錛岄偅涓轟粈涔堝悓鏍蜂綔涓轟氦浠樼敤鎴風殑鍒跺搧錛屾祴璇曠敤渚嬪寘灝變笉鏄嚜鍔ㄨ繍琛岀殑鍛紵鍗充嬌浜у搧涓嶉渶瑕佷氦浠樻簮浠g爜錛屾祴璇曠敤渚嬪寘涔熷簲璇ヨ璁℃垚鍙互鑷姩榪愯鐨勶紝榪欎負嫻嬭瘯閮ㄩ棬鎴栦笅涓鐗堟湰鐨勫紑鍙戜漢鍛樻彁渚涗簡鏋佸ぇ鐨勪究鍒┿?/p>
[鍙寒涓鐩忕孩鐏痌
澶у笀鐨勫緩璁紝鍓嶉潰宸茬粡鎻愬埌浜嗭紝浠呬粎鏄緩璁?/p>
[鐢═estCase鎻忚堪浣犲彂鐜扮殑bug]
濡傛灉浣犲湪鍙︿竴涓儴闂ㄧ殑鍚屼簨浣跨敤浜嗕綘鐨勪唬鐮侊紝騫朵笖錛屼粬鍙戠幇浜嗕竴涓猙ug錛屼綘鐚滀粬浼氭庝箞鍋氾紵浠栦細绔嬪嵆璧板埌浣犵殑宸ヤ綅杈逛笂錛屽ぇ澹版枼璐h錛氣滀綘鏈塨ug錛佲濆悧錛熷鏋滀粬鑳嗘暍榪欐牱瀵逛綘錛屽涓嶈搗錛屼綘涓瀹氳鍐烽潤涓嬫潵錛屼笉瑕佸綋闈㈠洖楠備粬錛岀浉鍙嶄綘鍙互寰井涓絎戯紝鐒跺悗蹇冨鉤姘斿拰鐨勫浠栬錛氣滃摝錛屾槸鍚楋紵閭d箞濂藉惂錛岀粰鎴戜竴涓猅estCase璇佹槑涓涓嬨傗濈幇鍦ㄥ眬鍔垮凡緇忓掑悜浣犺繖涓杈逛簡錛屽鏋滀粬榪樻病鏈夊噯澶囧ソ鍥炵瓟浣犺繖鑷村懡鐨勪竴鍑伙紝鎴戠寽浠栦細鎰熷埌闈炲父緹炴劎錛屽茍鍦ㄥ唴蹇冭矗鎬嚜宸卞お鑾芥挒銆備簨瀹炰笂錛屽鏋滀粬鐨凾estCase娌℃湁榪囧鐨勮姹備綘鐨勪唬鐮侊紙鑰屾槸鎸変綘浠簨鍓嶇殑濂戠害錛夛紝騫朵笖浜簡綰㈢伅錛岄偅涔堝氨鍙互紜畾鏄綘鐨刡ug錛屽弽涔嬶紝瀵規柟鍒欐棤鐞嗕簡銆傜敤TestCase鎻忚堪bug鐨勫彟涓涓ソ澶勬槸錛屼笉浼氬洜涓轟互鍚庣殑淇敼鑰屽啀嬈℃毚闇茶繖涓猙ug錛屽畠宸茬粡鎴愪負浣犲彂甯冩瘡涓涓増鏈箣鍓嶆墍蹇呴』媯鏌ョ殑鍐呭浜嗐?/p>
{鍏充簬鍗曞厓嫻嬭瘯}
鍗曞厓嫻嬭瘯鐨勭洰鏍囨槸
Keep the bar green to keep the code clean
榪欏彞璇濈殑鍚箟鏄紝浜嬪疄涓婃垜浠彧鍋氫袱浠朵簨鎯咃細璁╀唬鐮佸鏁堬紙Keep the bar green錛夊拰璁╀唬鐮佹磥鍑錛圞eep the code clean錛夛紝鍓嶈呮槸鎶婁簨鎯呭仛瀵癸紝鍚庤呮槸鎶婁簨鎯呭仛濂斤紝涓よ呮棦鏄疶DD涓殑涓ら《甯藉瓙錛屽張鏄痻Unit鏋舵瀯涓殑鍥犳灉鍏崇郴銆?/p>
鍗曞厓嫻嬭瘯浣滀負杞歡嫻嬭瘯鐨勪竴涓被鍒紝騫墮潪鏄痻Unit鏋舵瀯鍒涢犵殑錛岃屾槸寰堟棭灝辨湁浜嗐備絾鏄痻Unit鏋舵瀯浣垮緱鍗曞厓嫻嬭瘯鍙樺緱鐩存帴銆佺畝鍗曘侀珮鏁堝拰瑙勮寖錛岃繖涔熸槸鍗曞厓嫻嬭瘯鏈榪戝嚑騫撮閫熷彂灞曟垚涓鴻 閲忎竴涓紑鍙戝伐鍏峰拰鐜鐨勪富瑕佹寚鏍囦箣涓鐨勫師鍥犮傛濡侻artin Fowler鎵璇達細鈥滆蔣浠跺伐紼嬫湁鍙蹭互鏉ヤ粠娌℃湁濡傛浼楀鐨勪漢澶уぇ鏀剁泭浜庡姝ょ畝鍗曠殑浠g爜錛佲濊屼笖澶氭暟璇█鍜屽鉤鍙扮殑xUnit鏋舵瀯閮芥槸澶у悓灝忓紓錛屾湁鐨勪粎鏄璦涓嶅悓錛屽叾涓渶鏈変唬琛ㄦх殑鏄疛Unit鍜孨Unit錛屽悗鑰呮槸鍓嶈呯殑鍒涙柊鍜屾墿灞曘備竴涓崟鍏冩祴璇曟鏋秞Unit搴旇錛?錛変嬌姣忎釜TestCase鐙珛榪愯錛?錛変嬌姣忎釜TestCase鍙互鐙珛媯嫻嬪拰鎶ュ憡閿欒錛?錛夋槗浜庡湪姣忔榪愯涔嬪墠閫夋嫨TestCase銆備笅闈㈡槸鎴戞灇涓懼嚭鐨剎Unit妗嗘灦鐨勬蹇碉紝榪欎簺姒傚康鏋勬垚浜嗗綋鍓嶄笟鐣屽崟鍏冩祴璇曠悊璁哄拰宸ュ叿鐨勬牳蹇冿細
[嫻嬭瘯鏂規硶/TestMethod]
嫻嬭瘯鐨勬渶灝忓崟浣嶏紝鐩存帴琛ㄧず涓轟唬鐮併?/p>
[嫻嬭瘯鐢ㄤ緥/TestCase]
鐢卞涓祴璇曟柟娉曠粍鎴愶紝鏄竴涓畬鏁寸殑瀵硅薄錛屾槸寰堝TestRunner鎵ц鐨勬渶灝忓崟浣嶃?/p>
[嫻嬭瘯瀹瑰櫒/TestSuite]
鐢卞涓祴璇曠敤渚嬫瀯鎴愶紝鎰忓湪鎶婄浉鍚屽惈涔夌殑嫻嬭瘯鐢ㄤ緥鎵嬪姩瀹夋帓鍦ㄤ竴璧鳳紝TestSuite鍙互鍛堟爲鐘剁粨鏋勫洜鑰屼究浜庣鐞嗐傚湪瀹炵幇鏃訛紝TestSuite褰㈠紡涓婂線寰涔熸槸涓涓猅estCase鎴朤estFixture銆?/p>
[鏂█/Assertion]
鏂█涓鑸湁涓夌被錛屽垎鍒槸姣旇緝鏂█錛堝assertEquals錛夛紝鏉′歡鏂█錛堝isTrue錛夛紝鍜屾柇璦宸ュ叿錛堝fail錛夈?/p>
[嫻嬭瘯璁懼/TestFixture]
涓烘瘡涓祴璇曠敤渚嬪畨鎺掍竴涓猄etUp鏂規硶鍜屼竴涓猅earDown鏂規硶錛屽墠鑰呯敤浜庡湪鎵ц璇ユ祴璇曠敤渚嬫垨璇ョ敤渚嬩腑鐨勬瘡涓祴璇曟柟娉曞墠璋冪敤浠ュ垵濮嬪寲鏌愪簺鍐呭錛屽悗鑰呭湪鎵ц璇ユ祴璇曠敤渚嬫垨璇ョ敤渚嬩腑鐨勬瘡涓柟娉曚箣鍚庤皟鐢紝閫氬父鐢ㄦ潵娑堥櫎嫻嬭瘯瀵圭郴緇熸墍鍋氱殑淇敼銆?/p>
[鏈熸湜寮傚父/Expected Exception]
鏈熸湜璇ユ祴璇曟柟娉曟姏鍑烘煇縐嶆寚瀹氱殑寮傚父錛屼綔涓轟竴涓滄柇璦鈥濆唴瀹癸紝鍚屾椂涔熼槻姝㈠洜涓哄悎鎯呭悎鐞嗙殑寮傚父鑰屾剰澶栫殑緇堟浜嗘祴璇曡繃紼嬨?/p>
[縐嶇被/Category]
涓烘祴璇曠敤渚嬪垎綾伙紝瀹為檯浣跨敤鏃朵竴鑸湁TestSuite灝變笉鍐嶄嬌鐢–ategory錛屾湁Category灝變笉鍐嶄嬌鐢═estSuite銆?/p>
[蹇界暐/Ignored]
璁懼畾璇ユ祴璇曠敤渚嬫垨嫻嬭瘯鏂規硶琚拷鐣ワ紝涔熷氨鏄笉鎵ц鐨勬剰鎬濄傛湁浜涜鎶涘純鐨凾estCase涓嶆効鍒犻櫎錛屽彲浠ュ畾涓篒gnored銆?/p>
[嫻嬭瘯鎵ц鍣?TestRunner]
鎵ц嫻嬭瘯鐨勫伐鍏鳳紝琛ㄧず浠ヤ綍縐嶆柟寮忔墽琛屾祴璇曪紝鍒浼氾紝榪欏彲涓嶆槸鍦ㄤ唬鐮佷腑瑙勫畾鐨勶紝瀹屽叏鏄笌嫻嬭瘯鍐呭鏃犲叧鐨勮涓恒傛瘮濡傛枃鏈柟寮忥紝AWT鏂瑰紡錛宻wing鏂瑰紡錛屾垨鑰匛clipse鐨勪竴涓鍥劇瓑絳夈?/p>
{瀹炰緥錛欶ibonacci鏁板垪}
涓嬮潰鐨凷ample灞曠ずTDDer鏄浣曠紪鍐欎竴涓棬鍦ㄤ駭鐢烣ibonacci鏁板垪鐨勬柟娉曘?br />錛?錛夐鍏堝啓涓涓猅C錛屾柇璦fib(1) = 1;fib(2) = 1;榪欒〃紺鴻鏁板垪鐨勭涓涓厓绱犲拰絎簩涓厓绱犻兘鏄?銆?/p>
錛?錛変笂闈㈣繖孌典唬鐮佷笉鑳界紪璇戦氳繃錛孏reat錛佲斺旀槸鐨勶紝鎴戞槸璇碐reat錛佸綋鐒訛紝濡傛灉浣犳鍦ㄧ敤鐨勬槸Eclipse閭d綘涓嶉渶瑕佺紪璇戯紝Eclipse 浼氬憡璇変綘涓嶅瓨鍦╢ib鏂規硶錛屽崟鍑籱ark浼氶棶浣犺涓嶈鏂板緩涓涓猣ib鏂規硶錛孫h錛屽綋鐒訛紒涓轟簡璁╀笂闈㈤偅涓猅C鑳介氳繃錛屾垜浠繖鏍峰啓錛?/p>
錛?錛夌幇鍦ㄩ偅涓猅C浜簡緇跨伅錛寃ow錛佸簲璇ュ簡紲濅竴涓嬩簡銆傛帴涓嬫潵瑕佸鍔燭C鐨勯毦搴︿簡錛屾祴絎笁涓厓绱犮?/p>
涓嶈繃榪欐牱鍐欒繕涓嶅お濂界湅錛屼笉濡傝繖鏍峰啓錛?/p>
錛?錛夋柊澧炲姞鐨勬柇璦瀵艱嚧浜嗙孩鐏紝涓轟簡鎵漿榪欎竴灞鍔挎垜浠繖鏍蜂慨鏀筬ib鏂規硶錛屽叾涓儴鍒嗕唬鐮佹槸浠庝笂闈㈢殑浠g爜涓瑿trl-C/Ctrl-V鏉ョ殑錛?/p>
錛?錛夊ぉ鍝紝榪欑湡鏄釜璐變漢鍐欑殑浠g爜錛佹槸鍟婏紝涓嶆槸鍚楋紵鍥犱負TC灝辨槸浜у搧鐨勮摑鏈紝浜у搧鍙鎭板ソ婊¤凍TC灝眔k銆傛墍浠ヤ簨鎯呭彂灞曞埌榪欎釜鍦版涓嶆槸fib鏂規硶鐨勯敊錛岃屾槸TC鐨勯敊錛屼簬鏄疶C榪樿榪涗竴姝ヨ姹傦細
錛?錛変笂鏈夋斂絳栦笅鏈夊絳栥?/p>
錛?錛夊ソ浜嗭紝涓嶇帺浜嗐傜幇鍦ㄥ凡緇忎笉鏄幢涓嶈幢鐨勯棶棰樹簡錛岀幇鍦ㄧ殑闂鏄唬鐮佸嚭鐜頒簡鍐椾綑錛屾墍浠ユ垜浠鍋氱殑鏄斺旈噸鏋勶細
錛?錛夊ソ錛岀幇鍦ㄤ綘宸茬粡fib鏂規硶宸茬粡鍐欏畬浜嗗悧錛熼敊浜嗭紝涓涓嵄闄╃殑閿欒錛屼綘蹇樹簡閿欒鐨勮緭鍏ヤ簡銆傛垜浠護0琛ㄧずFibonacci涓病鏈夎繖涓欏廣?/p>
then change the method fib to make the bar grean錛?/p>
錛?錛変笅鐝墠鏈鍚庝竴浠朵簨鎯咃紝鎶奣C涔熼噸鏋勪竴涓嬶細
錛?0錛夋墦瀹屾敹宸ャ?/p>
{鍏充簬鏈枃鐨勫啓浣渳
鍦ㄦ湰鏂囩殑鍐欎綔榪囩▼涓紝浣滆呬篃鐢ㄥ埌浜員DD鐨勬濈淮錛屼簨瀹炰笂浣滆呭厛鏋勬濊鍐欎竴綃囦粈涔堟牱鐨勬枃绔狅紝鐒跺悗鍐欏嚭榪欑瘒鏂囩珷搴旇婊¤凍鐨勫嚑涓姹傦紝鍖呮嫭鍔熻兘鐨勮姹傦紙瑕佸啓浜涗粈涔堬級鍜屾ц兘鐨勮姹傦紙鍙鎬у浣曪級鍜岃川閲忕殑瑕佹眰錛堟枃瀛楃殑瑕佹眰錛夛紝榪欎簺瑕佹眰璧峰垵鏄竴涓篃杈句笉鍒扮殑錛堝洜涓烘鏂囪繕涓涓瓧娌℃湁錛夛紝鍦ㄨ繖縐嶆儏鍐典笅浣滆呯殑鏂囩珷鏃犳硶緙栬瘧閫氳繃錛屼負浜嗚揪鍒拌繖浜涜姹傦紝浣滆呬笉鍋滅殑鍐欏晩鍐欏晩錛岀粓浜庡湪鑺卞敖浜嗕袱涓湀鐨勫績琛涔嬪悗瀹屾垚浜嗗綋鍒濇棦瀹氱殑鎵鏈夎姹傦紙make the bar green錛夛紝闅忓悗浣滆呮暣鐞嗕簡涓涓嬫枃绔犵殑緇撴瀯錛堥噸鏋勶級錛屽湪婊℃剰鐨勬彁浜ょ粰浜咮log緋葷粺涔嬪悗錛屼綔鑰呯┛涓婁簡涓浠剁豢鑹茬殑姹楄~錛岃洞鍦ㄥ湴涓婏紝瀛︿簡涓ゅ0闈掕洐鍙傘傘傘傘傘傘俕_^
{鍚庤錛歁artin Fowler鍦ㄤ腑鍥絵
浠庢湰鏂囨寮忓畬鎴愬埌鍙戣〃鐨勫嚑涓皬鏃墮噷錛屾垜鍋剁劧璇誨埌浜哅artin Fowler鍏堢敓鍖椾含璁胯皥褰曪紝鍏墮棿鎻愬埌浜嗗緢澶氬嫻嬭瘯椹卞姩寮鍙戠殑鐪嬫硶錛屾憳鎶勫湪姝わ細
Martin Fowler錛氬綋鐒訛紙鍊煎緱鑺變竴鍗婄殑鏃墮棿鏉ュ啓鍗曞厓嫻嬭瘯錛夛紒鍥犱負鍗曞厓嫻嬭瘯鑳藉浣夸綘鏇村揩鐨勫畬鎴愬伐浣溿傛棤鏁版鐨勫疄璺靛凡緇忚瘉鏄庤繖涓鐐廣備綘鐨勬椂闂磋秺鏄揣寮狅紝灝辮秺瑕佸啓鍗曞厓嫻嬭瘯錛屽畠鐪嬩笂鍘繪參錛屼絾瀹為檯涓婅兘澶熷府鍔╀綘鏇村揩銆佹洿鑸掓湇鍦拌揪鍒扮洰鐨勩?br />Martin Fowler錛氫粈涔堝彨閲嶈錛熶粈涔堝彨涓嶉噸瑕侊紵榪欐槸闇瑕侀愭笎璁よ瘑鐨勶紝涓嶆槸鎯沖綋鐒剁殑銆傛垜涓虹粷澶у鏁扮殑妯″潡鍐欏崟鍏冩祴璇曪紝鏄湁鐐圭儲浜猴紝浣嗘槸褰撲綘鎰忚瘑鍒拌繖宸ヤ綔鐨勪環鍊兼椂錛屼綘浼氭鐒剁殑銆?br />Martin Fowler錛氬鍏ㄤ笘鐣岀殑紼嬪簭鍛樻垜閮芥槸閭d箞鍑犳潯寤鴻錛氣︹︾浜岋紝瀛︿範嫻嬭瘯椹卞姩寮鍙戯紝榪欑鏂扮殑鏂規硶浼氭敼鍙樹綘瀵逛簬杞歡寮鍙戠殑鐪嬫硶銆傗︹?/font>
鈥斺斻婄▼搴忓憳銆嬶紝2005騫?鏈堝垔
{楦h阿}
fhawk
Dennis Chen
鑸嫢鑿╂彁
Kent Beck
Martin Fowler
c2.com
闃呰絎旇錛氱Н鏋佷富鍔紝鍏呮弧鐑儏錛屾槸榪欏皝淇$殑鏍稿績銆傛渶榪戣嚜宸變篃緇忓巻浜嗕竴浜涗簨鎯咃紝鍦ㄩ潰涓存湭鏉ュ彂灞曞墠鏅殑鍒嗗矓閬撹礬錛岄渶瑕佸仛鍑洪夋嫨鏃訛紝鏄庣煡閬撴煇涓鏉″叿鏈夋洿澶х殑鍙戝睍鍓嶆櫙錛屼絾鏄嵈鐢變簬鏈煡鐨勫緟閬囬棶棰樻斁寮冧簡閫夋嫨瀹冿紝騫墮潪涓嶇Н鏋佷富鍔紝涓嶅厖婊$儹鎯咃紝浣嗘槸鏌愪簺鏃跺欐湁寰堝鐨勫鍦ㄥ洜绱犲彲浠ュ獎鍝嶅喅瀹氥?/strong>
鏉庡紑澶嶃婄粰涓浗瀛︾敓鐨勭浜斿皝淇°嬶紝緇х畫浼犳巿鍏充簬縐瀬琛屽姩銆佹妸鎻¤嚜宸卞懡榪愮殑浜虹敓緇忛獙錛岃繖鏄滀竴灝佹湁鍏崇Н鏋佷富鍔ㄧ殑淇♀濄?
聽聽聽 鈥滀粖澶╁ぇ澶氭暟浼樼鐨勪紒涓氬浜烘墠鐨勬湡鏈涙槸錛氱Н鏋佷富鍔ㄣ佸厖婊$儹鎯呫佺伒媧昏嚜淇$殑浜衡濓紝瀛︿細鈥滆嚜宸辯殑浜嬶紝鑷繁璐熻矗錛岃嚜宸辮В鍐斥濓紝鈥滄垜涓嶈兘錛屽埆鐨勪換浣曚漢涔熶笉鑳戒唬鏇夸綘璧拌繃閭f潯璺紱浣犲繀欏昏嚜宸卞幓璧般傗?/p>
涓涓漢琚嚮璐ワ紝涓嶆槸鍥犱負澶栫晫鐜鐨勯樆紕嶏紝鑰屾槸鍙栧喅浜庝粬瀵圭幆澧冨浣曞弽搴斻傗滄湁鍕囨皵鏀瑰彉鍙互鏀瑰彉鐨勪簨鎯咃紝鏈夎兏鎬鎺ュ彈涓嶅彲鏀瑰彉鐨勪簨鎯咃紝鏈夋櫤鎱ф潵鍒嗚鯨涓よ呯殑涓嶅悓銆傗?/p>
聽聽聽 鈥滃鏋滀綘鎯崇煡閬撲粈涔堬紝灝辮嚜宸卞埌緗戜笂鍘繪壘錛屼笉瑕佹ョ潃鍘婚棶鍒漢錛涘鏋滀綘鍚埌浜嗕粈涔堬紝涓嶈鐩茬洰淇′粠錛屽簲褰撹嚜宸變富鍔ㄥ幓緗戜笂姹傝瘉銆傗?/p>
聽聽聽 琚姩灝辨槸寮冩潈錛屼笉鍋氬喅瀹氫篃鏄竴縐嶅喅瀹氥備笅瀹氬喅蹇冿紝姣忎竴浠跺皬浜嬮兘瑕佽〃杈懼嚭鑷繁鐨勬剰瑙侊紝灝辯畻浣犱笉鏄緢鍦ㄤ箮銆備緥濡傦紝鑷繁鍐沖畾鍦ㄩ棣嗙偣浠涔堣彍錛岃嚜宸卞喅瀹氳嚜宸辯殑琛g潃鎵撴壆錛屽懆鏈椂鑷繁鍐沖畾瑕佸幓鍝噷鐜╋紝絳夌瓑銆傝娉曡鑷繁娼滄剰璇嗛噷鐨勨滄垜鎰熻錛屾垜鎯寵鈥濅綋鐜板嚭鏉ワ紝涓嶈琚姩錛屼笉瑕佷粠浼楋紝閬垮厤鐩茬洰鍚粠鐖舵瘝銆佽佸笀銆佸悕浜衡︹?/p>
聽聽聽 縐瀬涓誨姩鐨勪漢鎬繪槸鍦ㄨ█璇腑璧嬩簣鑷繁鍐沖畾鐨勬潈鍒╋紝浠栦滑鍠滄璇寸殑璇濆寘鎷細鈥滆瘯璇曠湅鏈夋病鏈夊叾浠栫殑鍙兘鎬с傗濃滀篃璁告垜鍙互鎹釜鎬濊礬銆傗濃滄垜鍙互鎺у埗鑷繁鐨勬儏緇傗濃滄垜鍙互鎯沖嚭鏇存湁鏁堢殑琛ㄨ揪鏂瑰紡銆傗濃滄垜鐨勬劅瑙夋槸鈥︹︹濃滄垜閫夋嫨鈥︹︹濃滄垜瑕佲︹︹濃滄垜鎯呮効鈥︹︹濃滄垜鎵撶畻鈥︹︹濃滄垜鍐沖畾鈥︹︹濈瓑絳夈傜Н鏋佷富鍔ㄥ湴鎶撲綇鍛借繍涓綘鍙互閫夋嫨銆佸彲浠ユ敼鍙樸佸彲浠ユ渶澶у寲浣犵殑褰卞搷鍔涚殑閮ㄥ垎銆?/p>
聽聽聽 緹庡浗浜哄緢鍠滄灝濊瘯涓嶅悓鐨勫伐浣滐紝浠栦滑涓鐢熶腑騫沖潎瑕佹崲鍥涙宸ヤ綔銆傜粡甯哥粰鑷繁璁劇珛涓浜涙瀬鍏鋒寫鎴樻с佷絾緇濋潪閬ヤ笉鍙強鐨勭洰鏍囥?/p>
聽聽聽 鈥滅瓑寰呯殑鏂規硶鏈変袱縐嶏紝涓縐嶆槸浠涔堜簨涔熶笉鍋氬湴絀虹瓑錛屽彟涓縐嶆槸涓杈圭瓑錛屼竴杈規妸浜嬫儏鍚戝墠鎺ㄥ姩銆傗濆湪鏈洪亣榪樻病鏈夋潵涓存椂錛屽氨搴斾簨浜嬬敤蹇冿紝浜嬩簨灝藉姏銆備竴鏃︽満閬囧埌鏉ワ紝涓瀹氳鍏ㄥ姏浠ヨ蕩錛屾妸鎻℃満閬囥?/p>
聽聽聽 鍦ㄥ叕鍙擱噷錛岀粡甯稿緱鍒版檵鍗囨満浼氱殑浜猴紝澶у鏄兘澶熺Н鏋佹帹閿鍜岃〃杈捐嚜宸辯殑銆佹湁榪涘彇蹇冪殑浜恒傚綋浠栦滑榪樻槸鍏徃鐨勪竴鍚嶆櫘閫氬憳宸ユ椂錛屽彧瑕佸拰鍏徃鍒╃泭鎴栬呭洟闃熷埄鐩婄浉鍏崇殑浜嬫儏錛屼粬浠氨浼氫笉閬椾綑鍔涘湴鍙戣〃鑷繁鐨勮瑙c佽礎鐚嚜宸辯殑涓誨紶錛屽府鍔╁叕鍙稿埗瀹氬拰瀹夋帓宸ヤ綔璁″垝錛涘湪瀹屾垚鏈亴宸ヤ綔鍚庯紝浠栦滑鎬昏兘鍗忓姪鍏朵粬浜哄敖蹇畬鎴愬伐浣滐紱浠栦滑甯稿父榧撳姳鑷繁鍜屽悓浼達紝鎻愰珮鏁翠釜闃熶紞鐨勫+姘旓紱榪欎簺浜烘繪槸浠ヤ簨涓烘湰銆佷互浜嬩負鍏堚斺斾粬浠兘鏄渶縐瀬涓誨姩鐨勪漢銆?/p>
聽聽聽 鍦ㄤ漢鐢熺殑鏃呴斾腑錛屼綘鏄綘鑷繁鎯熶竴鐨勫徃鏈猴紝鍗冧竾涓嶈璁╁埆浜洪┚椹朵綘鐨勭敓鍛戒箣杞︺備綘瑕佺ǔ紼沖湴鍧愬湪鍙告満鐨勪綅緗笂錛屽喅瀹氳嚜宸變綍鏃惰鍋溿佽鍊掕濺銆佽杞集銆佽鍔犻熴佽鍒硅濺絳夌瓑銆傚彧鏈夌Н鏋佷富鍔ㄧ殑浜烘墠鑳藉湪鐬伅涓囧彉鐨勭珵浜夌幆澧冧腑璧㈠緱鎴愬姛錛屽彧鏈夊杽浜庡睍紺鴻嚜宸辯殑浜烘墠鑳藉湪宸ヤ綔涓幏寰楃湡姝g殑鏈轟細銆?/p>
聽聽聽 鈥滀綘浠殑鏃墮棿鏈夐檺錛屾墍浠ヤ笉瑕佹氮璐規椂闂村湪鍒漢鐨勭敓媧婚噷銆備笉瑕佽淇℃潯鎵鎯?鈥?鐩蹭粠淇℃潯鏄椿鍦ㄥ埆浜虹殑鐢熸椿閲屻備笉瑕佽浠諱綍浜虹殑鎰忚娣規病浜嗕綘鍐呭湪鐨勫績澹般傞噸瑕佺殑錛屾嫢鏈夎窡闅忓唴蹇冨拰鐩磋鐨勫媷姘斻備綘鐨勫唴蹇冧笌鐩磋鐭ラ亾浣犵湡姝f兂鎴愪負浠涔堟牱鐨勪漢銆備換浣曞叾浠栦簨鐗╅兘鏄瑕佺殑銆傗濃斺旀柉钂傚か 涔斿竷鏂?錛堣嫻鏋滃叕鍙告昏錛変簬2005騫存柉鍧︾澶у姣曚笟鍏哥ぜ銆?/p>
聽
1銆佹暣鐞嗗嚭涓涓ぇ姒?0G錛堟渶灝?G錛夊乏鍙崇殑鍒嗗尯錛岀敤PQ8鍒嗕袱涓尯錛屼竴涓猄wap1.2G錛屼竴涓猠xt2/ext3鐨勬牸寮忥紝鐢ㄤ簬瀹夎Linux緋葷粺
2銆佷笅杞絀SO鏂囦歡鍒頒竴涓狥AT32鏍煎紡鐨勫垎鍖轟笂錛岀害涓?.57GB澶у皬錛屽D:\FC4\
3銆佷笅杞斤細Grub For Dos 錛屾斁鍒癈鐩橈紙鎴戠殑WinXP瀹夎鍦–鐩橈級鏍圭洰褰曚笅
4銆佺紪杈慍:\boot.ini 鏂囦歡錛屽姞鍏ヤ竴琛?br />C:\grldr="GRUB For Dos/Windows "
5銆佺紪杈慍:\boot\grub\menu.lst 鍔犲叆錛?
title Install-Fedora Core 4
kernel (hd0,0)/isolinux/vmlinuz
initrd (hd0,0)/isolinux/initrd.img
5銆侀噸鏂板惎鍔ㄧ數鑴戯紝渚濇閫夋嫨錛?GRUB For Dos/Windows > Install-Fedora Core 4錛涜繘鍏ュ畨瑁呯▼搴忥紝鍦ㄥ畨瑁呰繃紼嬩腑褰撹繘琛屽埌閫夋嫨瀹夎浠嬭川鏃訛紝閫夌‖鐩樺畨瑁咃紝鎵懼埌鑷繁ISO鏀劇疆鐨勪綅緗紝濡俤ev/sdm2/Fc4
6銆佽繘鍏ユ寮忓畨瑁咃紝鍦ㄩ夋嫨鍒嗗尯鐨勬椂鍊欙紝鎶奺xt2/ext3鐨勫垎鍖鴻繘琛屾寕杞藉嵆鍙紝鍏朵粬鎸夌収鎻愮ず鎿嶄綔錛堟寕杞界畝鍗曠殑鎿嶄綔灝辨槸閫変腑ext2/ext3鐨勫垎鍖猴紝鐒跺悗閫夋嫨涓嬫媺鑿滃崟涓殑"/"鍗沖彲錛?/p>
7銆佸畨瑁咃紝鏍規嵁妯″潡鐨勫姞杞界殑澶氬皯錛屾満鍣ㄧ殑榪愯閫熷害錛屾椂闂寸敱20鍒嗛挓鍒?涓皬鏃朵笉絳?/p>
8銆佸畨瑁呭ソ涔嬪悗璁劇疆鐢ㄦ埛鍚嶅拰瀵嗙爜錛屾敞鎰廎C4鐨勭敤鎴峰悕鏄尯鍒嗗ぇ灝忓啓鐨?/p>
9銆佸畨瑁呭ソ涔嬪悗鐢?鐢ㄦ埛鍚峳oot+瀵嗙爜 鐧婚檰
10銆佹墦寮搴旂敤紼嬪簭涓嬬殑Terminal錛岃繍琛屽涓嬪懡浠わ紝瀵圭郴緇熻繘琛屽崌綰?br />#rpm -import /usr/share/rhn/RPM-GPG-KEY-fedora
#yum update
澶х害10鍒嗛挓宸﹀彸錛屼細鍒楀嚭800澶氬厗闇瑕佹洿鏂扮殑紼嬪簭鍖咃紝榪涜鏇存柊鍗沖彲
11銆佺編鍖栦竴涓嬩腑鏂囧瓧浣?br />涓嬭澆瀛椾綋錛?a >http://www.bitman.cn/Linux/bkai00mp.ttf
榪涘叆鏂囦歡澶癸細 #cd /usr/share/fonts/chinese/TrueTypa
鍒犻櫎涓嬮潰鎵鏈夌殑瀛椾綋錛岀劧鍚庢妸bkai00mp.ttf鏀劇疆鍒板涓婄洰褰曞嵆鍙?/p>
浜庡璁$畻鏈烘垨鑰呬粠浜嬭繖鏂歸潰宸ヤ綔鐨勬湅鍙?
1銆侀鍏堬紝涓嶈浣犳槸涓嶆槸璁$畻鏈轟笓涓氱殑鏈嬪弸錛岀浉淇′竴鍙ヨ瘽銆傗滄兂鎴愬姛涓嶅姫鍔涙槸涓嶈鐨勨濓紝鍙浣犲姫鍔涳紝鏃犺浣犳槸涓嶆槸瀛﹁綆楁満鐨勯兘浼氳幏寰楁垚鍔熺殑銆傚鏋滀綘涓嶅姫鍔涳紝鏃犺浣犳槸涓嶆槸瀛﹁綆楁満鐨勶紝閮藉緢闅炬販鐨勩?br />2銆佹棤璁哄浠涔堜笓涓氥備竴瀹氳鍏堝仛浜猴紝鍐嶅仛浜嬶紝濡傛灉浣犲仛浜烘湁闂錛屾棤璁轟綘鍋氫粈涔堥兘鏄け璐ョ殑銆傝鎻愰珮鑷繁鐨勭礌璐紝闇瑕佸鉤鏃舵湁鎰忚瘑鐨勭Н绱傚浜ゆ瘮杈冧笂榪涚殑鏈嬪弸銆傚埆婊ヤ氦鏈嬪弸,姣斿澶氱粨浜ゅ皬w涔嬬被鐨勬湅鍙?)
3銆佸鏋滀綘浠ュ悗鐨勫伐浣滄剰鎯蟲槸杞歡鍏徃錛岄偅涔堜綘蹇呴』瑕佹噦寰楄嚦灝戜竴闂ㄥ紑鍙戣璦銆傚嵆浣夸綘鐨勫織鍚戞瘮杈冮珮浣犱篃蹇呴』浠庡紑鍙戝紑濮嬶紝鍚﹀垯鍚屼簨鏄灖涓嶈搗浣犵殑銆傝屼笖杈冧負鐔熺粌鐨勪嬌鐢紝濡傛灉鏈夌浉鍏崇殑欏圭洰緇忛獙鏈涓哄悎閫傘傜▼搴忓紑鍙戞槸寰堣緵鑻︾殑宸ヤ綔,鍦ㄤ綘榪樻病鍑嗗濂借繖涓柟鍚戜箣鍓?涓瀹氳鎯沖ソ榪欎釜鏄笉鏄綘鎯寵鐨?瀵逛簬it榪欒褰?浣犲繀欏誨噯澶囧ソ闅忔椂瀛︿範鏂扮殑涓滆タ,鎵撶畻瀛︿竴涓や釜宸ュ叿灝卞彲浠ユ販涓鐢熺殑鎯蟲硶鍗冧竾鍒兂.濡傛灉浣犳槸鏈鐢?鍖呮嫭浠ヤ笅),榪欐槸浣犲繀欏昏鍑嗗鐨?
鍋舵浘緇忕敤榪囩殑宸ュ叿(鏃墮棿欏哄簭):asp錛堟瘮杈冪啛緇冿級錛宲b錛堢敤榪?涓湀,鐜板湪鍏ㄥ繕璁幫級,delphi錛堢敤榪囦竴孌墊椂闂?鐜板湪蹇樼殑宸笉澶氾級,exchange錛堢敤榪?涓湀,鐜板湪鍏ㄥ繕璁幫級,Lotus notes(鐢ㄨ繃2涓湀錛屽紑鍙戣繃涓涓鍧涳紝涔熷繕璁扮殑宸笉澶?錛宩ava錛堜富瑕佹槸鍐檍sp鐢ㄣ傚緢灝戠敤鏉ュ啓java錛夛紝primeton錛堟瀯浠跺紑鍙戝伐鍏鳳紝涓鐩村湪鐢紝姣旇緝鐔熺粌錛夛紝plsql錛坥racle瀹㈡埛绔伐鍏鳳紝緇忓父鐢紝姣旇緝鐔熺粌錛?br />閫愭鍛婂埆紼嬪簭寮鍙戠敓媧匯?br />4銆佸鏋滀綘鏄爺絀剁敓錛堝寘鎷瘮杈冩湁緇忛獙鐨勪粠涓氫漢鍛橈級錛屼綘鐨勭洰鏍囦笉搴旇鏄▼搴忓紑鍙戜漢鍛橈紝鑷沖皯鏄璁′漢鍛樸傝繖涓椂鍊欎綘鏈変袱涓柟鍚戯紝涓涓槸欏圭洰綆$悊錛屽欏圭洰緇忕悊,鍙﹀涓涓槸鎶鏈柟鍚戯紝濡傛灦鏋勫笀.灝忕殑鍏徃鍙兘涓浜哄吋澶氫釜鑱屼綅.鏃犺鍝釜鏂瑰悜閮介渶瑕佸ぇ閲忕殑瀹炶返緇忛獙.濡傛灉鍦ㄦ瘯涓氫箣鍓嶅氨鏈夐」鐩粡楠屾槸闈炲父鏈夌悊鐨?鑰屽杽浜庢葷粨鐨勪漢閭e氨鑳芥彁鍗囪嚜宸辯殑灞傛.紼嬪簭寮鍙戜漢鍛樹笉搴旇鍋氫負鑱屼笟鐨勫彂灞曠洰鏍?鑰屾槸璧風偣.
5銆佸湪瀛︽牎閲屽崈涓囦笉瑕佹氮璐規椂闂?瑕佸悎鐞嗗畨鎺掑鏍$敓媧伙紝璁╁鏍$敓媧諱赴瀵岃屾敹鑾鳳紝鈥滆緭浜嗚繖鍥涘勾浣犲氨杈撲簡涓鐢熲濄傝鎻愰珮鑷繁鐨勫涔犺兘鍔?瑕佷粠鎬濇兂涓婄悊瑙?宸ュ叿鏄瑕佺殑.鏃犺浠涔堣璦,鍒板伐浣滅殑 鏃跺欓兘涓嶅鐢ㄧ殑.鎵浠?鎴戣寰楀湪瀛︽牎瀛︿範鐨勬椂鍊欒姹傞潰騫?鑰屼笉鏄簿閫?褰撶劧,濡傛灉浣犲鏌愪竴縐嶈璦鏈夊叴瓚g殑璇?綺鵑氫篃鏃犲Θ,鎴戣鐨勪笉瑕佺簿閫?涓嶆槸璇撮殢渚垮涓?鎴戠殑鎰忔濇槸榪欎釜宸ュ叿搴斾粯宸ョ▼娌℃湁闂閭e氨鍙互浜?灝辨槸璇村彲浠ョ嫭绔嬪紑鍙戜竴涓ā鍧?鑰屼笉瑕佸宸ョ▼涓瀬灝戠敤鍒扮殑涓浜涚煡璇嗚姳澶у姏姘旂爺絀?鎴戣榪欒瘽鏄?鍩轟簬瀛︽牎鐨勬椂闂存槸涓嶅鐨?鍏朵粬榪樿寰堝闇瑕佸涔犵殑鐭ヨ瘑.
鎴戣寰楀ぇ瀛﹂噷蹇呴』瑕佸浼氱殑涓滀笢:
瀛︿細鍋氫漢(娌熼氳兘鍔?鎴愮啛,緇勭粐鑳藉姏,鐞嗚В鑳藉姏):鍙互澶氬弬鍔犲悇縐嶇ぞ鍥㈡椿鍔?濡傛灉娌℃湁紺懼洟媧誨姩,鑰佷埂媧誨姩涔熷彲浠?鏈濂借嚜宸辯粍緇?
鑻辮(鑷沖皯4綰?:涓嬬偣鍔熷か.浼氭湁鍥炴姤鐨?榪欎箞璇村惂,瀵逛簬鍥涘叚綰ц瘉涔?澶?涓瘉涔?鐩稿綋浜庝竴涓湀澶?000rmb,榪欎箞璇存槸涓嶆槸鏈夊惛寮曞姏涓鐐?
涓撲笟璇劇▼:杞歡宸ョ▼,鏁版嵁緇撴瀯,鏁版嵁搴撶煡璇?緗戠粶鐭ヨ瘑
鎴戣寰楄繖鍥涢棬鏈涓洪噸瑕?騫朵笉鏄鍏朵粬鐨勪笉閲嶈鍟?鍏朵粬鐨勮涓婅涓嶇己璇?鑰冭瘯涓瓑浠ヤ笂灝卞彲浠ヤ簡.榪欏洓闂ㄤ竴瀹氳瀛﹀ソ.
6銆佹垜瑙夊緱鐜板湪甯傚満鐨勪富嫻佹槸j2ee鍜?net涓ゅぇ鏂瑰悜,鏃犺鍝釜鏂瑰悜,閮藉緢鏈夊競鍦?瑕佺簿閫氱殑璇濋兘涓嶆槸浠跺鏄撶殑浜嬫儏:)
浣犲彲浠ラ夋嫨涓涓柟鍚?鍗冧竾涓嶈闂埆浜洪夋嫨浠涔堝ソ鍟?榪欎釜闂灝辮薄闂鐞冨ソ榪樻槸緹芥瘺鐞冨ソ涓鏍烽毦鍥炵瓟,濡傛灉浣犱範鎯簡寰蔣鐨勪駭鍝侀偅涔堝氨閫夋嫨.net,濡傛灉浣犲枩嬈㈣嚜鐢?涓嶅枩嬈㈠瀯鏂?閭d箞浣犻夋嫨j2ee.澶氬埄鐢ㄧ綉緇滆祫婧?瑕佺帺杞綉緇滆祫婧?涓嶈琚綉緇滆祫婧愮粰鐜╀簡:)
聽
璧瘋繖涓悕瀛楀仛鏍囬錛屾槸涓轟簡璁╄繕鍦ㄨ涔︾殑鏈嬪弸瑕佺弽鎯滅溂鍓嶇殑鏃墮棿銆傚叾瀹炰漢鐢熺殑閬撹礬寰堥暱錛屼互鍓嶆瑺鐨勫轟互鍚庝篃鍙互榪樼殑銆傛垜鐨勬剰鎬濇槸榪熻繕涓嶅鏃╄繕錛屾棭榪樹笉濡備笉嬈犮備笉嬈犱笉濡傝禋閽?/p>
Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=675563
緇撴灉錛?br />浠諱綍浠嶣ase媧劇敓綾葷殑錛岄兘鍙互鍒╃敤cout<<obj鐨勬満鍒墮氳繃嫻佽繘琛岃緭鍑恒?br />
鍚屾牱閬撶悊錛屼篃鍙互鍒╃敤姝ゆ柟娉曞疄鐜癆CE_InputCDR聽聽/ ACE_OutputCDR瀵圭綉緇滄搷浣滃簭鍒楀寲鎿嶄綔銆?br />(鏈枃涔熸槸鍥炵瓟鏌愮綉鍙嬪叧浜庢淳鐢熺被涓嶈兘閲嶈澆鐨勯棶棰樼殑鍥炲)