锘??xml version="1.0" encoding="utf-8" standalone="yes"?>日韩视频不卡中文,欧美一区二区三区男人的天堂 ,夜夜嗨网站十八久久http://www.shnenglu.com/ace/category/1419.html<table style="border:1px solid #aa0033; font-size:small" align=center> <tr> <td rowspan=3> </td> <td colspan=2 align=center><b>璁㈤槄 ace-china</b></td> </tr> <form action="http://groups.google.com/group/ace-china/boxsubscribe"> <input type=hidden name="hl" value="zh-CN"> <tr> <td>鐢靛瓙閭歡錛?<input type=text name=email></td> <td> <table style="background-color:#ffcc33;padding:2px;border:2px outset #ffcc33;"> <tr> <td> <input type=submit name="sub" value="璁㈤槄"> </td> </tr> </table> </td> </tr> </form> <tr><td colspan=2 align=center> 嫻忚瀛樹簬 <a >groups.google.com</a> 涓婄殑<a >鎵鏈夊笘瀛?lt;/a> </td></tr> </table>zh-cnThu, 22 May 2008 05:18:47 GMTThu, 22 May 2008 05:18:47 GMT60嬈㈣繋璁塊棶www.ace-tao.org/bbshttp://www.shnenglu.com/ace/archive/2007/12/05/37843.htmlStone JiangStone JiangWed, 05 Dec 2007 04:59:00 GMThttp://www.shnenglu.com/ace/archive/2007/12/05/37843.htmlhttp://www.shnenglu.com/ace/comments/37843.htmlhttp://www.shnenglu.com/ace/archive/2007/12/05/37843.html#Feedback0http://www.shnenglu.com/ace/comments/commentRss/37843.htmlhttp://www.shnenglu.com/ace/services/trackbacks/37843.htmlwww.ace-tao.org/bbs




Stone Jiang 2007-12-05 12:59 鍙戣〃璇勮
]]>
浣跨敤vs2005(vc8)緙栬瘧log4cpp-0.3.5rc3http://www.shnenglu.com/ace/archive/2007/01/27/18050.htmlStone JiangStone JiangSat, 27 Jan 2007 08:38:00 GMThttp://www.shnenglu.com/ace/archive/2007/01/27/18050.htmlhttp://www.shnenglu.com/ace/comments/18050.htmlhttp://www.shnenglu.com/ace/archive/2007/01/27/18050.html#Feedback0http://www.shnenglu.com/ace/comments/commentRss/18050.htmlhttp://www.shnenglu.com/ace/services/trackbacks/18050.html

浣跨敤vs2005(vc8)緙栬瘧log4cpp-0.3.5rc3

闂錛氱敱浜巐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)
"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

Outputs濉啓錛?(OutDir)\NTEventLogAppender.dll

閫傜敤鑼冨洿錛歭og4cpp欏圭洰銆乴og4cppDLL欏圭洰鐨凞ebug鍜孯elease閰嶇疆銆傚悓鏃訛紝璇ユ柟娉曢傜敤浜巚s2003(vc7.1)銆?/p>



Stone Jiang 2007-01-27 16:38 鍙戣〃璇勮
]]>
闈㈠悜瀵硅薄vs鍩轟簬瀵硅薄http://www.shnenglu.com/ace/archive/2006/06/25/8985.htmlStone JiangStone JiangSun, 25 Jun 2006 08:18:00 GMThttp://www.shnenglu.com/ace/archive/2006/06/25/8985.htmlhttp://www.shnenglu.com/ace/comments/8985.htmlhttp://www.shnenglu.com/ace/archive/2006/06/25/8985.html#Feedback0http://www.shnenglu.com/ace/comments/commentRss/8985.htmlhttp://www.shnenglu.com/ace/services/trackbacks/8985.html闈㈠悜瀵硅薄vs鍩轟簬瀵硅薄
鐪嬪埌浜嗕竴縐嶈娉曪紝寰堝鎵璋撻潰鍚戝璞″紑鍙戝彧涓嶈繃鏄熀浜庡璞$殑寮鍙?wbr>銆傚弽鎬濊嚜韜紝鍙戣涓閽堣琛銆?/wbr>
鎴戜滑鎵璋撶殑闈㈠悜瀵硅薄錛屽疄闄呬笂鍙笉榪囧皝瑁呬簡涓氬姟瀵硅薄錛屽垎鍑轟簡灞傛錛屾彁渚涗簡鎺ュ彛銆傝櫧鐒跺湪璁捐鍜屽疄鐜扮殑鏃跺欎嬌鐢ㄥ埌浜嗛潰鍚戝璞$殑灝佽錛屼絾鐜板湪鐪嬫潵榪樼畻涓嶄笂鐪熸鐨勯潰鍚戝璞★紝鍙兘綆楁槸鍩轟簬瀵硅薄鑰屽凡銆?/wbr>
闈㈠悜瀵硅薄鐨勫師鍒欏茍娌℃湁絎﹀悎銆傞潰鍚戝璞$殑浼樺娍涔熸病鏈夊彂鎸ワ紝鍙嶈屾劅瑙変竴涓皬鍙樺寲灝辯壍鎵埌澶氬眰鐨勫彉鍔紝楹葷儲銆傚氨濂芥瘮鍘誨勾鐨勯」鐩紝鏁版嵁搴撻噰鐢∣RACLE錛屽疄闄呮湰韜ORACLE騫朵笉鐔熸倝錛屽彧緇忚繃涓嶅埌涓鍛ㄧ殑瀛︿範錛屽氨涓婇┈浜嗐傜粨鏋滃彧涓嶈繃灝哋RACLE褰撴垚MSSQL浣跨敤銆侽RACLE鐨勫己澶т笉浣嗘病鏈変綋鐜幫紙鍒扮幇鍦ㄤ篃娌℃湁鎼炴槑鐧斤級錛屽弽鑰屽け鍘諱簡MSSQL鐨勫ソ鐨勭粡楠屻傚緱涓嶅伩澶便?
涓嶈繃錛屽浣曟墠綆楃湡姝g殑闈㈠悜瀵硅薄鍛紵鎯充簡鎯充竴涓ソ鐨勯潰鍚戝璞$殑瀹炶返錛屽簲璇ユ槸杈懼埌鏈澶ч檺搴︾殑杞歡澶嶇敤錛屽茍涓斿彲浠ュ揩閫熼傚簲涓嶆柇鍙樺寲鐨勯渶姹傦紝鑰屽宸叉湁鐨勯儴鍒嗗獎鍝嶆渶灝?wbr>銆?/wbr>
榪欎笉鏄竴韞磋屽氨鐨勪簨鎯咃紝濡傛灉鎯崇湡姝g殑鐢ㄩ」鐩潵瀹炶返鐨勮瘽錛屾紜殑姝ラ涔熻搴旇鏄細
棣栧厛閲囩敤鏈韓杈冪啛鎮夌殑寮鍙戞柟娉曪紙鍩轟簬瀵硅薄鎴栨槸闈㈠悜榪囩▼錛夋弧瓚充笟鍔¢渶姹?wbr>銆傝繖涓姝ュ緢鍏抽敭錛屽彧鏈夋湁浜嗚繖鏍蜂竴涓師鍨嬫墠鍙互楠岃瘉瀵歸渶姹傜殑婊¤凍紼嬪害銆備釜浜烘劅瑙夌洿鎺ラ潰鍚戝璞′細闄峰叆璁捐榪囧害錛屽茍涓斿湪鍓嶆湡鑰楄垂澶ч噺鐨?wbr>綺懼姏銆傛洿閲嶈鐨勬槸浣跨敤涓嶇啛鎮夌殑鎶鏈細甯︽潵椋庨櫓錛屽緱涓嶅伩澶便?/wbr>
鐒跺悗閫愭笎鐨勫皢閲囩敤鐪熸鐨勯潰鍚戝璞$殑鏂規硶灝嗙幇鏈夌殑鍘熷瀷榪涜閲嶆瀯銆傜洰鐨勬槸鎻愰珮鎬ц兘錛岀伒媧繪?wbr>錛屾墿灞曟э紝鍙鐢ㄦх瓑絳夛紝榪欐槸涓涓暱鏈熺殑涓嶆柇榪唬鐨勮繃紼嬨傚彲浠ュ弬鐪嬬粡鍏哥殑銆婇噸鏋?鏀瑰杽浠g爜璐ㄩ噺銆嬨?/wbr>
鏈鍚庝竴姝ユ槸鏋舵瀯鐨勬彁鐐箋傚皢緋葷粺涓殑鍙互澶栭儴澶嶇敤鐨勯儴鍒嗘彁鐐煎嚭鏉ュ艦鎴?wbr>涓涓彲浠ュ鐢ㄧ殑妗嗘灦鏋舵瀯銆傛湁浜嗗畠錛屼互鍚庣殑寮鍙戠浉浼氫簨鍗婂姛鍊?wbr>銆傛姝ラ灝嗕細鐢ㄥ埌閲嶆瀯鍜岃璁℃ā寮忋傛暣涓殑榪囩▼闄や簡絎竴姝ュ拰闈㈠悜瀵硅薄鏃犲ぇ鍏崇郴澶栵紝鍚庝袱姝ュ垯瀹屽叏鐨勯潰鍚?wbr>瀵硅薄鐨勬濇兂銆?/wbr>
鍦ㄦ涔嬪墠鎬繪槸甯屾湜鍏堟湁涓涓璁¤壇濂界殑鏋舵瀯錛屼竴鐩磋繖鏍蜂笉鏂殑瀛︿範鍜岃繘琛屽疄璺點傜粨鏋滃嵈涓嶅敖浜烘剰銆傜粡楠岃鏄庤繖鏍峰仛紜疄鏈変簺鏈湯鍊掔疆銆傛濡傛ā寮忕殑浣跨敤涓鏍?wbr>錛屽湪鍔ㄦ満涓嶆槑紜殑鎯呭喌涓嬬洸鐩殑濂楃敤妯″紡鏄病鏈夋剰涔夌殑銆?/wbr>
姣忎竴涓紑鍙戜漢鍛樼殑鑴戣涓湁涓浜涢潪甯哥編濡欑殑鍒涙剰錛岃繖浜涘垱鎰忔病鏈夊疄鐜扮殑涓涓師鍥犲氨鏄紝澶繃鍏蟲敞緇嗚妭銆傚浜庨潰鍚戝璞¤繕鏄熀浜庡璞″紑鍙戯紝瀵逛簬瀹炵幇闇姹傦紝瀹屾垚欏圭洰鐨勫垵鏈熼樁孌碉紝鐪熺殑鏃犳墍璋撱傚綋闇瑕佽冭檻鎻愰珮寮鍙戝拰緇存姢鏁堢巼鐨勬椂鍊欙紝闈㈠悜瀵硅薄灝辨垚浜嗗緢涓嶉敊鐨勯夋嫨銆?/div>

]]>鎬濈淮瀵煎浘鐢繪硶瑙勫垯鍙婂緩璁?/title><link>http://www.shnenglu.com/ace/archive/2006/06/07/8242.html</link><dc:creator>Stone Jiang</dc:creator><author>Stone Jiang</author><pubDate>Wed, 07 Jun 2006 05:14:00 GMT</pubDate><guid>http://www.shnenglu.com/ace/archive/2006/06/07/8242.html</guid><wfw:comment>http://www.shnenglu.com/ace/comments/8242.html</wfw:comment><comments>http://www.shnenglu.com/ace/archive/2006/06/07/8242.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/ace/comments/commentRss/8242.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/ace/services/trackbacks/8242.html</trackback:ping><description><![CDATA[鍦ㄧ綉涓婄湅鍒?鎸哄ソ鐨?杞繃鏉ヤ簡.<br /><br /><img src="http://www.28star.com/blog/uploads/200512/26_154917_mindmanager.jpg" /><br /><img src ="http://www.shnenglu.com/ace/aggbug/8242.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/ace/" target="_blank">Stone Jiang</a> 2006-06-07 13:14 <a href="http://www.shnenglu.com/ace/archive/2006/06/07/8242.html#Feedback" target="_blank" style="text-decoration:none;">鍙戣〃璇勮</a></div>]]></description></item><item><title>鍦≧ational Rose涓敤UML寤烘ā鏃剁殑鍏冪礌閲嶈澆http://www.shnenglu.com/ace/archive/2006/05/23/7535.htmlStone JiangStone JiangTue, 23 May 2006 07:26:00 GMThttp://www.shnenglu.com/ace/archive/2006/05/23/7535.htmlhttp://www.shnenglu.com/ace/comments/7535.htmlhttp://www.shnenglu.com/ace/archive/2006/05/23/7535.html#Feedback0http://www.shnenglu.com/ace/comments/commentRss/7535.htmlhttp://www.shnenglu.com/ace/services/trackbacks/7535.html鍦≧ational Rose涓敤UML寤烘ā鏃剁殑鍏冪礌閲嶈澆

鍦ㄥ埄鐢≧ational Rose瀵圭郴緇熷緩妯℃椂錛屽彲鑳戒細閬囧埌鍚屼竴涓寤烘ā鐨勫璞″湪涓嶅悓鍖呬腑鍏鋒湁涓嶅悓鑱岃矗鐨勯棶棰樸?br />姣斿錛屸滅敤鎴封濊繖涓璞★紝鍦ㄤ笟鍔¢鍩熸ā鍨嬩腑錛屽畠鏄竴涓笟鍔″伐浜烘垨涓氬姟涓昏(business actor)錛屽湪緋葷粺鐢ㄤ緥妯″瀷涓紝鎴戜滑闇瑕佸垱寤哄彟涓涓唬琛ㄧ郴緇熸墽琛岃咃紙Actor)鐨勫厓绱犮俁ational Rose浠ュ悕縐版爣璇嗕笉鍚岀殑妯″瀷鍏冪礌錛屼技鍥懼啀鍒涘緩涓涓彨"鐢ㄦ埛"鐨凙ctor鍒欎細瓚呮垚閲嶅悕銆?br />榪欏悇閲嶅悕錛屽彲浠ョО涓哄厓绱犫滈噸杞解濄?br />
涓嬮潰浠嬬粛濡備綍榪涜鈥滃厓绱犻噸杞解?br />

涓嶅湪鍚屼竴涓寘鍐呯殑鍙備笌鑰呫佺敤渚嬨佺被銆佹瀯浠跺拰鍖咃紝鍚嶇О鍙互鐩稿悓銆備笉鍚岀殑妯″瀷鍏冪礌鎷ユ湁鐩稿悓鐨勫悕縐版椂錛岃繖浜涘厓绱犺縐頒負鈥滈噸杞解?br />閲嶈澆鍏佽浣犺繘琛屽熀浜庡璇█鏋勪歡鐨勫紑鍙戙?br />閲嶈澆鍏佽鐢ㄤ緥瑙嗗浘涓殑鍙備笌鑰呭拰閫昏緫瑙嗗浘涓殑綾繪嫢鏈夌浉鍚岀殑鍚嶇О


鍒涘緩涓涓噸杞藉厓绱?br />1錛変粠宸ュ叿綆變腑鍒涘緩涓涓柊鐨勫厓绱?br />2錛夊弻鍑繪柊鍏冪礌錛屾垨鑰呭崟鍑籅rowse>Specification錛屾墦寮瑙勮寖紿楀彛
3錛夊湪鍚嶇О瀛楁涓緭鍏ュ悕縐?br />4錛夊崟鍑籓K鎸夐挳聽

濡傛灉鍦ㄥ叾瀹冨寘涓瓨鍦ㄥ叿鏈夌浉鍚屽悕縐扮殑璁捐鍏冪礌錛岀郴緇熶細鎻愮ず浣狅紝姝ゆ椂鐐光滅‘瀹氣濆嵆鍙?br />



]]>
C/C++ 鍐呭瓨綆$悊 Heap vs Stackhttp://www.shnenglu.com/ace/archive/2006/05/17/7313.htmlStone JiangStone JiangWed, 17 May 2006 09:09:00 GMThttp://www.shnenglu.com/ace/archive/2006/05/17/7313.htmlhttp://www.shnenglu.com/ace/comments/7313.htmlhttp://www.shnenglu.com/ace/archive/2006/05/17/7313.html#Feedback0http://www.shnenglu.com/ace/comments/commentRss/7313.htmlhttp://www.shnenglu.com/ace/services/trackbacks/7313.html 杞敞:
聽聽聽 浠婂ぉ鏈夌綉鍙嬮棶鍒拌繖涓棶棰?浜庢槸鍦ㄧ綉涓婃悳绱簡涓涓?杞創榪欐.
鐩鎬技鐨勫お澶氫簡,鍑哄涓嶈.鍦ㄦ鎰熻阿鍘熶綔鑰呯簿褰╄瑙?


涓銆侀澶囩煡璇嗏旂▼搴忕殑鍐呭瓨鍒嗛厤
涓涓敱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>
staticint聽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鏄湪緙栬瘧鏃跺氨紜畾鐨勶紱
浣嗘槸錛屽湪浠ュ悗鐨勫瓨鍙栦腑錛屽湪鏍堜笂鐨勬暟緇勬瘮鎸囬拡鎵鎸囧悜鐨勫瓧絎︿覆(渚嬪鍫?蹇?
姣斿錛?
#include聽<stdio.h>;聽
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 />


Stone Jiang 2006-05-17 17:09 鍙戣〃璇勮
]]>
4+1瑙嗗浘綆榪?/title><link>http://www.shnenglu.com/ace/archive/2006/05/08/6748.html</link><dc:creator>Stone Jiang</dc:creator><author>Stone Jiang</author><pubDate>Mon, 08 May 2006 07:22:00 GMT</pubDate><guid>http://www.shnenglu.com/ace/archive/2006/05/08/6748.html</guid><wfw:comment>http://www.shnenglu.com/ace/comments/6748.html</wfw:comment><comments>http://www.shnenglu.com/ace/archive/2006/05/08/6748.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/ace/comments/commentRss/6748.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/ace/services/trackbacks/6748.html</trackback:ping><description><![CDATA[<p>4+1瑙嗗浘<br />url: http://www.shnenglu.com/ace<br /><br />鐢ㄤ緥瑙嗗浘:瀵圭郴緇熷姛鑳芥ч渶姹傚妯★紝鎻忚堪緋葷粺鐨勮涓猴紝鎻ず緋葷粺鈥滄槸浠涔堚?/p> <p>閫昏緫瑙嗗浘:鎻忚堪緋葷粺璁捐妯″瀷錛屽寘鍚笌緋葷粺緇撴瀯鏈閲嶈鎰忎箟鐨勯儴鍒嗭紝姣斿錛岀郴緇熷垎瑙f垚涓虹殑瀛愮郴緇燂紝瀛愮郴緇熷垎瑙f垚澶氫釜綾伙紝浠ュ強榪欎簺鍏冪礌鐨勮亴璐o紝鍏崇郴錛屾搷浣滃拰灞炴?/p> <p>榪涚▼瑙嗗浘錛氭弿榪扮郴緇熷垎瑙f垚綰跨▼鍙婅繘紼嬬殑榪囩▼錛屾弿榪扮嚎紼嬶紙榪涚▼錛夐氳妯¤瘯絳?/p> <p>閮ㄧ講瑙嗗浘錛氭弿榪拌繍琛岀郴緇熺殑鐗╃悊紜歡錛堝寘鍚綉緇滐級閰嶇疆錛岃鏄庢瘡涓妭鐐圭殑璁$畻鏈猴紝CPU錛屾搷浣滅郴緇熶互鍙婂畠浠簰鑱旂殑鎯呭喌錛岃繕瑕佸寘鎷繘紼嬪埌鑺傜偣涔嬮棿鐨勬槧灝勫叧緋匯?/p> <p>瀹炴柦瑙嗗浘錛氭弿榪扮郴緇熷湪鏋勫緩鏃剁殑鍒嗚В鍚庣殑瀛愮郴緇燂紙鍖咃級鐨勬儏鍐碉紝鐗瑰埆鏄寘鎷摢浜涚粍鎴愰儴鍒嗙敱鍝簺鍥㈤槦寮鍙戯紝浠ュ強璐叆錛屽鍖咃紝寮鍙戣繘搴︾瓑鍐呭銆傞」鐩粡鐞嗗簲璇ュ榪欎釜瑙嗗浘鏈鎰熷叴瓚c?br /></p><img src ="http://www.shnenglu.com/ace/aggbug/6748.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/ace/" target="_blank">Stone Jiang</a> 2006-05-08 15:22 <a href="http://www.shnenglu.com/ace/archive/2006/05/08/6748.html#Feedback" target="_blank" style="text-decoration:none;">鍙戣〃璇勮</a></div>]]></description></item><item><title>璋佸簲褰撳鐢ㄤ緥鏈夊叴瓚?http://www.shnenglu.com/ace/archive/2006/05/08/6742.htmlStone JiangStone JiangMon, 08 May 2006 05:46:00 GMThttp://www.shnenglu.com/ace/archive/2006/05/08/6742.htmlhttp://www.shnenglu.com/ace/comments/6742.htmlhttp://www.shnenglu.com/ace/archive/2006/05/08/6742.html#Feedback0http://www.shnenglu.com/ace/comments/commentRss/6742.htmlhttp://www.shnenglu.com/ace/services/trackbacks/6742.htmlWho should be interested in Use case?

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>

Stone Jiang 2006-05-08 13:46 鍙戣〃璇勮
]]>
閬垮厤渚濊禆鐨勬秷鎭鐞嗘柟寮?(璇曡瘧)http://www.shnenglu.com/ace/archive/2006/05/04/6629.htmlStone JiangStone JiangThu, 04 May 2006 12:52:00 GMThttp://www.shnenglu.com/ace/archive/2006/05/04/6629.htmlhttp://www.shnenglu.com/ace/comments/6629.htmlhttp://www.shnenglu.com/ace/archive/2006/05/04/6629.html#Feedback0http://www.shnenglu.com/ace/comments/commentRss/6629.htmlhttp://www.shnenglu.com/ace/services/trackbacks/6629.html閬垮厤渚濊禆鐨勬秷鎭鐞嗘柟寮?br />
Anthony Williams
url: http://www.ddj.com/dept/cpp/184429055
璇戣? Stone Jiang
璇戣呰鏄庯細鏈漢榪樺湪瀛︿範鑻辨枃鐨勮繃紼嬩腑錛屾湁浜涘彞瀛愬緢闅捐瘧錛岃繖閲岀粰鍑哄師鏂囩殑閾炬帴錛屾榪庡氨鍏朵腑璇戝緱涓嶅噯紜殑鍦版柟涓庢垜浜ゆ崲鎰忚銆?br />

鍦ㄦ偍緇存姢瀹夊叏綾誨瀷鍜岄伩鍏嶉泦鎴愮數璺埇鍑芥暟鏃?浣犲彲浠ヤ嬌鐢–++鐨勫己澶х殑鍔涢噺榪涜娑堟伅浼犻掋?/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>

浼犵粺鎶鏈?/h2>


澶ф搴旂敤寰楁渶涓哄箍娉涚殑娑堟伅浼犻掓妧鏈槸浣跨敤涓涓甫鏈夌壒孌婃垚鍛樻潵琛ㄧず娑堟伅綾誨瀷鐨勭粨鏋勪綋錛岃娑堟伅綾誨瀷鏄秷鎭殑鏍囪瘑銆傝繖縐嶆柟寮忚騫挎硾搴旂敤褰掑拵浜庝嬌鐢ㄤ簡鍩轟簬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>

淇濇寔綆鍗?/font>

鏈綆鍗曠殑OOP鎶鏈氨鏄敤dynamic_cast媯鏌ュ疄闄呯殑娑堟伅綾誨瀷浠f浛媯鏌ユ秷鎭紪鐮併傜劧鑰岋紝榪欎緷鐒墮潰涓寸潃闆嗘垚鐢佃礬鑸湴娑堟伅澶勭悊鏂瑰紡鈥斺旂幇鍦ㄩ氳繃鍖呮嫭dynamic_cast鐨勬瘮杈冮摼涔熶紭浜庨氳繃綾誨瀷緙栫爜瀛楁姣旇緝閾俱傚鍒楄〃1:

void 聽handleMessage(Message * 聽message)
{
聽聽聽聽
if (Message1 * 聽m = dynamic_cast < Message1 *> (message))
聽聽聽聽
{
聽聽聽聽聽聽聽聽handleMessage1(m);
聽聽聽聽}

聽聽聽聽
else if (Message2 * 聽m = dynamic_cast < Message2 *> (message))
聽聽聽聽
{
聽聽聽聽聽聽聽聽handleMessage2(m);
聽聽聽聽}

聽聽聽聽
//
}

[鍒楄〃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>

class 聽Message
{
public :
聽聽聽聽
virtual void 聽dispatch(MessageHandler * 聽handler) = 0 ;
};
class 聽Message1:
聽聽聽聽
public 聽Message
{
聽聽聽聽
void 聽dispatch(MessageHandler * 聽handler)
聽聽聽聽{
聽聽聽聽聽聽聽聽handler
-> process( this );
聽聽聽聽}
};
class 聽Message2:
聽聽聽聽
public 聽Message
{
聽聽聽聽
void 聽dispatch(MessageHandler * 聽handler)
聽聽聽聽{
聽聽聽聽聽聽聽聽handler
-> process( this );
聽聽聽聽}
};
// 聽other聽message聽classes
class 聽MessageHandler
{
聽聽聽聽
void 聽process(Message1 * );
聽聽聽聽
void 聽process(Message2 * );
聽聽聽聽
// 聽overloads聽of聽process聽for聽other聽messages
};

[鍒楄〃2]

渚濊禆浜庨噸杞界殑鏂瑰紡鏉ュ尯鍒笉鍚岀殑娑堟伅鏈夊埄浜庡ぇ澶氭暟騫寵 鈥斺旂幇鍦ㄥ湪姣忎釜娑堟伅綾諱腑铏氬嚱鏁扮殑瀹炵幇鏂瑰紡鏄浉鍚岀殑錛屽鏋滈渶瑕侊紝鍙互閫氳繃瀹忔潵涓鑷村湴鍖呰錛屾垨閫氳繃浠庝竴涓秷鎭埌鍙︿竴涓秷鎭腑鐩存帴澶嶅埗錛屼笉浼氭湁鍑洪敊鐨勬満浼氥?/p>

鍙岄噸鍒嗘淳瀛樺湪涓涓己鐐光斺旈珮搴﹁棔鍚堛傜敱浜庨氳繃閲嶈澆鏂瑰紡鍦ㄥ鐞嗗櫒綾諱腑鐨勯夋嫨澶勭悊鍑芥暟錛屽湪娑堟伅綾諱腑铏氬嚱鏁扮殑瀹炵幇闇瑕佺煡閬撳鐞嗗櫒綾葷殑瀹氫箟鐨勫叏閮紝鍥犳蹇呴』娉ㄦ剰鍒板湪緋葷粺涓瘡涓叾瀹冪殑綾葷殑鍚嶅瓧銆備笉鍏夎繖浜涳紝濡傛灉瑕佹敮鎸佷笉鍚岀殑澶勭悊鍣ㄧ被錛屽鐞嗗嚱鏁板繀欏誨湪閫氱敤鐨勫鐞嗗櫒鐨勫熀綾諱腑澹版槑涓鴻櫄鍑芥暟錛屾墍浠ユ瘡涓鐞嗗櫒綾誨繀欏誨湪緋葷粺涓敞鎰忓埌鎵鏈夌殑娑堟伅綾誨瀷(鍒楄〃3)銆傚鍔犳垨鍒犻櫎涓涓秷鎭被鍨嬩細寮曡搗搴旂敤紼嬪簭澶ч儴鍒嗕唬鐮侀噸鏂扮紪璇戙?/p>

class 聽MessageHandler
{
聽聽聽聽
virtual void 聽process(Message1 * ) = 0 ;
聽聽聽聽
virtual void 聽process(Message2 * ) = 0 ;
聽聽聽聽
virtual void 聽process(Message3 * ) = 0 ;
聽聽聽聽
virtual void 聽process(Message4 * ) = 0 ;
聽聽聽聽
// 聽overloads聽of聽process聽for聽other聽messages
}
;
class 聽SpecificMessageHandler:
聽聽聽聽
public 聽MessageHandler
{
聽聽聽聽
void 聽process(Message1 * );
聽聽聽聽
void 聽process(Message2 * );
聽聽聽聽
void 聽process(Message3 * );
聽聽聽聽
void 聽process(Message4 * );
聽聽聽聽
// 聽overloads聽of聽process聽for聽other聽messages
}
;
class 聽OtherSpecificMessageHandler:
聽聽聽聽
public 聽MessageHandler
{
聽聽聽聽
void 聽process(Message1 * );
聽聽聽聽
void 聽process(Message2 * );
聽聽聽聽
void 聽process(Message3 * );
聽聽聽聽
void 聽process(Message4 * );
聽聽聽聽
// 聽overloads聽of聽process聽for聽other聽messages
}
;

[鍒楄〃3]

鍔ㄦ佸弻閲嶅垎媧?br />
錛圛t was against this backdrop that I developed the technique I call "Dynamic Double Dispatch."錛夋垜寮鍙戜簡涓縐嶆妧鏈紝鎴戠О鍏朵負鈥滃姩鎬佸弻閲嶅垎媧鋸濓紝榪欑鎶鏈敤浜庤В鍐充笂榪伴棶棰樸傚敖綆℃湁鍩烘湰鐨勫弻閲嶅垎媧炬妧鏈紝浣嗛夋嫨鐨勬秷鎭鐞嗗嚱鏁頒嬌鐢ㄧ殑鏄湪緙栬瘧闃舵紜畾鐨勯噸杞芥妧鏈?灝界鍙戠幇鍦ㄦ紜殑娑堟伅澶勭悊鍣ㄧ被涓殑瀹炵幇鏄嬌鐢ㄨ櫄鍑芥暟鏈哄埗),鑰屽姩鎬佸弻閲嶅垎媧炬槸鍦ㄨ繍琛屾椂媯鏌ュ湪澶勭悊鍣ㄤ笂閫傚綋鐨勫鐞嗗嚱鏁扮殑銆傜粨璁烘槸鍔ㄦ佸弻閲嶅垎媧炬秷闄や簡鍙岄噸鍒嗘淳鐨勪緷璧栭棶棰樸傛秷鎭被鍨嬩笉鍦ㄩ渶瑕佹敞鎰忓埌鍏跺畠鐨勬秷鎭被鍨嬶紝騫朵笖澶勭悊鍣ㄧ被浠呴渶瑕佹敞鎰忓埌瀹冪殑瀹冭澶勭悊鐨勬秷鎭?/p>

鍔ㄦ佹鏌ョ殑鍏抽敭鐐規槸錛氭瘡涓涓秷鎭被鍨嬫湁涓涓嫭绔嬬殑鍩虹被鈥斺斿鐞嗗櫒綾諱粠閫傚綋鐨勶紝璁捐涓哄鐞嗘秷鎭殑鍩虹被媧劇敓銆傜劧鍚庡湪姣忎釜娑堟伅綾諱腑鐨勫垎媧懼嚱鏁拌兘鐢╠ynamic_cast鏉ユ鏌ヤ粠姝f淳鍩虹被媧劇敓鐨勫鐞嗗櫒綾伙紝鍥犺屽疄鐜頒簡姝g‘鐨勫鐞嗗嚱鏁般?鍒楄〃4)

class 聽MessageHandlerBase
{};
class 聽Message1HandlerBase:
聽聽聽聽
public virtual 聽MessageHandlerBase
{
聽聽聽聽
virtual void 聽process(Message1 * ) = 0 ;
};
class 聽Message1
{
聽聽聽聽
void 聽dispatch(MessageHandlerBase * 聽handler)
聽聽聽聽{
聽聽聽聽聽聽聽聽dynamic_cast
< Message1HandlerBase &> ( * handler).process( this );
聽聽聽聽}
};
class 聽Message2HandlerBase:
聽聽聽聽
public virtual 聽MessageHandlerBase
{
聽聽聽聽
virtual void 聽process(Message2 * ) = 0 ;
};
class 聽Message2:
聽聽聽聽
public 聽MessageBase
{
聽聽聽聽
void 聽dispatch(MessageHandlerBase * 聽handler)
聽聽聽聽{
聽聽聽聽聽聽聽聽dynamic_cast
< Message2HandlerBase &> ( * handler).process( this );
聽聽聽聽}
};
//
class 聽SpecificMessageHandler:
聽聽聽聽
public 聽Message1HandlerBase,
聽聽聽聽
public 聽Message2HandlerBase
{
聽聽聽聽
void 聽process(Message1 * );
聽聽聽聽
void 聽process(Message2 * );
};
class 聽OtherSpecificMessageHandler:
聽聽聽聽
public 聽Message3HandlerBase,
聽聽聽聽
public 聽Message4HandlerBase
{
聽聽聽聽
void 聽process(Message3 * );
聽聽聽聽
void 聽process(Message4 * );
};

[鍒楄〃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>

template < typename聽MessageType >
class 聽MessageHandler:
聽聽聽聽
public virtual 聽MessageHandlerBase
{
聽聽聽聽
virtual void 聽process(MessageType * ) = 0 ;
};
class 聽Message1
{
聽聽聽聽
void 聽dispatch(MessageHandlerBase * 聽handler)
聽聽聽聽{
聽聽聽聽聽聽聽聽dynamic_cast
< MessageHandler < Message1 >&> ( * handler).process( this );
聽聽聽聽}
};
class 聽SpecificMessageHandler:
聽聽聽聽
public 聽MessageHandler < Message1 > ,
聽聽聽聽
public 聽MessageHandler < Message2 >
{
聽聽聽聽
void 聽process(Message1 * );
聽聽聽聽
void 聽process(Message2 * );
};

[鍒楄〃5]
鍑轟簬綆鍖栧師鍥狅紝鍦ㄦ秷鎭被涓殑鍒嗘淳鍑芥暟鍑犱箮鐩稿悓錛屼絾涔熶笉鏄畬鍏ㄧ浉鍚屸斺斿畠浠繀欏繪槑紜殑鎸囧畾灞炰簬瀹冧滑鐨勬寚瀹氭秷鎭被錛屼互渚夸簬杞崲涓洪傚綋鐨勫鐞嗗櫒鍩虹被銆傚儚杞歡涓澶氫簨鎯呬竴鏍鳳紝榪欎釜闂鍙互澧炲姞涓涓澶栫殑灞傛潵瑙e喅鈥斺斿垎媧懼嚱鏁板彲浠ュ鎵樼粰鍗曚釜妯℃澘鍑芥暟錛岃繖涓ā鏉垮嚱鏁頒嬌鐢ㄦā鏉垮弬鏁扮被鍨嬫潵紜畾娑堟伅綾誨瀷鍜屾妸澶勭悊鍣ㄨ漿鎹㈠埌閫傚綋鐨勭被鍨嬩笂銆?鍒楄〃6)

class 聽Message
{
protected :
聽聽聽聽template
< typename聽MessageType >
聽聽聽聽
void 聽dynamicDispatch(MessageHandlerBase * 聽handler,MessageType * 聽self)
聽聽聽聽{
聽聽聽聽聽聽聽聽dynamic_cast
< MessageHandler < MessageType >&> ( * handler).process(self);
聽聽聽聽}
};
class 聽Message1:
聽聽聽聽
public 聽MessageBase
{
聽聽聽聽
void 聽dispatch(MessageHandlerBase * 聽handler)
聽聽聽聽{
聽聽聽聽聽聽聽聽dynamicDispatch(handler,
this );
聽聽聽聽}
};

[鍒楄〃6]

閫氳繃榪涗竴姝ユ娊璞″湪娑堟伅瀵硅薄涓垎媧懼嚱鏁扮殑涓嶅悓涔嬪,鎴戜滑鎶婂伐浣滈泦涓埌涓涓湴鏂光斺旀ā鏉垮嚱鏁扮殑瀹氫箟錛涘畠鎻愪緵浜嗕負淇敼琛屼負鐨勫崟涓鐐廣傚湪娑堟伅綾諱腑鍓╀笅鐨勫垎媧懼嚱鏁伴兘鏄浉鍚岀殑錛岃繖瓚充互鎶婂畠浠畝鍖栧埌闅愯棌緇嗚妭鐨勫畯涓垨鍦ㄦ秷鎭被涔嬮棿涓愬瓧澶嶅埗銆?/p>



鏈鐞嗙殑娑堟伅

榪勪粖涓烘錛屾垜浠睍紺虹殑 dynamicDispach妯℃澘鍑芥暟鐨勪唬鐮佸亣瀹氬鐞嗙殑綾繪槸浠庨傚綋鐨凷pecificMessageHandler鏄淳鐢熺殑錛涘鏄笉鏄繖鏍鳳紝 dynamic_cast灝嗘姏鍑簊td::bad_cast寮傚父銆傛湁鏃惰繖灝辮凍澶熶簡錛屼絾鏄湁鐨勬椂鍊欙紝鏈夋洿閫傚綋鐨勮涓衡斺斾篃璁告洿濂界殑鍋氭硶鏄姏寮冩秷鎭紝榪欎笉鑳借鎺ュ彈娑堟伅鐨勪唬鐞嗗鐞嗘垨璋冪敤catch-all澶勭悊鍣ㄣ備婦渚嬫潵璇達紝dynamicDispatch 鍑芥暟鑳借璋冩暣錛岀敤鍩轟簬鎸囬拡鐨勮漿鎹唬鏇垮熀浜庡紩鐢ㄧ殑杞崲錛屾墍浠ョ粨鏋滃煎彲浠ヤ笌NULL榪涜嫻嬭瘯銆?/p>


緙虹偣(Trade-Off)鍦ㄥ摢閲岋紵
鏈夊姝ゅ鐨勪紭鐐癸紝涓瀹氬瓨鍦ㄥ畠鐨勭己鐐癸紝閭e畠鐨勭己鐐瑰湪鍝噷鍛紵鍦ㄨ繖閲岋紝鏈変袱涓己鐐廣傜涓涓槸錛氶澶栫殑鍔ㄦ佽漿鎹紝涓や釜铏氬嚱鏁拌皟鐢ㄤ細褰卞搷鎬ц兘銆傚鏋滄ц兘涓婃槸涓涓棶棰橈紝榪欏氨鏄竴涓枒闂紝浣嗘槸錛屽湪寰堝鎯呭喌涓嬶紝鑺遍攢鍦ㄨ繖閲岀殑棰濆鐨勬椂闂存槸涓嶅煎緱鍏蟲敞鐨勩傚彲浠ヤ嬌鐢ㄧ浉搴旂殑宸ュ叿鏉ョ瀹氬埌搴曞摢閲屾墠鏄湡姝g殑鎬ц兘鐡墮鎵鍦ㄣ?/p>

絎簩涓己鐐規槸:闇瑕佷負姣忎釜娑堟伅澶勭悊浠庢寚瀹氱殑鍩虹被媧劇敓娑堟伅澶勭悊鍣ㄣ傚洜涓哄鐞嗘柊鐨勬秷鎭被鍨嬮渶瑕佷慨鏀逛袱涓湴鏂光斺旈傚綋鐨勫熀綾誨垪琛ㄥ叆鍙e拰澶勭悊鍑芥暟錛屾墍浠ヨ繖鍙兘鎴愪負閿欒鐨勬潵婧愶紝閬楀け澶勭悊鍑芥暟瀹規槗琚彂鐜幫紝鍥犱負榪欐槸鍏ㄥ眬鐐癸紝浣嗘槸閬楀け鍩虹被鍦ㄤ唬鐮佽繍琛屾椂鍙駭鐢熶笉鏄撴煡瑙夌殑緙洪櫡銆傚洜涓烘病鏈夊鐞嗗嚱鏁扮殑鏃跺欎粎浠呮槸涓嶈皟鐢ㄥ畠銆傝繖浜涢敊璇湪鍗曞厓嫻嬭瘯鐨勬椂鍊欐槸寰堝鏄撹鎶撳嚭鏉ョ殑錛屾墍浠ユ墍瀹炶瘽錛岃繖浜涗笉渚夸箣澶勯兘鎴愪笉浜嗗ぇ闂銆?/p>



]]>
[杞琞嫻嬭瘯椹卞姩寮鍙戝叏鍔熺暐http://www.shnenglu.com/ace/archive/2006/04/28/6415.htmlStone JiangStone JiangFri, 28 Apr 2006 05:03:00 GMThttp://www.shnenglu.com/ace/archive/2006/04/28/6415.htmlhttp://www.shnenglu.com/ace/comments/6415.htmlhttp://www.shnenglu.com/ace/archive/2006/04/28/6415.html#Feedback0http://www.shnenglu.com/ace/comments/commentRss/6415.htmlhttp://www.shnenglu.com/ace/services/trackbacks/6415.html [杞琞嫻嬭瘯椹卞姩寮鍙戝叏鍔熺暐

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>

  1. 瀹屽伐鏃跺畬宸ャ傝〃鏄庢垜鍙互寰堟竻妤氱殑鐪嬪埌鑷繁鐨勮繖孌靛伐浣滃凡緇忕粨鏉熶簡錛岃屼紶緇熺殑鏂瑰紡寰堥毦鐭ラ亾浠涔堟椂鍊欑紪鐮佸伐浣滅粨鏉熶簡銆?
  2. 鍏ㄩ潰姝g‘鐨勮璇嗕唬鐮佸拰鍒╃敤浠g爜錛岃屼紶緇熺殑鏂瑰紡娌℃湁榪欎釜鏈轟細銆?
  3. 涓哄埄鐢ㄤ綘鎴愭灉鐨勪漢鎻愪緵Sample錛屾棤璁哄畠鏄鍒╃敤浣犵殑婧愪唬鐮侊紝榪樻槸鐩存帴閲嶇敤浣犳彁渚涚殑緇勪歡銆?
  4. 寮鍙戝皬緇勯棿闄嶄綆浜嗕氦嫻佹垚鏈紝鎻愰珮浜嗙浉浜掍俊璧栫▼搴︺?
  5. 閬垮厤浜嗚繃娓¤璁°?
  6. 緋葷粺鍙互涓庤灝界殑嫻嬭瘯闆嗕竴璧峰彂甯冿紝浠庤屽紼嬪簭鐨勫皢鏉ョ増鏈殑淇敼鍜屾墿灞曟彁渚涙柟渚褲?
  7. TDD緇欎簡鎴戜滑鑷俊錛岃鎴戜滑浠婂ぉ鐨勯棶棰樹粖澶╄В鍐籌紝鏄庡ぉ鐨勯棶棰樻槑澶╄В鍐籌紝浠婂ぉ涓嶈兘瑙e喅鏄庡ぉ鐨勯棶棰橈紝鍥犱負鏄庡ぉ鐨勯棶棰樿繕娌℃湁鍑虹幇(娌℃湁TestCase)錛岄櫎闈炴湁TestCase鍚﹀垯鎴戝喅涓嶅啓浠諱綍浠g爜錛涙槑澶╀篃涓嶅繀鎷呭績浠婂ぉ鐨勯棶棰橈紝鍙鎴戜寒浜嗙豢鐏?

    銆庝笉鏄捐屾槗瑙佺殑浼樼偣銆?/b>

  8. 閫冮伩浜嗚璁¤鑹層傚浜庝竴涓晱鎹風殑寮鍙戝皬緇勶紝姣忎釜浜洪兘鍦ㄥ仛璁捐銆?
  9. 澶ч儴鍒嗘椂闂翠唬鐮佸鍦ㄩ珮璐ㄩ噺鐘舵侊紝100錛呯殑鏃墮棿閲屾垚鏋滄槸鍙鐨勩?
  10. 鐢變簬鍙互淇濊瘉緙栧啓嫻嬭瘯鍜岀紪鍐欎唬鐮佺殑鏄浉鍚岀殑紼嬪簭鍛橈紝闄嶄綆浜嗙悊瑙d唬鐮佹墍鑺辮垂鐨勬垚鏈?
  11. 涓哄噺灝戞枃妗e拰浠g爜涔嬮棿瀛樺湪鐨勭粏寰殑宸埆鍜岀敱榪欑宸埆鎵寮曞叆鐨凚ug浣滃嚭鏉板嚭璐$尞銆?
  12. 鍦ㄩ鍏堣璁″拰绱фヨ璁′箣闂村緩绔嬩竴縐嶅鉤琛$偣錛屼負浣犲尯鍒嗗摢浜涜璁¤浜嬪厛鍋氥佸摢浜涜璁¤榪唬鏃跺仛鎻愪緵浜嗕竴涓彲闈犵殑鍒ゆ柇渚濇嵁銆?

    銆庢湁浜夎鐨勪紭鐐廣?/b>

  13. 浜嬪疄涓婃彁楂樹簡寮鍙戞晥鐜囥傛瘡涓涓鍦ㄤ嬌鐢═DD騫剁浉淇DD鐨勪漢閮戒細鐩鎬俊榪欎竴鐐癸紝浣嗚鏈涜呭垯涓嶅悓錛屼笉鐩鎬俊TDD鐨勪漢鐢氳嚦鍧氬喅鍙嶅榪欎竴鐐癸紝榪欏緢姝e父錛屼笘鐣屾繪槸榪欐牱銆?
  14. 鍙戠幇姣斾紶緇熸祴璇曟柟寮忔洿澶氱殑Bug銆?
  15. 浣縄DE鐨勮皟璇曞姛鑳藉け鍘繪剰涔夛紝鎴栬呭簲璇ヨ錛岄伩鍏嶄簡浠や漢澶寸棝鐨勮皟璇曞拰鑺傜害浜嗚皟璇曠殑鏃墮棿銆?
  16. 鎬繪槸澶勫湪瑕佷箞緙栫▼瑕佷箞閲嶆瀯鐨勭姸鎬佷笅錛屼笉浼氫嬌浜烘姄鐙傘傦紙涓ら《甯藉瓙錛?
  17. 鍗曞厓嫻嬭瘯闈炲父鏈夎叮銆?
{TDD鐨勬楠
緙栧啓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>

public void 聽testFab()聽{
聽聽聽聽聽聽聽聽assertEquals(
1 ,聽fib( 1 ));
聽聽聽聽聽聽聽聽assertEquals(
1 ,聽fib( 2 ));
}

錛?錛変笂闈㈣繖孌典唬鐮佷笉鑳界紪璇戦氳繃錛孏reat錛佲斺旀槸鐨勶紝鎴戞槸璇碐reat錛佸綋鐒訛紝濡傛灉浣犳鍦ㄧ敤鐨勬槸Eclipse閭d綘涓嶉渶瑕佺紪璇戯紝Eclipse 浼氬憡璇変綘涓嶅瓨鍦╢ib鏂規硶錛屽崟鍑籱ark浼氶棶浣犺涓嶈鏂板緩涓涓猣ib鏂規硶錛孫h錛屽綋鐒訛紒涓轟簡璁╀笂闈㈤偅涓猅C鑳介氳繃錛屾垜浠繖鏍峰啓錛?/p>

public int 聽fib(聽 int 聽n聽)聽{
聽聽聽聽聽聽聽聽
return 1 ;
}

錛?錛夌幇鍦ㄩ偅涓猅C浜簡緇跨伅錛寃ow錛佸簲璇ュ簡紲濅竴涓嬩簡銆傛帴涓嬫潵瑕佸鍔燭C鐨勯毦搴︿簡錛屾祴絎笁涓厓绱犮?/p>

public void 聽testFab()聽{
聽聽聽聽聽聽聽聽assertEquals(
1 ,聽fib( 1 ));
聽聽聽聽聽聽聽聽assertEquals(
1 ,聽fib( 2 ));
聽聽聽聽聽聽聽聽assertEquals(
2 ,聽fib( 3 ));
}

涓嶈繃榪欐牱鍐欒繕涓嶅お濂界湅錛屼笉濡傝繖鏍峰啓錛?/p>

public void 聽testFab()聽{
聽聽聽聽聽聽聽聽assertEquals(
1 ,聽fib( 1 ));
聽聽聽聽聽聽聽聽assertEquals(
1 ,聽fib( 2 ));
聽聽聽聽聽聽聽聽assertEquals(fib(
1 ) + fib( 2 ),聽fib( 3 ));
}

錛?錛夋柊澧炲姞鐨勬柇璦瀵艱嚧浜嗙孩鐏紝涓轟簡鎵漿榪欎竴灞鍔挎垜浠繖鏍蜂慨鏀筬ib鏂規硶錛屽叾涓儴鍒嗕唬鐮佹槸浠庝笂闈㈢殑浠g爜涓瑿trl-C/Ctrl-V鏉ョ殑錛?/p>

public int 聽fib(聽 int 聽n聽)聽{
聽聽聽聽聽聽聽聽
if 聽(聽n聽 == 3 聽)聽 return 聽fib( 1 ) + fib( 2 );
聽聽聽聽聽聽聽聽
return 1 ;
}

錛?錛夊ぉ鍝紝榪欑湡鏄釜璐變漢鍐欑殑浠g爜錛佹槸鍟婏紝涓嶆槸鍚楋紵鍥犱負TC灝辨槸浜у搧鐨勮摑鏈紝浜у搧鍙鎭板ソ婊¤凍TC灝眔k銆傛墍浠ヤ簨鎯呭彂灞曞埌榪欎釜鍦版涓嶆槸fib鏂規硶鐨勯敊錛岃屾槸TC鐨勯敊錛屼簬鏄疶C榪樿榪涗竴姝ヨ姹傦細

public void 聽testFab()聽{
聽聽聽聽聽聽聽聽assertEquals(
1 ,聽fib( 1 ));
聽聽聽聽聽聽聽聽assertEquals(
1 ,聽fib( 2 ));
聽聽聽聽聽聽聽聽assertEquals(fib(
1 ) + fib( 2 ),聽fib( 3 ));
聽聽聽聽聽聽聽聽assertEquals(fib(
2 ) + fib( 3 ),聽fib( 4 ));
}

錛?錛変笂鏈夋斂絳栦笅鏈夊絳栥?/p>

public int 聽fib(聽 int 聽n聽)聽{
聽聽聽聽聽聽聽聽
if 聽(聽n聽 == 3 聽)聽 return 聽fib( 1 ) + fib( 2 );
聽聽聽聽聽聽聽聽
if 聽(聽n聽 == 4 聽)聽 return 聽fib( 2 ) + fib( 3 );
聽聽聽聽聽聽聽聽
return 1 ;
}

錛?錛夊ソ浜嗭紝涓嶇帺浜嗐傜幇鍦ㄥ凡緇忎笉鏄幢涓嶈幢鐨勯棶棰樹簡錛岀幇鍦ㄧ殑闂鏄唬鐮佸嚭鐜頒簡鍐椾綑錛屾墍浠ユ垜浠鍋氱殑鏄斺旈噸鏋勶細

public int 聽fib(聽 int 聽n聽)聽{
聽聽聽聽聽聽聽聽
if 聽(聽n聽 == 1 || 聽n聽 == 2 聽錛壜?/span> return 1 ;
聽聽聽聽聽聽聽聽
else return 聽fib(聽n聽 - 1 聽)聽 + 聽fib(聽n聽 - 2 聽);
}

錛?錛夊ソ錛岀幇鍦ㄤ綘宸茬粡fib鏂規硶宸茬粡鍐欏畬浜嗗悧錛熼敊浜嗭紝涓涓嵄闄╃殑閿欒錛屼綘蹇樹簡閿欒鐨勮緭鍏ヤ簡銆傛垜浠護0琛ㄧずFibonacci涓病鏈夎繖涓欏廣?/p>

public void 聽testFab()聽{
聽聽聽聽聽聽聽聽assertEquals(
1 ,聽fib( 1 ));
聽聽聽聽聽聽聽聽assertEquals(
1 ,聽fib( 2 ));
聽聽聽聽聽聽聽聽assertEquals(fib(
1 ) + fib( 2 ),聽fib( 3 ));
聽聽聽聽聽聽聽聽assertEquals(fib(
2 ) + fib( 3 ),聽fib( 4 ));
聽聽聽聽聽聽聽聽assertEquals(
0 ,聽fib( 0 ));
聽聽聽聽聽聽聽聽assertEquals(
0 ,聽fib( - 1 ));
}

then change the method fib to make the bar grean錛?/p>

public int 聽fib(聽 int 聽n聽)聽{
聽聽聽聽聽聽聽聽
if 聽(聽n聽 <= 0 聽)聽 return 0 ;
聽聽聽聽聽聽聽聽
if 聽(聽n聽 == 1 || 聽n聽 == 2 聽錛壜?/span> return 1 ;
聽聽聽聽聽聽聽聽
else return 聽fib(聽n聽 - 1 聽)聽 + 聽fib(聽n聽 - 2 聽);
}

錛?錛変笅鐝墠鏈鍚庝竴浠朵簨鎯咃紝鎶奣C涔熼噸鏋勪竴涓嬶細

public void 聽testFab()聽{
聽聽聽聽聽聽聽聽
int 聽cases[][]聽 = 聽{
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽{
0 ,聽 0 },聽{ - 1 ,聽 0 },聽聽 // the聽wrong聽parameters
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽{ 1 ,聽 1 },聽{ 2 ,聽 1 }};聽聽 // the聽first聽2聽elements

聽聽聽聽聽聽聽聽
for 聽( int 聽i聽 = 0 ;聽i聽 < 聽cases.length;聽i ++ )
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽assertEquals(聽cases[i][
1 ],聽fib(cases[i][ 0 ])聽);

聽聽聽聽聽聽聽聽
// the聽rest聽elements
聽聽聽聽聽聽聽聽 for 聽( int 聽i聽 = 3 ;聽i聽 < 20 ;聽i ++ )
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽assertEquals(fib(i
- 1 ) + fib(i - 2 ),聽fib(i));
}

錛?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



]]>
鏉庡紑澶嶃婄粰涓浗瀛︾敓鐨勭浜斿皝淇°?http://www.shnenglu.com/ace/archive/2006/04/28/6414.htmlStone JiangStone JiangFri, 28 Apr 2006 04:43:00 GMThttp://www.shnenglu.com/ace/archive/2006/04/28/6414.htmlhttp://www.shnenglu.com/ace/comments/6414.htmlhttp://www.shnenglu.com/ace/archive/2006/04/28/6414.html#Feedback0http://www.shnenglu.com/ace/comments/commentRss/6414.htmlhttp://www.shnenglu.com/ace/services/trackbacks/6414.html 鏉庡紑澶嶃婄粰涓浗瀛︾敓鐨勭浜斿皝淇°?/a>

闃呰絎旇錛氱Н鏋佷富鍔紝鍏呮弧鐑儏錛屾槸榪欏皝淇$殑鏍稿績銆傛渶榪戣嚜宸變篃緇忓巻浜嗕竴浜涗簨鎯咃紝鍦ㄩ潰涓存湭鏉ュ彂灞曞墠鏅殑鍒嗗矓閬撹礬錛岄渶瑕佸仛鍑洪夋嫨鏃訛紝鏄庣煡閬撴煇涓鏉″叿鏈夋洿澶х殑鍙戝睍鍓嶆櫙錛屼絾鏄嵈鐢變簬鏈煡鐨勫緟閬囬棶棰樻斁寮冧簡閫夋嫨瀹冿紝騫墮潪涓嶇Н鏋佷富鍔紝涓嶅厖婊$儹鎯咃紝浣嗘槸鏌愪簺鏃跺欐湁寰堝鐨勫鍦ㄥ洜绱犲彲浠ュ獎鍝嶅喅瀹氥?/strong>

鏉庡紑澶嶃婄粰涓浗瀛︾敓鐨勭浜斿皝淇°嬶紝緇х畫浼犳巿鍏充簬縐瀬琛屽姩銆佹妸鎻¤嚜宸卞懡榪愮殑浜虹敓緇忛獙錛岃繖鏄滀竴灝佹湁鍏崇Н鏋佷富鍔ㄧ殑淇♀濄?

聽聽聽 鈥滀粖澶╁ぇ澶氭暟浼樼鐨勪紒涓氬浜烘墠鐨勬湡鏈涙槸錛氱Н鏋佷富鍔ㄣ佸厖婊$儹鎯呫佺伒媧昏嚜淇$殑浜衡濓紝瀛︿細鈥滆嚜宸辯殑浜嬶紝鑷繁璐熻矗錛岃嚜宸辮В鍐斥濓紝鈥滄垜涓嶈兘錛屽埆鐨勪換浣曚漢涔熶笉鑳戒唬鏇夸綘璧拌繃閭f潯璺紱浣犲繀欏昏嚜宸卞幓璧般傗?/p>

涓涓漢琚嚮璐ワ紝涓嶆槸鍥犱負澶栫晫鐜鐨勯樆紕嶏紝鑰屾槸鍙栧喅浜庝粬瀵圭幆澧冨浣曞弽搴斻傗滄湁鍕囨皵鏀瑰彉鍙互鏀瑰彉鐨勪簨鎯咃紝鏈夎兏鎬鎺ュ彈涓嶅彲鏀瑰彉鐨勪簨鎯咃紝鏈夋櫤鎱ф潵鍒嗚鯨涓よ呯殑涓嶅悓銆傗?/p>

聽聽聽 鈥滃鏋滀綘鎯崇煡閬撲粈涔堬紝灝辮嚜宸卞埌緗戜笂鍘繪壘錛屼笉瑕佹ョ潃鍘婚棶鍒漢錛涘鏋滀綘鍚埌浜嗕粈涔堬紝涓嶈鐩茬洰淇′粠錛屽簲褰撹嚜宸變富鍔ㄥ幓緗戜笂姹傝瘉銆傗?/p>

聽聽聽 琚姩灝辨槸寮冩潈錛屼笉鍋氬喅瀹氫篃鏄竴縐嶅喅瀹氥備笅瀹氬喅蹇冿紝姣忎竴浠跺皬浜嬮兘瑕佽〃杈懼嚭鑷繁鐨勬剰瑙侊紝灝辯畻浣犱笉鏄緢鍦ㄤ箮銆備緥濡傦紝鑷繁鍐沖畾鍦ㄩ棣嗙偣浠涔堣彍錛岃嚜宸卞喅瀹氳嚜宸辯殑琛g潃鎵撴壆錛屽懆鏈椂鑷繁鍐沖畾瑕佸幓鍝噷鐜╋紝絳夌瓑銆傝娉曡鑷繁娼滄剰璇嗛噷鐨勨滄垜鎰熻錛屾垜鎯寵鈥濅綋鐜板嚭鏉ワ紝涓嶈琚姩錛屼笉瑕佷粠浼楋紝閬垮厤鐩茬洰鍚粠鐖舵瘝銆佽佸笀銆佸悕浜衡︹?/p>

聽聽聽 縐瀬涓誨姩鐨勪漢鎬繪槸鍦ㄨ█璇腑璧嬩簣鑷繁鍐沖畾鐨勬潈鍒╋紝浠栦滑鍠滄璇寸殑璇濆寘鎷細鈥滆瘯璇曠湅鏈夋病鏈夊叾浠栫殑鍙兘鎬с傗濃滀篃璁告垜鍙互鎹釜鎬濊礬銆傗濃滄垜鍙互鎺у埗鑷繁鐨勬儏緇傗濃滄垜鍙互鎯沖嚭鏇存湁鏁堢殑琛ㄨ揪鏂瑰紡銆傗濃滄垜鐨勬劅瑙夋槸鈥︹︹濃滄垜閫夋嫨鈥︹︹濃滄垜瑕佲︹︹濃滄垜鎯呮効鈥︹︹濃滄垜鎵撶畻鈥︹︹濃滄垜鍐沖畾鈥︹︹濈瓑絳夈傜Н鏋佷富鍔ㄥ湴鎶撲綇鍛借繍涓綘鍙互閫夋嫨銆佸彲浠ユ敼鍙樸佸彲浠ユ渶澶у寲浣犵殑褰卞搷鍔涚殑閮ㄥ垎銆?/p>

聽聽聽 緹庡浗浜哄緢鍠滄灝濊瘯涓嶅悓鐨勫伐浣滐紝浠栦滑涓鐢熶腑騫沖潎瑕佹崲鍥涙宸ヤ綔銆傜粡甯哥粰鑷繁璁劇珛涓浜涙瀬鍏鋒寫鎴樻с佷絾緇濋潪閬ヤ笉鍙強鐨勭洰鏍囥?/p>

聽聽聽 鈥滅瓑寰呯殑鏂規硶鏈変袱縐嶏紝涓縐嶆槸浠涔堜簨涔熶笉鍋氬湴絀虹瓑錛屽彟涓縐嶆槸涓杈圭瓑錛屼竴杈規妸浜嬫儏鍚戝墠鎺ㄥ姩銆傗濆湪鏈洪亣榪樻病鏈夋潵涓存椂錛屽氨搴斾簨浜嬬敤蹇冿紝浜嬩簨灝藉姏銆備竴鏃︽満閬囧埌鏉ワ紝涓瀹氳鍏ㄥ姏浠ヨ蕩錛屾妸鎻℃満閬囥?/p>

聽聽聽 鍦ㄥ叕鍙擱噷錛岀粡甯稿緱鍒版檵鍗囨満浼氱殑浜猴紝澶у鏄兘澶熺Н鏋佹帹閿鍜岃〃杈捐嚜宸辯殑銆佹湁榪涘彇蹇冪殑浜恒傚綋浠栦滑榪樻槸鍏徃鐨勪竴鍚嶆櫘閫氬憳宸ユ椂錛屽彧瑕佸拰鍏徃鍒╃泭鎴栬呭洟闃熷埄鐩婄浉鍏崇殑浜嬫儏錛屼粬浠氨浼氫笉閬椾綑鍔涘湴鍙戣〃鑷繁鐨勮瑙c佽礎鐚嚜宸辯殑涓誨紶錛屽府鍔╁叕鍙稿埗瀹氬拰瀹夋帓宸ヤ綔璁″垝錛涘湪瀹屾垚鏈亴宸ヤ綔鍚庯紝浠栦滑鎬昏兘鍗忓姪鍏朵粬浜哄敖蹇畬鎴愬伐浣滐紱浠栦滑甯稿父榧撳姳鑷繁鍜屽悓浼達紝鎻愰珮鏁翠釜闃熶紞鐨勫+姘旓紱榪欎簺浜烘繪槸浠ヤ簨涓烘湰銆佷互浜嬩負鍏堚斺斾粬浠兘鏄渶縐瀬涓誨姩鐨勪漢銆?/p>

聽聽聽 鍦ㄤ漢鐢熺殑鏃呴斾腑錛屼綘鏄綘鑷繁鎯熶竴鐨勫徃鏈猴紝鍗冧竾涓嶈璁╁埆浜洪┚椹朵綘鐨勭敓鍛戒箣杞︺備綘瑕佺ǔ紼沖湴鍧愬湪鍙告満鐨勪綅緗笂錛屽喅瀹氳嚜宸變綍鏃惰鍋溿佽鍊掕濺銆佽杞集銆佽鍔犻熴佽鍒硅濺絳夌瓑銆傚彧鏈夌Н鏋佷富鍔ㄧ殑浜烘墠鑳藉湪鐬伅涓囧彉鐨勭珵浜夌幆澧冧腑璧㈠緱鎴愬姛錛屽彧鏈夊杽浜庡睍紺鴻嚜宸辯殑浜烘墠鑳藉湪宸ヤ綔涓幏寰楃湡姝g殑鏈轟細銆?/p>

聽聽聽 鈥滀綘浠殑鏃墮棿鏈夐檺錛屾墍浠ヤ笉瑕佹氮璐規椂闂村湪鍒漢鐨勭敓媧婚噷銆備笉瑕佽淇℃潯鎵鎯?鈥?鐩蹭粠淇℃潯鏄椿鍦ㄥ埆浜虹殑鐢熸椿閲屻備笉瑕佽浠諱綍浜虹殑鎰忚娣規病浜嗕綘鍐呭湪鐨勫績澹般傞噸瑕佺殑錛屾嫢鏈夎窡闅忓唴蹇冨拰鐩磋鐨勫媷姘斻備綘鐨勫唴蹇冧笌鐩磋鐭ラ亾浣犵湡姝f兂鎴愪負浠涔堟牱鐨勪漢銆備換浣曞叾浠栦簨鐗╅兘鏄瑕佺殑銆傗濃斺旀柉钂傚か 涔斿竷鏂?錛堣嫻鏋滃叕鍙告昏錛変簬2005騫存柉鍧︾澶у姣曚笟鍏哥ぜ銆?/p>

]]>
鎴戝閲嶆瀯鐨勭悊瑙?(杞?http://www.shnenglu.com/ace/archive/2006/04/28/6412.htmlStone JiangStone JiangFri, 28 Apr 2006 04:34:00 GMThttp://www.shnenglu.com/ace/archive/2006/04/28/6412.htmlhttp://www.shnenglu.com/ace/comments/6412.htmlhttp://www.shnenglu.com/ace/archive/2006/04/28/6412.html#Feedback0http://www.shnenglu.com/ace/comments/commentRss/6412.htmlhttp://www.shnenglu.com/ace/services/trackbacks/6412.htmlFrom: http://www.cnblogs.com/lane_cn/archive/2006/02/05/325782.html

浠涔堟槸閲嶆瀯

閲嶆瀯錛岀敤鏈綆鍗曠殑涓鍙ヨ瘽璇達細灝辨槸瑕佸湪涓嶆敼鍙樼郴緇熷姛鑳界殑鎯呭喌涓嬶紝瀵圭郴緇熺殑鍐呴儴緇撴瀯榪涜閲嶆柊璋冩暣銆傞噸鏋勭殑鏈鐩存帴鐩殑鍦ㄤ簬鏀硅繘杞歡緋葷粺鐨勫唴閮ㄦ灦鏋勩備竴涓ソ鐨勭粨鏋勫彲浠ユ洿鍔犻傚簲浜庨渶姹傜殑鍙樺寲錛屾洿濂界殑婊¤凍瀹㈡埛鐨勯渶姹傦紝鏈澶ч檺搴︾殑寤墮暱杞歡緋葷粺鐨勭敓鍛藉懆鏈熴?br />
涓轟粈涔堣閲嶆瀯

鍦ㄤ笉鏀瑰彉緋葷粺鍔熻兘鐨勬儏鍐典笅錛屾敼鍙樼郴緇熺殑瀹炵幇鏂瑰紡銆備負浠涔堣榪欎箞鍋氾紵鎶曞叆綺懼姏涓嶇敤鏉ユ弧瓚沖鎴峰叧蹇冪殑闇姹傦紝鑰屾槸浠呬粎鏀瑰彉浜嗚蔣浠剁殑瀹炵幇鏂瑰紡錛岃繖鏄惁鏄湪嫻垂瀹㈡埛鐨勬姇璧勫憿錛?br />
閲嶆瀯鐨勯噸瑕佹ц浠庤蔣浠剁殑鐢熷懡鍛ㄦ湡璇磋搗銆傝蔣浠朵笉鍚屼笌鏅氱殑浜у搧錛屼粬鏄竴縐嶆櫤鍔涗駭鍝侊紝娌℃湁鍏蜂綋鐨勭墿鐞嗗艦鎬併備竴涓蔣浠朵笉鍙兘鍙戠敓鐗╃悊鎹熻楋紝鐣岄潰涓婄殑鎸夐挳姘歌繙涓嶄細鍥犱負鎸夊姩嬈℃暟澶鑰屽彂鐢熸帴瑙︿笉鑹傞偅涔堜負浠涔堜竴涓蔣浠跺埗閫犲嚭鏉ヤ互鍚庯紝鍗翠笉鑳芥案榪滀嬌鐢ㄤ笅鍘誨憿錛?br />
瀵硅蔣浠剁殑鐢熷懡閫犳垚濞佽儊鐨勫洜绱犲彧鏈変竴涓細闇姹傜殑鍙樻洿銆備竴涓蔣浠舵繪槸涓鴻В鍐蟲煇縐嶇壒瀹氱殑闇姹傝屼駭鐢燂紝鏃朵唬鍦ㄥ彂灞曪紝瀹㈡埛鐨勪笟鍔′篃鍦ㄥ彂鐢熷彉鍖栥傛湁鐨勯渶姹傜浉瀵圭ǔ瀹氫竴浜涳紝鏈夌殑闇姹傚彉鍖栫殑姣旇緝鍓х儓錛岃繕鏈夌殑闇姹傚凡緇忔秷澶變簡錛屾垨鑰呰漿鍖栨垚浜嗗埆鐨勯渶姹傘傚湪榪欑鎯呭喌涓嬶紝杞歡蹇呴』鐩稿簲鐨勬敼鍙樸?br />
鑰冭檻鍒版垚鏈拰鏃墮棿絳夊洜绱狅紝褰撶劧涓嶆槸鎵鏈夌殑闇姹傚彉鍖栭兘瑕佸湪杞歡緋葷粺涓疄鐜般備絾鏄葷殑璇存潵錛岃蔣浠惰閫傚簲闇姹傜殑鍙樺寲錛屼互淇濇寔鑷繁鐨勭敓鍛藉姏銆?br />
榪欏氨浜х敓浜嗕竴縐嶇碂緋曠殑鐜拌薄錛氳蔣浠朵駭鍝佹渶鍒濆埗閫犲嚭鏉ワ紝鏄粡榪囩簿蹇冪殑璁捐錛屽叿鏈夎壇濂芥灦鏋勭殑銆備絾鏄殢鐫鏃墮棿鐨勫彂灞曘侀渶姹傜殑鍙樺寲錛屽繀欏諱笉鏂殑淇敼鍘熸湁鐨勫姛鑳姐佽拷鍔犳柊鐨勫姛鑳斤紝榪樺厤涓嶄簡鏈変竴浜涚己闄烽渶瑕佷慨鏀廣備負浜嗗疄鐜板彉鏇達紝涓嶅彲閬垮厤鐨勮榪濆弽鏈鍒濈殑璁捐鏋勬灦銆傜粡榪囦竴孌墊椂闂翠互鍚庯紝杞歡鐨勬灦鏋勫氨鍗冪柈鐧懼瓟浜嗐俠ug瓚婃潵瓚婂錛岃秺鏉ヨ秺闅劇淮鎶わ紝鏂扮殑闇姹傝秺鏉ヨ秺闅懼疄鐜幫紝杞歡鐨勬瀯鏋跺鏂扮殑闇姹傛笎娓愮殑澶卞幓鏀寔鑳藉姏錛岃屾槸鎴愪負涓縐嶅埗綰︺傛渶鍚庢柊闇姹傜殑寮鍙戞垚鏈細瓚呰繃寮鍙戜竴涓柊鐨勮蔣浠剁殑鎴愭湰錛岃繖灝辨槸榪欎釜杞歡緋葷粺鐨勭敓鍛借蛋鍒板敖澶寸殑鏃跺欍?br />
閲嶆瀯灝辮兘澶熸渶澶ч檺搴︾殑閬垮厤榪欐牱涓縐嶇幇璞°傜郴緇熷彂灞曞埌涓瀹氶樁孌靛悗錛屼嬌鐢ㄩ噸鏋勭殑鏂瑰紡錛屼笉鏀瑰彉緋葷粺鐨勫閮ㄥ姛鑳斤紝鍙鍐呴儴鐨勭粨鏋勮繘琛岄噸鏂扮殑鏁寸悊銆傞氳繃閲嶆瀯錛屼笉鏂殑璋冩暣緋葷粺鐨勭粨鏋勶紝浣跨郴緇熷浜庨渶姹傜殑鍙樻洿濮嬬粓鍏鋒湁杈冨己鐨勯傚簲鑳藉姏銆?br />
鎷掔粷鍙樺寲 VS 鎷ユ姳鍙樺寲

鎸夌収浼犵粺鐨勮蔣浠惰璁℃柟寮忥紝杞歡鐨勭敓浜у垎涓洪渶姹傝皟鏌ャ佹瑕佽璁°佽緇嗚璁°佺紪鐮併佸崟浣撴祴璇曘佽仈鍚堟祴璇曘佺幇鍦洪儴緗插嚑涓樁孌點傝櫧璇磋繖鍑犱釜闃舵鏄彲浠ヤ簰鐩告笚閫忥紝浣嗘槸鎬葷殑鏉ヨ鏄湁涓瀹氭搴忕殑錛屽墠涓涓樁孌電殑宸ヤ綔鏄悗涓涓樁孌靛伐浣滅殑鍩虹銆傝繖灝卞悜涓嬮潰榪欐牱涓縐峍褰㈢殑妯″紡錛?br />
vdevelope.GIF

寰涓嬬殑鏂瑰悜灝嗙郴緇熻繘琛屽垎瑙o紝寰涓婄殑鏂瑰悜灝嗙郴緇熻繘琛屾暣鍚堛傝繖鏍風殑寮鍙戝艦寮忓皢杞歡寮鍙戝垎涓鴻璁″墠鍜岃璁″悗涓や釜闃舵錛屽紑鍙戣繃紼嬩腑瀛樺湪涓涓噸瑕佺殑鈥滈噷紼嬬鈥濃斺旇璁¤鏄庝功鐨勩傚湪璁捐璇存槑涔﹀畬鎴愬墠錛屽伐紼嬪浜庘滆璁♀濋樁孌碉紝鑰屽湪璁捐璇存槑涔﹀畬鎴愪箣鍚庯紝宸ョ▼鍒欒繘鍏モ滃疄鏂解濋樁孌點備竴鏃﹀埌浜嗗疄鏂介樁孌碉紝浠諱綍闇姹傛垨鑰呰璁′笂鐨勫彉鏇撮兘鏄潪甯稿洶闅劇殑錛岄渶瑕佽姳璐瑰ぇ閲忕殑鎴愭湰銆傞氬父涓轟簡淇濊瘉宸ョ▼鐨勯『鍒╁疄鏂斤紝寮鍙戜漢鍛樺父鏈夎繖鏍蜂竴縐嶅啿鍔細鎸変綇瀹㈡埛鐨勬墜錛屽湪闇姹傝鏄庝功涓婄瀛椼傚茍涓斿憡璇夊鎴鳳細鈥滀粠浠婂ぉ寮濮嬶紝浠諱綍闇姹傚彉鏇撮兘瑕佸仠姝紝鐩村埌鎴戜滑鎶婄幇鍦ㄨ繖涓笢瑗垮仛瀹屻傗濊繖鏄竴縐嶆嫆緇濆彉鍖栫殑寮鍙戞柟寮忋?br />
杞歡緋葷粺瑕佷繚鎸佷笌浼佷笟鐨勭洰鏍囦竴鑷淬傛椂浠e湪鍙戝睍錛屼漢浠殑瑕佹眰鍦ㄤ笉鏂殑鎻愰珮錛屽鎴風殑涓氬姟鍦ㄤ笉鏂殑鍙戝睍銆傚湪榪欑鎯呭喌涓嬶紝浼犵粺鐨勫厛璁捐銆佸啀鏂藉伐鐨刅褰㈠紡宸茬粡涓嶈兘閫傚簲鏃ョ泭澶嶆潅鐨勪笟鍔¢渶瑕併傝蔣浠跺伐紼嬮愭笎婕斿寲鎴愪笅闈㈣繖鏍風殑榪囩▼錛?br />
sdevelope.GIF

璇存槑涓涓嬶細
1銆佽蔣浠跺紑鍙戠殑鐩爣瑕佷笌浼佷笟鐩爣淇濇寔涓鑷達紝涓涓紑鍙戝懆鏈熶笉瀹滄椂闂磋繃闀匡紝涓鑸帶鍒跺湪鍗婂勾鍒頒竴騫淬傜郴緇熼儴緗插悗錛屽茍涓嶆剰鍛崇潃寮鍙戝伐浣滅粨鏉熶簡錛岃屾槸榪涘叆浜嗕笅涓涓懆鏈熴?br />
2銆佸伐紼嬩互寰幆榪唬鐨勬柟寮忓墠榪涳紝榪欏茍涓嶆剰鍛寵交瑙嗕簡璁捐錛屼笉鏄鎼炶竟璋冪爺銆佽竟璁捐銆佽竟鏂藉伐鐨勨滀笁杈光濆伐紼嬶紝鐩稿弽錛屾槸鏇村姞閲嶈璁捐鐨勫湴浣嶃傝蔣浠跺紑鍙戠殑鍏ㄨ繃紼嬮兘闇瑕佽璁★紝杞歡寮鍙戞槸鈥滄寔緇璁♀濈殑榪囩▼銆傚悓鏃訛紝璁捐宸ヤ綔涔熶笉鍙槸綆鍗曡繃紼嬪垎瑙c佷換鍔″垎閰嶏紝鑰屾槸姒傚康璁捐銆侀昏緫璁捐銆佺墿鐞嗚璁$瓑鍚勪釜鏂歸潰浜掔浉浜ょ粐銆侀綈澶村茍榪涖?br />
浼犵粺鐨勮蔣浠跺紑鍙戞柟寮忎嬌鐢ㄤ竴縐嶉潪甯哥悊鎯沖寲鐨勬祦紼嬧斺斿厛涓庡鎴瘋璁洪」鐩殑鑼冨洿錛岀‘瀹氬摢浜涢渶瑕佸仛錛屽摢浜涗笉闇瑕佸仛錛岀劧鍚庤鍒掍竴涓畬緹庣殑璁捐錛屼笉浠呭彲浠ユ弧瓚崇幇鍦ㄧ殑闇姹傦紝榪樿兘寰堝ソ鐨勯傚簲鏈潵鐨勯渶姹傦紝璁捐瀹屾垚鍚庡紑濮嬬紪鐮侊紝鐒跺悗嫻嬭瘯緇勮錛岄佸埌鐜板満瀹夎璋冭瘯榪愯銆傝繖涓緋誨垪榪囩▼灝辯被浼間笌鍙戝皠涓棰楃偖寮癸紝棣栧厛瑕佹壘鍒扮洰鏍囷紝鐒跺悗鏍規嵁鍦板艦銆侀鍔涖佺洰鏍囩殑浣嶇疆銆佺Щ鍔ㄩ熷害絳夊悇縐嶅洜绱狅紝璁$畻鎻愬墠閲忋佺偖寮瑰彂灝勭殑瑙掑害錛岃綆楀嚭涓涓姏鐗╃嚎杞ㄩ亾錛屾渶鍚庡湪鍚堥傜殑鏃墮棿鎶婄偖寮瑰彂灝勫嚭鍘匯傝繖涓鍒囬兘絎﹀悎鏈姝g‘鐨勭墿鐞嗗畾寰嬶紝涓鍒囬兘鍚搗鏉ュ緢鐞嗘兂銆傚鏋滄病鏈夋剰澶栨潯浠訛紝褰撶劧鏄彲浠ュ嚮涓洰鏍囩殑銆備絾鏄偖寮逛竴鏃﹀彂灝勫嚭鍘伙紝涓鍒囧氨澶卞幓浜嗘帶鍒訛紝浠諱綍鐜鐨勫彉鍖栭兘浼氶犳垚鍋忕鐩爣銆傚挨鍏舵槸瀵逛簬涓涓繍鍔ㄧ殑鐩爣鏉ヨ錛岃綆楄繃紼嬪崄鍒嗗鏉傦紝寰堝鎯呭喌涓嬪彧鑳介潬浜轟及璁°傚浜庝笉瑙勫垯鐨勮繍鍔ㄧ洰鏍囧彧鑳界紕拌繍姘斻傝繖鏍風殑鏂瑰紡錛屽懡涓巼鏄緢浣庣殑銆?br />
鏂扮殑杞歡寮鍙戣繃紼嬩笉榪芥眰瀹岀編鐨勩侀暱鏈熺殑銆佺悊鎯崇殑璁″垝錛屾洿鍔犻噸瑙嗗疄闄呮儏鍐碉紝閲嶈闇姹傜殑鍙樺寲錛屾彁鍊¢噰鐢ㄧ煭鏈熺殑璁″垝銆傝繖鏄竴縐嶆嫢鎶卞彉鍖栫殑榪囩▼銆傚氨璞℃槸鍦ㄧ偖寮逛笂瀹夎浜嗕竴涓弽棣堣緗紝閿佸畾鐩爣鍚庯紝紜繚澶ф柟鍚戠殑姝g‘錛岀劧鍚庡氨灝嗙偖寮瑰彂灝勫嚭鍘匯傜偖寮瑰湪榪愯榪囩▼涓笉鏂殑灝嗙洰鏍囦綅緗亸縐婚噺杈撳叆鍙嶉鐢佃礬錛屾牴鎹弽棣堣緭鍑鴻皟鏁磋嚜宸辯殑榪愯璺嚎錛屾棤闄愮殑閫艱繎鐩爣銆傝繖鏍鳳紝鐐脊灝辨嫢鏈変簡鍒跺鑳藉姏錛屽懡涓巼澶уぇ澧炲姞銆?br />
閲嶆瀯灝卞彲浠ュ鍔犲伐紼嬬殑璋冩暣鑳藉姏錛屼粬鍙互鎶婁駭鍝佸洖澶嶅埌涓涓ǔ瀹氱殑鐘舵侊紝鍙互鍩轟簬榪欎釜鐘舵佽揪鍒頒笅涓涓洰鏍囥傚姝ゅ弽澶嶅墠榪涳紝鏇村ソ鐨勬弧瓚沖鎴風殑闇姹傘?br />
淇濇寔鍏煎鎬?br />
閲嶆瀯鐨勭洰鐨勫湪浜庢敼鍙樼郴緇熺殑瀹炵幇鏂瑰紡錛岃屼笉鏀瑰彉鍘熸湁鐨勫姛鑳姐傝繖涓繃紼嬩腑錛屽垽鏂吋瀹規у氨鍗佸垎鐨勯噸瑕併備竴涓瓙緋葷粺銆佹ā鍧椼佺被銆佸嚱鏁版槸鍚︿笌鍗囩駭鍓嶄繚鎸佸吋瀹癸紝濡備綍鍒ゆ柇榪欎釜鍏煎鎬э紝濡備綍淇濇寔榪欎釜鍏煎鎬э紝榪欏叧緋誨埌閲嶆瀯鐨勬垚鏈拰閲嶆瀯鐨勫彲鑳芥с?br />
紼嬪簭鍛樺涔犲啓紼嬪簭浠g爜鏃訛紝浼氬彂鐜伴殢鐫紼嬪簭浠g爜鎰堟潵鎰堝錛岃澶氱殑紼嬪簭浠g爜涓嶆柇閲嶅鍑虹幇鍜岃浣跨敤錛屽洜姝ゅ緢鑷劧鐨勫紑濮嬩嬌鐢ㄤ緥紼嬨佸瓙紼嬪簭鎴栨槸榪囩▼銆佸嚱鏁扮瓑鏈哄埗甯姪鎴戜滑榪涜紼嬪簭浠g爜鏁寸悊鐨勫伐浣溿備簬鏄緢鑷劧鐨勶紝瀛椾綋鐨勫垎鏋愭柟寮忔紨鍖栨垚榪欎釜鏍峰瓙錛氬皢瀹㈡埛鐨勯渶姹傝繃紼嬭繘琛屽垎瑙o紝涓姝ヤ竴姝ョ殑鍒嗚В錛岀洿鍒板彲浠ョ洿鎺ョ殑瀹炵幇浠栥傝繖灝辨槸闈㈠悜榪囩▼鐨勫垎鏋愭柟寮忋?br />
闈㈠悜榪囩▼鐨勫垎鏋愭柟寮忓鍙樺寲鐨勮兘鍔涙槸寰堝急鐨勩備負浠涔堝憿錛熷洜涓洪潰鍚戣繃紼嬬殑鍒嗘瀽鏂瑰紡寰堝鏄撻犳垚涓縐嶅懼悜鈥斺斾笉鍖哄垎琛屽姩鐨勪富浣撱備竴涓繃紼嬫槸娌℃湁涓諱綋鐨勶紝浠栦笉鏄湪涓鴻嚜宸卞伐浣滐紝鑰屾槸鍦ㄤ負鈥滃埆浜衡濆伐浣溿傚綋鎴戜滑淇敼浜嗕竴涓繃紼嬩箣鍚庯紝鎴戜滑寰堥毦鍒ゆ柇榪欎釜榪囩▼鏄惁淇濇寔鍚戝悗鍏煎錛屽叾浠栬繃紼嬩細涓嶄細鍙楀埌褰卞搷銆傚洜涓鴻繖涓繃紼嬪澶栫晫鏈夋剰涔夌殑涓嶄粎鏄粬鐨勮緭鍏ュ拰杈撳嚭錛岃繕鍖呮嫭姣忎竴姝ヨ繃紼嬶紝姣忎竴姝ヨ繃紼嬮兘鍙兘鍚湁涓涓潪甯擱殣璁崇殑涓氬姟鎰忎箟錛屽澶栫晫浜х敓褰卞搷銆?br />
鍥犳錛屼慨鏀逛竴涓繃紼嬫槸闈炲父鍥伴毦鐨勶紝閫氬父鍗囩駭涓涓潰鍚戣繃紼嬬殑緋葷粺錛屽彲浠ラ噰鐢ㄤ袱縐嶆柟寮忥細
1銆佸啓鏂扮殑榪囩▼錛?br />2銆佸湪鍘熸湁鐨勮繃紼嬩笂鍔犲紑鍏沖弬鏁般?br />
闄ゆ浠ュ鐨勫崌綰у姙娉曢兘寰堥毦淇濊瘉鍘熻繃紼嬪拰鏂拌繃紼嬬殑鍏煎鎬э紝瀹規槗閫犳垚閿欒銆?br />
涓轟簡鏇村ソ鐨勪繚璇佸崌綰у悗妯″潡鐨勫吋瀹規э紝搴旇閲囩敤闈㈠悜瀵硅薄鐨勫垎鏋愭柟寮忋傛寜鐓ц繖鏍風殑鍒嗘瀽鏂瑰紡錛屼竴涓璞′負鈥滆嚜宸扁濆伐浣滐紝浠栨湁瀹屾暣鐨勩佺嫭绔嬬殑涓氬姟鍚箟銆傚璞′箣闂撮氳繃鎺ュ彛鍙戠敓鑱旂郴錛屼竴涓璞″澶栫晫鏈夊獎鍝嶇殑閮ㄥ垎鍙湁鎺ュ彛錛岃嚦浜庝粬鍋氫粈涔堛佸浣曞仛銆佸仛鐨勫涓嶅錛屽垯涓嶆槸澶栫晫闇瑕佸叧蹇冪殑浜嬫儏銆?br />
鍒ゆ柇涓涓帴鍙e崌綰у悗鏄惁淇濇寔鍏煎鎬у氨鏄竴浠舵瘮杈冨鏄撶殑浜嬫儏浜嗐傛垜浠彲浠ュ垽鏂帴鍙g殑杈撳叆杈撳嚭鏄惁絎﹀悎涓嬮潰涓ゆ潯瑙勫垯錛?br />1銆佸崌綰у悗鐨勮緭鍏ユ槸鍗囩駭鍓嶇殑杈撳叆鐨勮秴綰э紱
2銆佸崌綰у悗鐨勮緭鍑烘槸鍗囩駭鍓嶇殑杈撳嚭鐨勫瓙闆嗐?br />
鍙絎﹀悎榪欎袱鐐癸紝浠栧氨浠嶇劧鍙互鍦ㄧ郴緇熶腑榪愯錛屼笉浼氬鍏朵粬瀵硅薄閫犳垚鍗卞銆傚湪瀹為檯鐨勫伐紼嬩腑錛屽垽鏂繖涓吋瀹規ф湁涓涓洿濂界殑鍔炴硶錛?strong>鑷姩鍖栫殑鍗曞厓嫻嬭瘯銆?br />
鍦ㄩ噸鏋勭殑榪囩▼涓紝鑷姩鍖栫殑鍗曞厓嫻嬭瘯鏄潪甯稿ソ鐨勪繚闅溿傞噰鐢ㄨ嚜鍔ㄥ寲鐨勫崟鍏冩祴璇曪紝涓嶆柇榪愯嫻嬭瘯錛屽彲浠ヤ繚璇佺郴緇熺殑緇撴瀯鏀瑰彉鐨勮繃紼嬩腑錛屼笟鍔¤涓轟笉鍙戠敓鏀瑰彉銆?img height="1" src="http://www.cnitblog.com/martin/aggbug/9810.html" width="1" />



]]>涓灝佲滃彂椋欌濋偖浠剁殑浼犳挱璺緞 (杞?http://www.shnenglu.com/ace/archive/2006/04/27/6359.htmlStone JiangStone JiangThu, 27 Apr 2006 01:12:00 GMThttp://www.shnenglu.com/ace/archive/2006/04/27/6359.htmlhttp://www.shnenglu.com/ace/comments/6359.htmlhttp://www.shnenglu.com/ace/archive/2006/04/27/6359.html#Feedback0http://www.shnenglu.com/ace/comments/commentRss/6359.htmlhttp://www.shnenglu.com/ace/services/trackbacks/6359.html闃呰鍏ㄦ枃

]]>
紜洏瀹夎Fedora Core 4 鍏ㄨ繃紼嬶紙WinXp+ FC4錛?杞?http://www.shnenglu.com/ace/archive/2006/04/25/6248.htmlStone JiangStone JiangTue, 25 Apr 2006 08:27:00 GMThttp://www.shnenglu.com/ace/archive/2006/04/25/6248.htmlhttp://www.shnenglu.com/ace/comments/6248.htmlhttp://www.shnenglu.com/ace/archive/2006/04/25/6248.html#Feedback0http://www.shnenglu.com/ace/comments/commentRss/6248.htmlhttp://www.shnenglu.com/ace/services/trackbacks/6248.html 紜洏瀹夎Fedora Core 4 鍏ㄨ繃紼嬶紙WinXp+ FC4錛?

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>



]]>
杈撲簡榪欏洓騫翠綘灝辮緭浜嗕竴鐢? (杞?http://www.shnenglu.com/ace/archive/2006/04/25/6238.htmlStone JiangStone JiangTue, 25 Apr 2006 05:00:00 GMThttp://www.shnenglu.com/ace/archive/2006/04/25/6238.htmlhttp://www.shnenglu.com/ace/comments/6238.htmlhttp://www.shnenglu.com/ace/archive/2006/04/25/6238.html#Feedback0http://www.shnenglu.com/ace/comments/commentRss/6238.htmlhttp://www.shnenglu.com/ace/services/trackbacks/6238.html 聽杈撲簡榪欏洓騫翠綘灝辮緭浜嗕竴鐢?/a>

浜庡璁$畻鏈烘垨鑰呬粠浜嬭繖鏂歸潰宸ヤ綔鐨勬湅鍙?
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



]]>
STL涓璵ap涓巋ash_map瀹瑰櫒鐨勯夋嫨 (杞?http://www.shnenglu.com/ace/archive/2006/04/25/6223.htmlStone JiangStone JiangTue, 25 Apr 2006 01:25:00 GMThttp://www.shnenglu.com/ace/archive/2006/04/25/6223.htmlhttp://www.shnenglu.com/ace/comments/6223.htmlhttp://www.shnenglu.com/ace/archive/2006/04/25/6223.html#Feedback0http://www.shnenglu.com/ace/comments/commentRss/6223.htmlhttp://www.shnenglu.com/ace/services/trackbacks/6223.html STL涓璵ap涓巋ash_map瀹瑰櫒鐨勯夋嫨


]]>
宸х敤铏氬弸鍏冨嚱鏁?鍘熷垱)http://www.shnenglu.com/ace/archive/2006/04/17/5796.htmlStone JiangStone JiangMon, 17 Apr 2006 14:12:00 GMThttp://www.shnenglu.com/ace/archive/2006/04/17/5796.htmlhttp://www.shnenglu.com/ace/comments/5796.htmlhttp://www.shnenglu.com/ace/archive/2006/04/17/5796.html#Feedback3http://www.shnenglu.com/ace/comments/commentRss/5796.htmlhttp://www.shnenglu.com/ace/services/trackbacks/5796.html鐖剁被鐨勫弸鍏冧笉浼氳嚜鍔ㄦ垚涓哄瓙綾葷殑鍙嬪厓錛涜屼笖鍙嬪厓浼氱牬鍧忓皝瑁咃紱C++鐨勮鏂逛笉鍏佽錛堥潪鎴愬憳錛夊弸鍏冨嚱鏁頒負铏氬嚱鏁般?br />浣嗘槸錛屾煇浜涙椂鍊欙紝蹇呴』閫氳繃鍙嬪厓鎵嶈兘瀹炵幇涓浜涙搷浣滅閲嶈澆錛屽operator<<()錛涘鏋滀負姣忎釜瀛愮被閮藉疄鐜皁perator<<()鍊掓槸涓涓彲琛岀殑鏂規硶錛屼絾鏄樉寰楀緢鍟板棪銆?br />
濡傛灉鑳芥妸鍙嬪厓瀹氫箟涓鴻櫄鍑芥暟錛屽垯瀛愮被鍙互緇ф壙璇ュ弸鍏冪殑鎺ュ彛鑰屾棤闇閲嶅澹版槑鍙嬪ソ閭h澶氬ソ鍟婏紵
鏈枃鍒欓氳繃涓縐嶅彉閫氱殑鏂規硶宸у杈懼埌铏氬嚱鏁扮殑鏁堟灉銆?br />
//鍩虹被 Base.



#pragma聽once
#include聽
< iostream >
using namespace 聽std;
class 聽Base
{
public :
聽聽Base(
void );
聽聽
~ Base( void );
public :
聽聽
virtual void 聽print(ostream & 聽output)聽 = 0 ;
聽聽friend聽ostream
& operator << (ostream & 聽output,Base & 聽obj);
private :
聽聽
char * 聽name_;
聽聽
int 聽age_;
}
;

鍩虹被鐨勫疄鐜?base.cpp
#include聽"StdAfx.h"
#include聽
".\base.h"

Base::Base(
void)
{
聽聽name_聽
="This聽is聽data1";
聽聽age_聽
=18;
}


Base::
~Base(void)
{
}


void聽Base::print(ostream&聽output)
{
聽聽output
<<"name聽=聽"<<name_<<endl;
聽聽output
<<"age聽=聽"<<age_<<endl;
}


ostream
&operator<<(ostream&聽output,Base&聽obj)
{
聽聽obj.print(output);
聽聽
return聽output;
}


媧劇敓綾葷殑 Derived.h

#pragma聽once
#include聽
"Base.h"
class聽Derived聽:public聽Base
{
public:
聽聽Derived(
int聽score聽=80);
聽聽
~Derived(void);
聽聽
virtualvoid聽print(ostream&聽output);
private:
聽聽
int聽score_;
}
;

媧劇敓綾葷殑瀹炵幇 Derived.cpp
#include聽"StdAfx.h"
#include聽
".\derived.h"

Derived::Derived(
int聽score):score_(score)
{
聽聽
}


Derived::
~Derived(void)
{
}


void聽Derived::print(ostream&聽output)
{
聽聽Base::print(output);
聽聽output
<<"score聽=聽"<<score_<<endl;
}


涓葷▼搴弇ain.cpp
//聽Test_VirtualFirendFunction.cpp聽:聽Defines聽the聽entry聽point聽for聽the聽console聽application.
//

#include聽
"stdafx.h"
#include聽
<iostream>
#include聽
"Derived.h"
usingnamespace聽std;
int聽_tmain(int聽argc,聽_TCHAR*聽argv[])
{
聽聽Derived聽聽d;

聽聽Derived聽聽d2(
90);
聽聽cout
<<d<<endl<<d2<<endl;
聽聽聽聽
return0;
}



灞忓箷杈撳叆緇撴灉
name聽=聽This聽is聽data1
age聽=聽18
score聽=聽80

name聽=聽This聽is聽data1
age聽=聽18
score聽=聽90

緇撴灉錛?br />浠諱綍浠嶣ase媧劇敓綾葷殑錛岄兘鍙互鍒╃敤cout<<obj鐨勬満鍒墮氳繃嫻佽繘琛岃緭鍑恒?br />
鍚屾牱閬撶悊錛屼篃鍙互鍒╃敤姝ゆ柟娉曞疄鐜癆CE_InputCDR聽聽/ ACE_OutputCDR瀵圭綉緇滄搷浣滃簭鍒楀寲鎿嶄綔銆?br />(鏈枃涔熸槸鍥炵瓟鏌愮綉鍙嬪叧浜庢淳鐢熺被涓嶈兘閲嶈澆鐨勯棶棰樼殑鍥炲)



]]>
C++椋庢牸鐨勭被鍨嬭漿鎹㈢殑鐢ㄦ硶 (杞?http://www.shnenglu.com/ace/archive/2006/04/16/5641.htmlStone JiangStone JiangSun, 16 Apr 2006 06:21:00 GMThttp://www.shnenglu.com/ace/archive/2006/04/16/5641.htmlhttp://www.shnenglu.com/ace/comments/5641.htmlhttp://www.shnenglu.com/ace/archive/2006/04/16/5641.html#Feedback1http://www.shnenglu.com/ace/comments/commentRss/5641.htmlhttp://www.shnenglu.com/ace/services/trackbacks/5641.html C++椋庢牸鐨勭被鍨嬭漿鎹㈢殑鐢ㄦ硶
榪欐槸More聽Effecitve聽C++閲岀殑絎簩鏉″綾誨瀷杞崲璁茬殑寰堝ソ錛屼篃寰堝熀紜濂芥噦銆?br />Item聽M2錛氬敖閲忎嬌鐢–++椋庢牸鐨勭被鍨嬭漿鎹?br />浠旂粏鎯蟲兂鍦頒綅鍗戣幢鐨勭被鍨嬭漿鎹㈠姛鑳斤紙cast錛夛紝鍏跺湪紼嬪簭璁捐涓殑鍦頒綅灝辮薄goto璇彞涓鏍蜂護浜洪剻瑙嗐備絾鏄畠榪樹笉鏄棤娉曚護浜哄繊鍙楋紝鍥犱負褰撳湪鏌愪簺绱ц鐨勫叧澶達紝綾誨瀷杞崲榪樻槸蹇呴渶鐨勶紝榪欐椂瀹冩槸涓涓繀闇鍝併?br />涓嶈繃C椋庢牸鐨勭被鍨嬭漿鎹㈠茍涓嶄唬琛ㄦ墍鏈夌殑綾誨瀷杞崲鍔熻兘銆?br />涓 鏉ュ畠浠繃浜庣矖椴侊紝鑳藉厑璁鎬綘鍦ㄤ換浣曠被鍨嬩箣闂磋繘琛岃漿鎹€備笉榪囧鏋滆榪涜鏇寸簿紜殑綾誨瀷杞崲錛岃繖浼氭槸涓涓紭鐐廣傚湪榪欎簺綾誨瀷杞崲涓瓨鍦ㄧ潃宸ㄥぇ鐨勪笉鍚岋紝渚嬪鎶婁竴涓寚鍚? 聽const瀵硅薄鐨勬寚閽堬紙pointer-to-const-object錛夎漿鎹㈡垚鎸囧悜闈瀋onst瀵硅薄鐨勬寚閽堬紙pointer-to-non -const聽-object錛?鍗充竴涓粎浠呭幓闄onst鐨勭被鍨嬭漿鎹?錛屾妸涓涓寚鍚戝熀綾葷殑鎸囬拡杞崲鎴愭寚鍚戝瓙綾葷殑鎸囬拡錛堝嵆瀹屽叏鏀瑰彉瀵硅薄綾誨瀷錛夈? 浼犵粺鐨凜椋庢牸鐨勭被鍨嬭漿鎹笉瀵逛笂榪頒袱縐嶈漿鎹㈣繘琛屽尯鍒嗐傦紙榪欎竴鐐逛篃涓嶄護浜烘儕璁訛紝鍥犱負C椋庢牸鐨勭被鍨嬭漿鎹㈡槸涓篊璇█璁捐鐨勶紝鑰屼笉鏄負C++璇█璁捐鐨勶級銆?br />浜? 鏉椋庢牸鐨勭被鍨嬭漿鎹㈠湪紼嬪簭璇彞涓毦浠ヨ瘑鍒傚湪璇硶涓婏紝綾誨瀷杞崲鐢卞渾鎷彿鍜屾爣璇嗙緇勬垚錛岃岃繖浜涘彲浠ョ敤鍦–錛嬶紜涓殑浠諱綍鍦版柟銆傝繖浣垮緱鍥炵瓟璞¤繖鏍蜂竴涓渶鍩烘湰鐨勬湁 鍏崇被鍨嬭漿鎹㈢殑闂鍙樺緱寰堝洶闅撅細鈥滃湪榪欎釜紼嬪簭涓槸鍚︿嬌鐢ㄤ簡綾誨瀷杞崲錛熲濄傝繖鏄洜涓轟漢宸ラ槄璇誨緢鍙兘蹇界暐浜嗙被鍨嬭漿鎹㈢殑璇彞錛岃屽埄鐢ㄨ薄grep鐨勫伐鍏風▼搴忎篃涓嶈兘浠? 璇彞鏋勬垚涓婂尯鍒嗗嚭瀹冧滑鏉ャ?br />C++閫氳繃寮曡繘鍥涗釜鏂扮殑綾誨瀷杞崲鎿嶄綔絎﹀厠鏈嶄簡C椋庢牸綾誨瀷杞崲鐨勭己鐐癸紝榪欏洓涓搷浣滅鏄?聽 static_cast,聽const_cast,聽dynamic_cast,聽鍜宺einterpret_cast銆? 鍦ㄥぇ澶氭暟鎯呭喌涓嬶紝瀵逛簬榪欎簺鎿嶄綔絎︿綘鍙渶瑕佺煡閬撳師鏉ヤ綘涔犳儻浜庤繖鏍峰啓錛?br />(type)聽expression
鑰岀幇鍦ㄤ綘鎬誨簲璇ヨ繖鏍峰啓錛?br />static_cast
< type > (expression)
渚嬪錛屽亣璁句綘鎯蟲妸涓涓猧nt杞崲鎴恉ouble錛屼互渚胯鍖呭惈int綾誨瀷鍙橀噺鐨勮〃杈懼紡浜х敓鍑烘誕鐐規暟鍊肩殑緇撴灉銆傚鏋滅敤C椋庢牸鐨勭被鍨嬭漿鎹紝浣犺兘榪欐牱鍐欙細
int聽firstNumber,聽secondNumber;

double聽result聽=聽((double)firstNumber)/secondNumber錛?br />濡傛灉鐢ㄤ笂榪版柊鐨勭被鍨嬭漿鎹㈡柟娉曪紝浣犲簲璇ヨ繖鏍峰啓錛?br />double聽result聽=聽static_cast
< double > (firstNumber)/secondNumber;
榪欐牱鐨勭被鍨嬭漿鎹笉璁烘槸瀵逛漢宸ヨ繕鏄紼嬪簭閮藉緢瀹規槗璇嗗埆銆?br />static_cast聽 鍦ㄥ姛鑳戒笂鍩烘湰涓婁笌C椋庢牸鐨勭被鍨嬭漿鎹竴鏍峰己澶э紝鍚箟涔熶竴鏍楓傚畠涔熸湁鍔熻兘涓婇檺鍒躲備緥濡傦紝浣犱笉鑳界敤static_cast璞$敤C椋庢牸鐨勭被鍨嬭漿鎹竴鏍鋒妸 聽struct杞崲鎴恑nt綾誨瀷鎴栬呮妸double綾誨瀷杞崲鎴愭寚閽堢被鍨嬶紝鍙﹀錛宻tatic_cast涓嶈兘浠庤〃杈懼紡涓幓闄onst灞炴э紝鍥犱負 鍙︿竴涓柊鐨勭被鍨嬭漿鎹㈡搷浣滅const_cast鏈夎繖鏍風殑鍔熻兘銆?br />鍏跺畠鏂扮殑C++綾誨瀷杞崲鎿嶄綔絎﹁鐢ㄥ湪闇瑕佹洿澶氶檺鍒剁殑鍦版柟銆俢onst_cast鐢ㄤ簬 綾誨瀷杞崲鎺夎〃杈懼紡鐨刢onst鎴杤olatileness灞炴с傞氳繃浣跨敤const_cast錛屼綘鍚戜漢浠拰緙栬瘧鍣ㄥ己璋冧綘閫氳繃綾誨瀷杞崲鎯沖仛鐨勫彧鏄敼鍙樹竴浜涗笢 瑗跨殑聽constness鎴栬卾olatileness灞炴с傝繖涓惈涔夎緙栬瘧鍣ㄦ墍綰︽潫銆傚鏋滀綘璇曞浘浣跨敤const_cast鏉ュ畬鎴愪慨鏀? constness聽鎴栬卾olatileness灞炴т箣澶栫殑浜嬫儏錛屼綘鐨勭被鍨嬭漿鎹㈠皢琚嫆緇濄備笅闈㈡槸涓浜涗緥瀛愶細
class聽Widget聽{聽聽};
class聽SpecialWidget:聽public聽Widget聽{聽聽};
void聽update(SpecialWidget聽*psw);
SpecialWidget聽sw;聽//聽sw聽鏄竴涓潪const聽瀵硅薄銆?br />const聽SpecialWidget&聽csw聽=聽sw;聽//聽csw聽鏄痵w鐨勪竴涓紩鐢?br />//聽瀹冩槸涓涓猚onst聽瀵硅薄
update(
&csw );聽//聽閿欒!涓嶈兘浼犻掍竴涓猚onst聽SpecialWidget*聽鍙橀噺
//聽緇欎竴涓鐞哠pecialWidget*綾誨瀷鍙橀噺鐨勫嚱鏁?br />update(const_cast
< SpecialWidget * > ( &csw ));
//聽姝g‘錛宑sw鐨刢onst琚樉紺哄湴杞崲鎺夛紙
//聽csw鍜宻w涓や釜鍙橀噺鍊煎湪update
//鍑芥暟涓兘琚洿鏂幫級
update((SpecialWidget*)
&csw );
//聽鍚屼笂錛屼絾鐢ㄤ簡涓涓洿闅捐瘑鍒?br />//鐨凜椋庢牸鐨勭被鍨嬭漿鎹?br />Widget聽*pw聽=聽new聽SpecialWidget;
update(pw);聽//聽閿欒錛乸w鐨勭被鍨嬫槸Widget*錛屼絾鏄?br />//聽update鍑芥暟澶勭悊鐨勬槸SpecialWidget*綾誨瀷
update(const_cast
< SpecialWidget * > (pw));
//聽閿欒錛乧onst_cast浠呰兘琚敤鍦ㄥ獎鍝?br />//聽constness聽or聽volatileness鐨勫湴鏂逛笂銆?
//聽涓嶈兘鐢ㄥ湪鍚戠戶鎵垮瓙綾昏繘琛岀被鍨嬭漿鎹€?br />鍒扮洰鍓嶄負姝紝const_cast鏈鏅氱殑鐢ㄩ斿氨鏄漿鎹㈡帀瀵硅薄鐨刢onst灞炴с?br />絎? 浜岀鐗規畩鐨勭被鍨嬭漿鎹㈢鏄痙ynamic_cast錛屽畠琚敤浜庡畨鍏ㄥ湴娌跨潃綾葷殑緇ф壙鍏崇郴鍚戜笅榪涜綾誨瀷杞崲銆傝繖灝辨槸璇達紝浣犺兘鐢╠ynamic_cast鎶婃寚鍚戝熀 綾葷殑鎸囬拡鎴栧紩鐢ㄨ漿鎹㈡垚鎸囧悜鍏舵淳鐢熺被鎴栧叾鍏勫紵綾葷殑鎸囬拡鎴栧紩鐢紝鑰屼笖浣犺兘鐭ラ亾杞崲鏄惁鎴愬姛銆傚け璐ョ殑杞崲灝嗚繑鍥炵┖鎸囬拡錛堝綋瀵規寚閽堣繘琛岀被鍨嬭漿鎹㈡椂錛夋垨鑰呮姏鍑哄紓甯? 錛堝綋瀵瑰紩鐢ㄨ繘琛岀被鍨嬭漿鎹㈡椂錛夛細
Widget聽*pw;

update(dynamic_cast
< SpecialWidget * > (pw));
//聽姝g‘錛屼紶閫掔粰update鍑芥暟涓涓寚閽?br />//聽鏄寚鍚戝彉閲忕被鍨嬩負SpecialWidget鐨刾w鐨勬寚閽?br />//聽濡傛灉pw紜疄鎸囧悜涓涓璞?
//聽鍚﹀垯浼犻掕繃鍘葷殑灝嗕嬌絀烘寚閽堛?br />void聽updateViaRef(SpecialWidget&聽rsw);
updateViaRef(dynamic_cast
< SpecialWidget & > (*pw));
//姝g‘銆備紶閫掔粰updateViaRef鍑芥暟
//聽SpecialWidget聽pw聽鎸囬拡錛屽鏋減w
//聽紜疄鎸囧悜浜嗘煇涓璞?br />//聽鍚﹀垯灝嗘姏鍑哄紓甯?br />dynamic_casts鍦ㄥ府鍔╀綘嫻忚緇ф壙灞傛涓婃槸鏈夐檺鍒剁殑銆傚畠涓嶈兘琚敤浜庣己涔忚櫄鍑芥暟鐨勭被鍨嬩笂錛堝弬瑙佹潯嬈綧24錛夛紝涔熶笉鑳界敤瀹冩潵杞崲鎺塩onstness錛?br />int聽firstNumber,聽secondNumber;

double聽result聽=聽dynamic_cast
< double > (firstNumber)/secondNumber;
//聽閿欒錛佹病鏈夌戶鎵垮叧緋?br />const聽SpecialWidget聽sw;

update(dynamic_cast
< SpecialWidget * > ( &sw ));
//聽閿欒!聽dynamic_cast涓嶈兘杞崲
//聽鎺塩onst銆?br />濡備綘鎯沖湪娌℃湁緇ф壙鍏崇郴鐨勭被鍨嬩腑榪涜杞崲錛屼綘鍙兘鎯沖埌static_cast銆傚鏋滄槸涓轟簡鍘婚櫎const錛屼綘鎬誨緱鐢╟onst_cast銆?br />榪欏洓涓被鍨嬭漿鎹㈢涓殑鏈鍚庝竴涓槸reinterpret_cast銆備嬌鐢ㄨ繖涓搷浣滅鐨勭被鍨嬭漿鎹紝鍏剁殑杞崲緇撴灉鍑犱箮閮芥槸鎵ц鏈熷畾涔夛紙implementation-defined錛夈傚洜姝わ紝浣跨敤reinterpret_casts鐨勪唬鐮佸緢闅劇Щ妞嶃?br />reinterpret_casts鐨勬渶鏅氱殑鐢ㄩ斿氨鏄湪鍑芥暟鎸囬拡綾誨瀷涔嬮棿榪涜杞崲銆備緥濡傦紝鍋囪浣犳湁涓涓嚱鏁版寚閽堟暟緇勶細
typedef聽void聽(*FuncPtr)();聽//聽FuncPtr聽is聽涓涓寚鍚戝嚱鏁?br />//聽鐨勬寚閽堬紝璇ュ嚱鏁版病鏈夊弬鏁?br />//聽榪斿洖鍊肩被鍨嬩負void
FuncPtr聽funcPtrArray[10];聽//聽funcPtrArray聽鏄竴涓兘瀹圭撼
//聽10涓狥uncPtrs鎸囬拡鐨勬暟緇?br />璁╂垜浠亣璁句綘甯屾湜錛堝洜涓烘煇浜涜帿鍚嶅叾濡欑殑鍘熷洜錛夋妸涓涓寚鍚戜笅闈㈠嚱鏁扮殑鎸囬拡瀛樺叆funcPtrArray鏁扮粍錛?br />int聽doSomething();
浣犱笉鑳戒笉緇忚繃綾誨瀷杞崲鑰岀洿鎺ュ幓鍋氾紝鍥犱負doSomething鍑芥暟瀵逛簬funcPtrArray鏁扮粍鏉ヨ鏈変竴涓敊璇殑綾誨瀷銆傚湪FuncPtrArray鏁扮粍閲岀殑鍑芥暟榪斿洖鍊兼槸void綾誨瀷錛岃宒oSomething鍑芥暟榪斿洖鍊兼槸int綾誨瀷銆?br />funcPtrArray[0]聽=聽
&doSomething; 聽//聽閿欒錛佺被鍨嬩笉鍖歸厤
reinterpret_cast鍙互璁╀綘榪嬌緙栬瘧錕鉸?/span>


]]>
浠婂ぉ涔頒簡鍑犳湰涔?鏈夋病鏈夋鐪嬭繖鍑犳湰涔︾殑鏈嬪弸鍛?http://www.shnenglu.com/ace/archive/2006/04/15/5610.htmlStone JiangStone JiangSat, 15 Apr 2006 05:09:00 GMThttp://www.shnenglu.com/ace/archive/2006/04/15/5610.htmlhttp://www.shnenglu.com/ace/comments/5610.htmlhttp://www.shnenglu.com/ace/archive/2006/04/15/5610.html#Feedback0http://www.shnenglu.com/ace/comments/commentRss/5610.htmlhttp://www.shnenglu.com/ace/services/trackbacks/5610.html

]]>
浠婂ぉ鍠滃緱涓ゆ湰涔?闇瑕佺殑璇風暀璦http://www.shnenglu.com/ace/archive/2006/04/14/5514.htmlStone JiangStone JiangFri, 14 Apr 2006 02:14:00 GMThttp://www.shnenglu.com/ace/archive/2006/04/14/5514.htmlhttp://www.shnenglu.com/ace/comments/5514.htmlhttp://www.shnenglu.com/ace/archive/2006/04/14/5514.html#Feedback5http://www.shnenglu.com/ace/comments/commentRss/5514.htmlhttp://www.shnenglu.com/ace/services/trackbacks/5514.htmlC++ Coding Standards: 101 Rules, Guidelines, and Best PracticesBy Herb聽Sutter, Andrei聽Alexandrescu
榪欐湰涔﹀緱鍒?005 Jolt澶у

2. The Art or Unix Programming
榪欐槸緇xx鍜寉yyy浠ユ潵鐨勬渶浼樼鐨刄nix璇葷墿.



]]>
閫氳繃妯℃澘瀹炵幇"澶氭佹?,閬垮紑緇ф壙甯︽潵鐨勬ц兘寮閿涔嬭璁?http://www.shnenglu.com/ace/archive/2006/04/14/5506.htmlStone JiangStone JiangFri, 14 Apr 2006 01:29:00 GMThttp://www.shnenglu.com/ace/archive/2006/04/14/5506.htmlhttp://www.shnenglu.com/ace/comments/5506.htmlhttp://www.shnenglu.com/ace/archive/2006/04/14/5506.html#Feedback0http://www.shnenglu.com/ace/comments/commentRss/5506.htmlhttp://www.shnenglu.com/ace/services/trackbacks/5506.html澶氭佺敓鍏跺疄榪樺彲浠ラ氳繃綾葷殑鑱氬悎鎴栫粍鍚堢殑鏂瑰紡鏉ヨ揪鍒?wbr>,浠庤岃繕鍙互閬垮厤緇ф壙鎴栧緇ф壙,
浠g爜濡備笅 (鏈湪寮鍙戠幆澧冧腑璋冭瘯)
#include聽<stdio.h>

template聽
<class聽T>
class聽A聽聽
{聽
public:聽
聽聽
void聽print()聽
聽聽{聽
聽聽聽聽base_.b();聽
聽聽}聽聽聽
聽聽typename聽T聽base_;
};聽


class聽B聽
{聽
public:聽
聽聽
void聽b()聽
聽聽{聽
聽聽聽聽printf(
"聽Class聽B---------------------\n");聽
聽聽}聽聽聽
};聽

class聽C聽
{聽
public:聽
聽聽
void聽b()聽
聽聽{聽
聽聽聽聽printf(
"聽Class聽C---------------------\n");聽
聽聽}聽聽聽
};聽

int聽main(int,聽char*聽[])聽
{聽
聽聽A
<B>聽c;聽
聽聽c.print();聽
聽聽A
<C>聽c2;
聽聽c2.print();
聽聽
return0;聽聽聽
}聽



]]>
杞? UDP瀹炵幇鍙潬鏂囦歡浼犺緭 (杞?http://www.shnenglu.com/ace/archive/2006/04/13/5465.htmlStone JiangStone JiangThu, 13 Apr 2006 05:56:00 GMThttp://www.shnenglu.com/ace/archive/2006/04/13/5465.htmlhttp://www.shnenglu.com/ace/comments/5465.htmlhttp://www.shnenglu.com/ace/archive/2006/04/13/5465.html#Feedback0http://www.shnenglu.com/ace/comments/commentRss/5465.htmlhttp://www.shnenglu.com/ace/services/trackbacks/5465.html

聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽

鐢║DP瀹炵幇鍙潬鏂囦歡浼犺緭


澶у閮芥竻妤氾紝濡傛灉鐢═CP浼犺緭鏂囦歡鐨勮瘽錛屾槸寰堢畝鍗曠殑錛屾牴鏈兘涓嶇敤鎿嶅績浼氫涪鍖咃紝闄ら潪鏄綉緇滃潖浜嗭紝灝卞緱閲嶆潵銆傜敤UDP鐨勮瘽錛屽洜涓篣DP鏄笉鍙潬鐨勶紝鎵浠ョ敤瀹冧紶杈撴枃浠訛紝瑕佷繚璇佷笉涓㈠寘錛屽氨寰楁垜浠嚜宸卞啓棰濆鐨勪唬鐮佹潵淇濋殰浜嗐傛湰鏂囧氨璇磋濡傛灉淇濊瘉鍙潬浼犺緭銆?br />

聽聽聽瑕佸疄鐜版棤宸敊鐨勪紶杈撴暟鎹紝鎴戜滑鍙互閲囩敤閲嶅彂璇鋒眰錛圓RQ錛夊崗璁紝瀹冨張鍙垎涓鴻繛緇瑼RQ鍗忚銆侀夋嫨閲嶅彂ARQ鍗忚銆佹粦鍔ㄧ獥鍙e崗璁傛湰鏂囬噸鐐逛粙緇嶆粦鍔ㄧ獥鍙e崗璁紝鍏跺畠鐨勪袱縐嶆湁鍏磋叮鐨勫彲鍙傝冪浉鍏崇殑緗戠粶閫氫俊涔嬬被鐨勪功銆?br />

聽聽聽聽閲囩敤婊戝姩紿楀彛鍗忚錛岄檺鍒跺凡鍙戦佸嚭鍘諱絾鏈紜鐨勬暟鎹撫鐨勬暟鐩傚驚鐜噸澶嶄嬌鐢ㄥ凡鏀跺埌鐨勯偅浜涙暟鎹撫鐨勫簭鍙楓傚叿浣撳疄鐜版槸鍦ㄥ彂閫佺鍜屾帴鏀剁鍒嗗埆璁懼畾鍙戦佺獥鍙e拰鎺ユ敹紿楀彛銆?br />

聽錛?錛夊彂閫佺獥鍙?br />

聽聽鍙戦佺獥鍙g敤鏉ュ鍙戦佺榪涜嫻侀噺鎺у埗銆傚彂閫佺獥鍙g殑澶у皬Wt浠h〃鍦ㄨ繕娌℃湁鏀跺埌瀵規柟紜鐨勬潯浠朵笅錛屽彂閫佺鏈澶氬彲浠ュ彂閫佺殑鏁版嵁甯х殑涓暟銆傚叿浣撴剰鎬濊鍙傝冧笅鍥撅細


聽錛?錛夋帴鏀剁獥鍙?br />

聽聽鎺ユ敹紿楀彛鐢ㄦ潵鎺у埗鎺ユ敹鏁版嵁甯с傚彧鏈夊綋鎺ユ敹鍒扮殑鏁版嵁甯х殑鍙戦佸簭鍙瘋惤鍦ㄦ帴鏀剁獥鍙e唴錛屾墠鍏佽灝嗚鏁版嵁甯ф敹涓嬶紝鍚﹀垯涓寰嬩涪寮冦傛帴鏀剁獥鍙g殑澶у皬鐢╓r鏉ヨ〃紺猴紝鍦ㄨ繛緇瑼RQ鍗忚涓紝Wr聽=聽1銆傛帴鏀剁獥鍙g殑鎰忎箟鍙弬鑰冧笅鍥撅細


聽聽鍦ㄦ帴鏀剁獥鍙e拰鍙戦佺獥鍙i棿瀛樺湪鐫榪欐牱鐨勫叧緋伙細鎺ユ敹紿楀彛鍙戠敓鏃嬭漿鍚庯紝鍙戦佺獥鍙f墠鍙兘鍚戝墠鏃嬭漿錛屾帴鏀剁獥鍙d繚鎸佷笉鍔ㄦ椂錛屽彂閫佺獥鍙f槸涓嶄細鏃嬭漿鐨勩傝繖縐嶆敹鍙戠獥鍙f寜濡傛瑙勫緥欏烘椂閽熸柟鍚戜笉鏂棆杞殑鍗忚灝辯姱娉曚負婊戝姩紿楀彛鍗忚銆?br />

聽聽聽濂戒簡錛屽湪涓婇潰瀵規粦鍔ㄧ獥鍙e崗璁湁澶ц嚧浜嗚В鍚庯紝鎴戜滑榪樻槸榪涘叆姝i鍚э細錛?br />

聽聽聽鍙戦佺鐨勫彂閫佺嚎紼嬶細


聽聽聽int聽聽ret;


聽聽聽int聽聽nPacketCount聽=聽0;


聽聽聽DWORD聽dwRet;


聽聽聽SendBuf聽sendbuf;


聽聽聽DWORD聽dwRead;


聽聽聽DWORD聽dwReadSize;




聽聽聽SendBuf*聽pushbuf;




聽聽聽//璁$畻涓鍏辮璇葷殑鏂囦歡嬈℃暟錛岃嫢鏂囦歡宸茶瀹岋紝浣嗗鎴風娌℃湁鎺ユ敹瀹岋紝


聽聽聽//鍒欒鍙戦佺殑鍐呭涓嶅啀浠庢枃浠墮噷璇誨彇錛岃屼粠m_bufqueue閲屾彁鍙?br />

聽聽聽nPacketCount聽=聽m_dwFileSize聽/聽sizeof(sendbuf.buf);




聽聽//鑻ヤ笉鑳芥暣闄わ紝鍒欏簲鍔?


聽聽if(m_dwFileSize聽%聽sizeof(sendbuf.buf)聽!=聽0)


聽聽聽聽聽++nPacketCount;


聽SetEvent(m_hEvent);






聽聽CHtime聽htime;




聽聽//鑻ュ凡鍙戦佸ぇ灝忓皬浜庢枃浠跺ぇ灝忓茍涓斿彂閫佺獥鍙e墠娌跨瓑浜庡悗娌匡紝鍒欑戶緇彂閫?br />

聽聽//鍚﹀垯閫鍑哄驚鐜?br />



聽if(m_dwSend聽
< 聽m_dwFileSize )聽聽//聽鏂囦歡娌℃湁浼犺緭瀹屾椂鎵嶇戶緇紶杈?br />

聽{


聽聽while(1)


聽聽{


聽聽聽dwRet聽
=聽WaitForSingleObject(m_hEvent,聽 1000);


聽聽聽if(dwRet聽
==聽 WAIT_FAILED)


聽聽聽{


聽聽聽聽return聽false;


聽聽聽}


聽聽聽else聽if(dwRet聽
==聽 WAIT_TIMEOUT)


聽聽聽{


聽聽聽聽//閲嶅彂


聽聽聽聽::EnterCriticalSection(&m_csQueue);聽聽//聽榪涘叆m_bufqueue鐨勬帓鏂ュ尯


聽聽聽聽ret聽
=聽m_hsocket.hsendto((char*)m_bufqueue.front(),聽 sizeof(sendbuf));


聽聽聽聽::LeaveCriticalSection(&m_csQueue);聽聽//聽閫鍑簃_bufqueue鐨勬帓鏂ュ尯


聽聽聽聽if(ret聽
==聽 SOCKET_ERROR)


聽聽聽聽{


聽聽聽聽聽cout聽<<聽"閲嶅彂澶辮觸錛岀戶緇噸鍙?聽<<聽endl;


聽聽聽聽聽continue;


聽聽聽聽}


聽聽聽ResetEvent(m_hEvent);




聽聽聽聽continue;


聽聽聽}


聽聽//鑻ュ彂閫佺獥鍙eぇ灝徛?lt;聽棰勫畾澶у皬聽&&聽宸茶鏂囦歡嬈℃暟(nReadIndex)聽<聽闇瑕佽鏂囦歡鐨勬鏁?nReadCount)錛屽垯緇х畫璇誨彇鍙戦?br />



聽聽聽//鍚﹀垯錛岃鍙戦佺殑鍐呭浠巑_bufqueue閲屾彁鍙?br />

聽聽聽if(m_dwSend聽<聽m_dwFileSize)


聽聽聽{


聽聽聽聽dwReadSize聽
=聽m_dwFileSize聽 -聽m_dwSend;


聽聽聽聽dwReadSize聽
=聽dwReadSize聽 <聽MAXBUF_SIZE聽?聽聽聽dwReadSize聽:MAXBUF_SIZE;




聽聽聽聽memset(sendbuf.buf,聽0,聽sizeof(sendbuf.buf));


聽聽聽聽if(!ReadFile(m_hFile,聽sendbuf.buf,聽dwReadSize,聽&dwRead,聽NULL))


聽聽聽聽{


聽聽聽聽聽//AfxMessageBox("璇誨彇鏂囦歡澶辮觸,璇風‘璁ゆ枃浠跺瓨鍦ㄦ垨鏈夎鍙栨潈闄?");


聽聽聽聽聽cout聽<<聽"璇誨彇鏂囦歡澶辮觸,璇風‘璁ゆ枃浠跺瓨鍦ㄦ垨鏈夎鍙栨潈闄?"聽<<聽endl;


聽聽聽聽聽return聽false;


聽聽聽聽}




聽聽聽聽m_dwSend聽+
=聽dwRead;




聽聽聽聽
sendbuf.index聽 =聽m_nSendIndexHead;


聽聽聽聽
//聽鍙戦佺獥鍙e墠娌垮悜鍓嶇Щ涓鏍悸犅犅犅犅爉_nSendIndexHead聽 =聽(m_nSendIndexHead聽 +聽1)聽%聽聽聽Sliding_Window_Size;聽




聽聽sendbuf.dwLen聽
=聽dwRead;




聽聽
//淇濆瓨鍙戦佽繃鐨勬暟鎹紝浠ヤ究閲嶅彂




聽聽聽::EnterCriticalSection(&m_csQueue);聽聽聽//聽榪涘叆m_bufqueue鐨勬帓鏂ュ尯


聽聽聽pushbuf聽
=聽GetBufFromLookaside();


聽聽聽
memcpy(pushbuf,聽&sendbuf,聽sizeof(sendbuf));



聽聽聽m_bufqueue.push(pushbuf);



聽聽聽//聽鏂囦歡宸茶瀹岋紝鍦ㄩ槦鍒椾腑鍔犱竴File_End鏍囧織錛屼互渚垮垽鏂槸鍚﹂渶瑕佺戶緇彂閫伮犅犅犅爄f(m_dwSend聽
> =聽m_dwFileSize)聽聽聽聽



聽聽聽{


聽聽聽聽聽pushbuf聽=聽GetBufFromLookaside();


聽聽聽聽pushbuf->index聽=聽File_End;




聽聽聽聽聽pushbuf->dwLen聽=聽File_End;


聽聽聽聽聽memset(pushbuf->buf,聽0,聽sizeof(pushbuf->buf));


聽聽聽聽聽m_bufqueue.push(pushbuf);



聽聽聽聽}


聽聽聽聽::LeaveCriticalSection(
&m_csQueue );聽聽聽//聽閫鍑簃_bufqueue鐨勬帓鏂ュ尯


聽聽聽}


聽聽聽::EnterCriticalSection(
&m_csQueue );聽聽聽聽//聽榪涘叆m_bufqueue鐨勬帓鏂ュ尯




聽聽聽//聽鎵鏈夋暟鎹寘宸插彂閫佸畬姣?閫鍑哄驚鐜犅犅犅爄f(m_bufqueue.front()->index聽==聽File_End)聽聽



聽聽聽{


聽聽聽聽聽::LeaveCriticalSection(
&m_csQueue );聽聽聽//聽閫鍑簃_bufqueue鐨勬帓鏂ュ尯


聽聽聽聽聽break;


聽聽聽}


聽聽聽//聽鍙戦佺獥鍙e皬浜庢寚瀹氬鹼紝緇х畫鍙戦伮犅犅犅爀lse聽if(m_bufqueue.size()聽
< =聽Send_Window_Size )聽



聽聽聽{


聽聽聽聽ret聽
=聽m_hsocket.hsendto((char*)m_bufqueue.front(),聽 sizeof(sendbuf));


聽聽聽聽if(ret聽
==聽 SOCKET_ERROR)


聽聽聽聽{


聽聽聽聽聽::LeaveCriticalSection(&m_csQueue);聽聽//聽閫鍑簃_bufqueue鐨勬帓鏂ュ尯


聽聽聽聽聽cout聽<<聽"鍙戦佸け璐ワ紝閲嶅彂"聽<<聽endl;


聽聽聽聽聽continue;


聽聽聽聽}




聽聽聽聽//寤舵椂錛岄槻姝涪鍖?br />

聽聽聽聽Sleep(50);聽聽


聽聽聽}


聽聽聽else聽聽聽聽聽聽聽聽聽聽聽//聽鍙戦佺獥鍙eぇ浜庢寚瀹氬鹼紝絳夋寔鎺ユ敹綰跨▼鎺ユ敹紜娑堟伅


聽聽聽{


聽聽聽聽ResetEvent(m_hEvent);


聽聽聽}


聽聽聽::LeaveCriticalSection(&m_csQueue);聽聽聽聽//聽閫鍑簃_bufqueue鐨勬帓鏂ュ尯


聽聽}


聽}


聽聽鍙戦佺鐨勬帴鏀剁嚎紼嬶細



聽聽int聽ret;


聽聽RecvBuf聽recvbuf;




聽聽while(m_hFile聽!
=聽NULL)


聽聽
{


聽聽聽聽ret聽
=聽m_hsocket.hrecvfrom((char*)&recvbuf,聽 sizeof(recvbuf));聽聽


聽聽聽聽if(ret聽
==聽 SOCKET_ERROR)


聽聽聽聽{


聽聽聽聽聽聽//AfxMessageBox("鎺ユ敹紜娑堟伅鍑洪敊");


聽聽聽聽聽聽::EnterCriticalSection(&m_csQueue);


聽聽聽聽聽聽if(m_bufqueue.front()-
> index聽==聽File_End)聽//聽鏂囦歡浼犺緭瀹屾瘯


聽聽聽聽聽聽{


聽聽聽聽聽聽聽聽聽::LeaveCriticalSection(
&m_csQueue );


聽聽聽聽聽聽聽聽聽break;


聽聽聽聽聽聽聽}


聽聽聽聽聽聽聽::LeaveCriticalSection(
&m_csQueue );


聽聽聽聽聽聽聽cout聽
< <聽"鎺ユ敹紜娑堟伅鍑洪敊:聽 "聽<<聽GetLastError()聽<<聽endl;



聽聽聽聽聽聽聽return聽false;


聽聽聽聽聽}


聽聽if(recvbuf.flag聽
==聽 Flag_Ack聽&&聽recvbuf.index聽 ==聽聽聽聽 m_nSendIndexTail)

聽聽


聽聽聽{


聽聽聽聽聽聽m_nSendIndexTail聽
=聽(m_nSendIndexTail聽 +聽1)聽%聽Sliding_Window_Size;


聽聽聽聽聽聽//璇ョ粨鐐瑰凡寰楀埌紜錛屽皢鍏跺姞鍏ユ梺瑙嗗垪琛紝浠ュ鍐嶇敤


聽聽聽聽聽聽::EnterCriticalSection(&m_csQueue);


聽聽聽聽聽聽m_bufLookaside.push(m_bufqueue.front());


聽聽聽聽聽聽m_bufqueue.pop();


聽聽聽聽聽::LeaveCriticalSection(&m_csQueue);


聽聽聽聽聽SetEvent(m_hEvent);



聽聽聽}


聽}




鎺ユ敹绔殑鎺ユ敹綰跨▼錛?br />

聽int聽聽ret;


聽DWORD聽dwWritten;


聽SendBuf聽recvbuf;


聽RecvBuf聽sendbuf;


聽int聽nerror聽
=聽0;


//聽璁劇疆鏂囦歡鎸囬拡浣嶇疆錛屾寚鍚戜笂嬈″凡鍙戦佺殑澶у皬



聽SetFilePointer(m_hFile,聽0,聽NULL,聽FILE_END);


聽//鑻ュ凡鎺ユ敹鏂囦歡澶у皬灝忎簬闇瑕佹帴鏀剁殑澶у皬錛屽垯緇х畫



聽while(m_dwSend聽<聽m_dwFileSize)


聽{


聽聽//鎺ユ敹


聽聽memset(&recvbuf,聽0,聽sizeof(recvbuf));


聽聽ret聽
=聽m_hsocket.hrecvfrom((char*)&recvbuf,聽 sizeof(recvbuf));


聽聽if(ret聽
==聽 SOCKET_ERROR)


聽聽{


聽聽聽return聽false;


聽聽}


聽聽//涓嶆槸甯屾湜鎺ユ敹鐨勶紝涓㈠純錛岀戶緇帴鏀?br />


聽聽if(recvbuf.index聽!
=聽(m_nRecvIndex)聽 %聽Sliding_Window_Size)


聽聽{


聽聽聽nerror++;


聽聽聽cout聽<<聽recvbuf.index聽<<聽"error?"聽<<聽m_nRecvIndex聽<<聽endl;


聽聽聽continue;


聽聽}


聽聽if(!WriteFile(m_hFile,聽recvbuf.buf,聽recvbuf.dwLen,聽&dwWritten,聽NULL))



聽聽{


聽聽聽//AfxMessageBox("鍐欏叆鏂囦歡澶辮觸");


聽聽聽cout聽<<聽"鍐欏叆鏂囦歡澶辮觸"聽<<聽endl;


聽聽聽return聽false;


聽聽}




聽聽//宸叉帴鏀舵枃浠跺ぇ灝?br />

聽聽m_dwSend聽+
=聽dwWritten;


聽聽
//鍙戦佺‘璁ゆ秷鎭?br />


聽聽sendbuf.flag聽
=聽Flag_Ack;


聽聽
sendbuf.index聽 =聽m_nRecvIndex;




聽聽
ret聽 =聽m_hsocket.hsendto((char*)&sendbuf,聽 sizeof(sendbuf));


聽聽if(ret聽
==聽 SOCKET_ERROR)


聽聽{


聽聽聽return聽false;


聽聽}


聽聽//鎺ユ敹紿楀彛鍓嶇Щ涓鏍?br />


聽聽m_nRecvIndex聽
=聽(m_nRecvIndex聽 +聽1)聽%聽Sliding_Window_Size;


聽}









]]>
UML鍩硅鎻愮翰鍒濇http://www.shnenglu.com/ace/archive/2006/04/13/5461.htmlStone JiangStone JiangThu, 13 Apr 2006 05:27:00 GMThttp://www.shnenglu.com/ace/archive/2006/04/13/5461.htmlhttp://www.shnenglu.com/ace/comments/5461.htmlhttp://www.shnenglu.com/ace/archive/2006/04/13/5461.html#Feedback0http://www.shnenglu.com/ace/comments/commentRss/5461.htmlhttp://www.shnenglu.com/ace/services/trackbacks/5461.html 璇炬椂鎸夋帓
聽聽絎竴鑺?br />聽聽聽聽涓轟粈涔堣鐢║ML
聽聽聽聽聽聽闂
聽聽聽聽聽聽聽聽鐩墠闈復鐨勯棶棰?br />聽聽聽聽聽聽聽聽涓氱晫鍏卞悓鐨勯棶棰?br />聽聽聽聽聽聽闂鏍規湰鐨勬墍鍦?br />聽聽聽聽聽聽UML浜х敓鐨勮儗鏅?br />聽聽聽聽聽聽UML鐨勭Н鏋佹剰涔?br />聽聽聽聽聽聽浣跨敤UML鐨勬椂鏈?br />聽聽聽聽聽聽聽聽UML鍥句竴瑙?br />聽聽聽聽聽聽涓嶄粎浠呮槸UML
聽聽聽聽聽聽聽聽UP(緇熶竴榪囩▼)
聽聽聽聽聽聽聽聽聽聽RUP
聽聽聽聽聽聽聽聽聽聽XP
聽聽聽聽聽聽聽聽聽聽FDD
聽聽聽聽聽聽聽聽聽聽etc..
聽聽聽聽聽聽聽聽闇姹傚伐紼?br />聽聽聽聽聽聽聽聽OO鎶鏈?br />聽聽聽聽聽聽聽聽聽聽妯″紡
聽聽聽聽聽聽聽聽聽聽鍩轟簬OO鐨勯噸鏋?br />聽聽聽聽聽聽聽聽聽聽鍩轟簬妯″紡鐨勬鏋?br />聽聽聽聽鍚庣畫璇劇▼瀹夋帓
聽聽聽聽聽聽絎簩鑺?br />聽聽聽聽聽聽聽聽闇姹?br />聽聽聽聽聽聽絎笁鑺?br />聽聽聽聽聽聽聽聽鍒嗘瀽鍜岃璁?br />聽聽聽聽聽聽鏇村涓婚
聽聽絎簩鑺?br />聽聽聽聽鐢║ML闇姹傚垎鏋愬熀紜
聽聽聽聽聽聽闇姹傚伐紼嬪熀紜
聽聽聽聽聽聽聽聽闇姹傛ā鍨嬬悊璁?br />聽聽聽聽聽聽聽聽鏂囨。鍖栭渶姹?br />聽聽聽聽聽聽聽聽綆$悊闇姹?br />聽聽聽聽聽聽聽聽綆$悊闇姹傚彉鏇?br />聽聽聽聽聽聽鐢ㄤ緥鎶鏈熀紜
聽聽聽聽聽聽聽聽琛ㄨ揪鎰挎櫙
聽聽聽聽聽聽聽聽鏁呬簨鍜屽満鏅?br />聽聽聽聽聽聽聽聽璇嗗埆緋葷粺杈圭晫
聽聽聽聽聽聽聽聽璇嗗埆涓昏
聽聽聽聽聽聽聽聽璇嗗埆鐢ㄤ緥
聽聽聽聽聽聽聽聽鎾板啓鐢ㄤ緥瑙勭害
聽聽聽聽聽聽聽聽鐢葷敤渚嬪浘
聽聽聽聽聽聽聽聽鐢ㄤ緥涔嬮棿鐨勫叧緋?br />聽聽聽聽聽聽聽聽鐢ㄧ敤渚嬫弿榪伴渶姹?br />聽聽絎笁鑺?br />聽聽聽聽鐢║ML榪涜綆鍗曠郴緇熻璁?br />聽聽聽聽聽聽緋葷粺璁捐涓鑸師鍒?br />聽聽聽聽聽聽綾誨浘鍩虹
聽聽聽聽聽聽欏哄簭鍥懼熀紜
聽聽聽聽聽聽緇忓父鐘殑璁捐閿欒
聽聽絎洓鑺?br />聽聽聽聽UML榪涢樁
鐩爣
聽聽瀛︿細鐢ㄥ熀鏈殑UML鎾板啓鍜岄槄璇昏璁℃枃妗?br />聽聽聽聽浣垮彈璁呰兘鎾板啓姣旇緝鏈夊悎鏍肩殑璁捐鏂囨。
聽聽聽聽浣垮彈璁呰兘闃呰璁捐鏂囨。


鎬濈淮瀵煎浘

UML鍩硅 2.0.jpg

]]>
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
      <noscript id="pjuwb"></noscript>
            <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
              <dd id="pjuwb"></dd>
              <abbr id="pjuwb"></abbr>
              亚洲国产高清在线| 亚洲精品免费网站| 亚洲美女精品久久| 日韩视频二区| 国产精品盗摄久久久| 一区二区三区欧美激情| 亚洲人永久免费| 欧美香蕉视频| 久久九九热re6这里有精品| 久久成人精品视频| 亚洲福利小视频| 亚洲精品欧美激情| 国产精品日韩欧美一区二区三区| 午夜视频在线观看一区| 欧美亚洲一区二区在线| 在线观看欧美激情| 日韩亚洲在线| 国产一在线精品一区在线观看| 久色婷婷小香蕉久久| 欧美精品一区二区高清在线观看| 亚洲无亚洲人成网站77777| 欧美一区二区在线| 一区二区三区四区蜜桃| 性欧美暴力猛交69hd| 亚洲精品社区| 欧美一区在线直播| 亚洲特级毛片| 老司机精品导航| 欧美在线播放| 欧美日韩精品一区二区三区四区| 久久精品中文字幕一区二区三区| 欧美a级一区| 久久精品人人做人人综合| 欧美—级高清免费播放| 久久综合电影| 国产欧美亚洲一区| 99国产精品久久久久久久久久| 国外成人网址| 亚洲欧美bt| 99re6热在线精品视频播放速度| 欧美中文在线观看| 亚洲国产精彩中文乱码av在线播放| 午夜精品电影| 亚洲精选中文字幕| 久久男女视频| 久久久久国产精品一区二区| 欧美日韩国产亚洲一区| 欧美成人小视频| 国外成人性视频| 午夜综合激情| 欧美综合激情网| 国产精品免费一区二区三区观看| 亚洲精品久久久久| 亚洲欧洲一区二区三区久久| 久久精品成人一区二区三区| 久久国产精品高清| 国产亚洲成精品久久| 亚洲一区免费网站| 欧美一区2区视频在线观看 | 亚洲精品欧美日韩| 久热爱精品视频线路一| 久久综合一区二区| 伊人成人在线| 久久伊人一区二区| 亚洲丰满少妇videoshd| 91久久精品美女| 欧美激情精品久久久久久蜜臀 | 亚洲经典视频在线观看| 亚洲国产电影| 欧美二区在线观看| 亚洲毛片av在线| 亚洲一区高清| 国产日本精品| 久久久成人精品| 亚洲第一在线综合网站| 亚洲精品久久久久| 国产精品国产三级国产普通话蜜臀 | 亚洲激情在线播放| 蜜臀久久99精品久久久久久9| 欧美成人激情在线| 一本到12不卡视频在线dvd| 欧美视频在线一区| 午夜精品视频在线| 欧美成在线视频| 亚洲视频久久| 国产亚洲一区在线| 欧美国产1区2区| 亚洲一区二区三区精品视频 | 亚洲电影免费观看高清| 欧美激情按摩在线| 亚洲欧美精品一区| 欧美成人免费网| 亚洲中字在线| 激情综合色综合久久综合| 欧美电影在线免费观看网站| 一区二区三区回区在观看免费视频| 午夜精品在线| 亚洲国产毛片完整版| 国产精品s色| 免费欧美高清视频| 国产精品久久久久久一区二区三区| 亚洲天堂视频在线观看| 久久婷婷麻豆| 亚洲综合日韩| 136国产福利精品导航网址| 欧美激情一区二区久久久| 亚洲乱码国产乱码精品精可以看 | 久久婷婷综合激情| 亚洲片国产一区一级在线观看| 欧美日韩在线高清| 久久免费精品日本久久中文字幕| av成人手机在线| 另类天堂视频在线观看| 亚洲专区欧美专区| 1769国产精品| 国产真实乱子伦精品视频| 欧美日韩国产高清视频| 美女黄毛**国产精品啪啪| 性欧美xxxx大乳国产app| 99综合视频| 亚洲精品欧美激情| 欧美激情中文字幕一区二区| 久久久久高清| 欧美一区二区三区免费视| 在线视频一区观看| 夜夜嗨av色一区二区不卡| 亚洲国产成人精品女人久久久| 国产日韩免费| 国产亚洲欧美一区二区三区| 欧美手机在线| 国产精品v一区二区三区| 欧美精品成人| 欧美精品电影| 欧美精品午夜| 欧美精品亚洲| 欧美日韩你懂的| 欧美日韩二区三区| 欧美日韩精品一区二区天天拍小说 | 久久国内精品视频| 午夜精彩国产免费不卡不顿大片| 99国产精品99久久久久久| 亚洲精品一区二区网址| 亚洲人人精品| 99精品国产在热久久下载| 日韩香蕉视频| 亚洲欧美另类综合偷拍| 最新高清无码专区| 99re热这里只有精品免费视频| 99国产精品久久久久久久成人热| 亚洲精品在线电影| 在线亚洲+欧美+日本专区| 在线天堂一区av电影| 亚洲欧美在线播放| 久久精品视频在线| 欧美不卡视频一区| 最新亚洲电影| 亚洲天堂第二页| 久久国产日本精品| 麻豆精品视频| 欧美日韩美女| 国产欧美一区二区精品婷婷 | 欧美二区在线播放| 国产精品久久久对白| 国产视频精品免费播放| 极品av少妇一区二区| 亚洲乱码久久| 午夜亚洲视频| 美女精品自拍一二三四| 欧美激情bt| 亚洲一区二区三区777| 欧美综合国产| 欧美日韩国产成人精品| 午夜精品久久久久久久99热浪潮| 亚洲每日更新| 久久不射电影网| 欧美激情1区| 国产综合网站| 亚洲一区久久| 欧美成人a∨高清免费观看| 亚洲美女电影在线| 亚洲欧美不卡| 亚洲第一伊人| 久久xxxx| 欧美视频一区二区| 亚洲大胆视频| 午夜视频在线观看一区| 欧美成人免费观看| 亚洲欧美日韩精品| 欧美黄色aaaa| 红杏aⅴ成人免费视频| 中文一区字幕| 欧美国产日韩在线观看| 午夜伦理片一区| 欧美午夜一区二区福利视频| 亚洲电影免费在线| 久久久欧美精品| 亚洲欧美99| 国产精品国产三级国产普通话三级 | 国产毛片一区二区| 一区二区三区欧美亚洲|