锘??xml version="1.0" encoding="utf-8" standalone="yes"?> 榪欎簺鏈鍩烘湰鐨勮亴涓氭妧鑳介氬父鍐沖畾浜嗕竴涓▼搴忓憳鐨勭駭鍒紝鑳藉惁鐢ㄥソ榪欎簺鎶鑳斤紝鐩存帴鍏崇郴鍒頒簡紼嬪簭鍛樼殑鑱屼笟鐢熸動銆傚緢澶氱▼搴忔柊鎵嬩篃鏄洜涓虹己灝戙佽揪涓嶅埌鎴栨槸涓嶇啛鎮夊湪榪欎簺鍩烘湰鎶鑳斤紝鎵浠ワ紝浠栦滑闇瑕佹湁鑰佹墜甯︼紝闇瑕佸姫鍔涜ˉ榻愯繖浜涙妧鑳姐傝岄珮綰х▼搴忓憳搴旇闈炲父鐔熸倝榪欎簺鍩烘湰鎶鑳斤紝鑰屼笖鏈夎兘鍔涜儨浠誨茍甯﹂鍏朵粬緇忛獙涓嶈凍鐨勭▼搴忓憳銆?/p> 涓嬮潰榪欎簺鍩烘湰鑱屼笟鎶鏈彲浠ョ敤鏉ュ仛涓哄涓涓▼搴忓憳鐨勮瘎浼幫紝寰堟槑鏄撅紝涓嬮潰鐨勮繖浜涙妧鑳介兘鍙互鐢ㄦ潵鍋氶潰璇曘傝櫧鐒訛紝榪樻湁寰堝闈炴妧鏈殑鍥犵礌錛屼絾瀵逛簬璇勪及涓涓▼搴忓憳鐨勬妧鏈兘鍔涙潵璇達紝鍏跺簲璇ユ槸瓚沖鐨勪簡銆?/p> 涓嬮潰鏄▼搴忓憳鎵搴旇鍏峰鐨勫熀鏈亴涓氭妧鑳斤細 褰撶劧錛岃繕鏈夊緢澶氱殑鍩烘湰鎶鏈篃鏄潪甯擱噸瑕佺殑錛屾瘮濡傦紝涓庝漢鐨勬矡閫氳兘鍔涳紝璇█鐨勮〃杈捐兘鍔涳紝鍐欎綔鑳藉姏錛屽洟闃熷崗浣滆兘鍔涳紝閫傚簲鍙樺寲鐨勮兘鍔涳紝鏃墮棿綆$悊鑳藉姏錛屽浠誨姟澶勭悊鑳藉姏錛岃嚜鎴戝涔犺兘鍔涳紝鏁呴殰澶勭悊鑳藉姏錛岀瓑絳夛紝絳夌瓑錛岃繖閲屽彧鏄垪涓句簡鍜屾妧鏈浉鍏崇殑鑳藉姏錛岃繖浜涙槸紼嬪簭鏈鏈鏈鍩烘湰鐨勮兘鍔涳紝鍙鏄▼搴忓憳灝卞繀闇瑕佹湁鐨勮兘鍔涖?br />鍩烘湰鎶鑳?/th> 鎶鑳芥弿榪?/th> 闃呰浠g爜 榪欎釜鎶鑳介渶瑕佺▼搴忓憳鑳藉鍏峰璇繪噦宸茬粡瀛樺湪鐨勪唬鐮佺殑鑳藉姏錛岃繖鏍風殑鑳藉姏鍙互璁╃▼搴忓憳鍒嗘瀽紼嬪簭鐨勮涓猴紝浜嗚В紼嬪簭錛岃繖鏍鋒墠鑳藉拰寮鍙戝洟闃熶竴璧峰伐浣滐紝緇ф壙緇存姢鎴栨槸鏀硅繘鐜版湁鐨勭▼搴忋?/td> 緙栧啓紼嬪簭 緙栧啓紼嬪簭騫朵笉鍖呮嫭紼嬪簭璁捐銆備笉瑕佷互涓虹紪紼嬫槸涓浠跺緢綆鍗曠殑浜嬫儏錛屽緢澶氱▼搴忓憳閮借涓虹紪紼嬪彧闇瑕佹噦寰楃▼搴忚璦鐨勮娉曪紝騫舵妸璁捐瀹炵幇灝卞彲浠ヤ簡銆備絾鏄繖紱葷紪鍐欑▼搴忚繕榪滆繙涓嶅錛屼嬌鐢ㄤ粈涔堟牱鐨勭紪鐮侀鏍兼垚涓虹紪鍐欑▼搴忓憳鏈闇瑕佸叿澶囩殑鍩烘湰鎶鑳姐傝兘鍚︿嬌鐢ㄩ潪甯歌壇濂界殑緙栫▼椋庢牸鐩存帴鍐沖啓浜嗙▼搴忓憳鐨勭駭鍒?/td> 杞歡璁捐 榪欎竴鑳藉姏鐩存帴鍐沖畾浜嗛渶瑕佸悘鐢ㄤ粈涔堟牱鐨勪唬鐮佹妧鏈揪鍒版庝箞鏍風殑鍔熻兘錛岃岀郴緇熸灦鏋勮璁$洿鎺ュ喅瀹氫簡杞歡鐨勮川閲忋佹ц兘鍜屽彲緇存姢鎬с傚茍涓嶆槸鎵鏈夌殑紼嬪簭鍦ㄨ繖涓鏂歸潰閮介潪甯鎬紭縐錛屼絾姣忎釜紼嬪簭鍛橀兘闇瑕佹垨澶氭垨灝戠殑鏄庣櫧鍜屾帉鎻¤繖涓鍩烘湰鎶鑳姐?/td> 鐔熸倝杞歡宸ョ▼ 姣忎釜紼嬪簭鍛橀兘搴旇鏄庣櫧杞歡宸ョ▼鏄粈涔堜笢瑗匡紝閮藉簲璇ョ煡閬擄紝闇姹傚垎鏋愶紝璁捐錛岀紪鐮侊紝嫻嬭瘯錛孯elease鍜岀淮鎶よ繖鍑犱釜闃舵銆傚綋鐒訛紝鍑犱箮鎵鏈夌殑浜洪兘鐭ラ亾榪欎簺涓滆タ錛屼絾騫朵笉鏄瘡涓漢閮藉緢娓呮榪欎簺涓滆タ銆傜幇鍦ㄥ緢澶氶珮綰х▼搴忓憳閮戒細娣鋒穯“闇姹傝鏍艱鏄庝功FS”鍜?#8220;姒傝璁捐HLD”銆傚彟澶栵紝紼嬪簭鍛樿繕闇瑕佺煡閬撲竴浜涜蔣浠跺紑鍙戠殑鏂規硶璁猴紝姣斿錛氭晱鎹峰紑鍙戞垨鐎戝竷妯″瀷銆?/td> 浣跨敤紼嬪簭搴撴垨妗嗘灦 涓涓▼搴忓憳闇瑕佸浼氫嬌鐢ㄥ凡鏈夌殑浠g爜錛屾棤璁烘槸鏍囪鐨勭▼搴忓簱錛屾垨鏄涓夋柟鐨勶紝榪樻槸鑷繁鍏徃鍐呴儴鐨勶紝閮介渶瑕佸浼氬仛銆傛瘮濡傦細C++涓紝闇瑕佸浼氫嬌鐢⊿TL錛孧FC錛孉TL錛孊OOST錛孉CE錛孋PPUNIT絳夌瓑銆備嬌鐢ㄨ繖浜涗笢瑗匡紝鍙互璁╀綘鐨勫伐浣滀簨鍗婂姛鍊嶃?/td> 紼嬪簭璋冭瘯 紼嬪簭璋冭瘯鏄垎鏋怋UG鍜岃В鍐抽棶棰樻渶鐩存帴鐨勮兘鍔涖傛病鏈変漢鑳藉淇濊瘉紼嬪簭鍐欏嚭鏉ヤ笉鐢ㄨ皟璇曞氨鍙互榪愯姝e父錛屼篃娌℃湁浜哄彲浠ヤ繚璇佺▼搴忔案榪滀笉浼氬嚭BUG銆傛墍浠ワ紝鐔熺粌浣跨敤璋冭瘯鍣ㄦ槸涓涓▼搴忓憳闇瑕佸叿澶囩殑鍩烘湰鎶鑳姐?/td> 浣跨敤IDE 瀛︿細浣跨敤IDE宸ュ叿涔熶細璁╀綘鐨勫伐浣滀簨鍗婂姛鍊嶃傛瘮濡傦紝VC++錛孍macs錛孍clipse絳夌瓑錛屽茍瑕佺煡閬撹繖浜汭DE鐨勯暱澶勫拰鐭銆?/td> 浣跨敤鐗堟湰鎺у埗 涓瀹氳瀛︿細浣跨敤鐗堟湰鎺у埗宸ュ叿錛屼粈涔堝彨mainline/trunk錛屼粈涔堝彨tag錛屼粈涔堝彨branch錛屾庝箞鍋歱atch錛屾庝箞merge浠g爜錛屾庝箞reverse錛屾庝箞鍒╃敤鐗堟湰鎺у埗宸ュ叿緇存姢涓嶅悓鐗堟湰鐨勮蔣浠躲傝繖鏄▼搴忓憳闇瑕佹槑鐨勭殑杞歡閰嶇疆綆$悊涓渶閲嶈鐨勪竴鍧椼?/td> 鍗曞厓嫻嬭瘯 鍗曞厓嫻嬭瘯鏄瘡涓▼搴忛兘闇瑕佸仛鐨勩傚緢澶氬崟鍏冩祴璇曚篃鏄渶瑕佺紪鐮佺殑銆備竴瀹氳瀛︿細鍦▁Unit妗嗘灦涓嬭繘琛屽崟鍏冩祴璇曘傛瘮濡侸Unit, NUnit, CppUnit絳夌瓑銆?/td> 閲嶆瀯浠g爜 姣忎釜紼嬪簭鍛橀兘闇瑕佹湁鏈鍩烘湰鐨勮兘鍔涘幓閲嶆瀯鐩墠宸叉湁鐨勪唬鐮侊紝浣夸唬鐮佽揪鍒版渶浼樹絾鍗翠笉鑳藉獎鍝嶄換浣曠殑宸叉湁鐨勫姛鑳姐傛湁涓鏈功鍙婅蔣浠剁殑閲嶆瀯銆嬶紝姣忎釜紼嬪簭鍛橀兘搴旇璇諱竴涓嬨?/td> 鑷姩鍖栫紪璇?/td> 紼嬪簭鍛橀渶瑕佷嬌鐢ㄤ竴涓剼鏈紝鍏惰兘鑷姩鍖栫紪紼嬫墍鏈夌殑宸ョ▼鍜屼唬鐮侊紝榪欐牱錛屾暣涓紑鍙戝洟闃熷彲浠ヤ笉鍋滃湴闆嗘垚浠g爜錛岃嚜鍔ㄥ寲嫻嬭瘯錛岃嚜鍔ㄥ寲閮ㄧ講錛屼互鍙婁嬌鐢ㄤ竴浜涘伐鍏瘋繘琛岄潤鎬佷唬鐮佸垎鏋愭垨鏄嚜鍔ㄥ寲嫻嬭瘯銆?/td>
鏈枃杞嚜錛?a style="font-family: verdana, 'courier new'; line-height: 21px;">http://coolshell.cn/articles/428.html
]]>
鍙互淇敼涓嬮潰灞炴э細
2銆?/span>VS2010緙栬瘧閿欒錛?/span>
fatal error C1189: #error : This file requires _WIN32_WINNT to be #defined at least to 0x
鍦ㄥ伐紼嬬殑stdafx.h涓坊鍔狅紙濡傛湁綾諱技璇彞錛岄渶娉ㄩ噴鎺夛級
#define WINVER 0x0501 // Change this to the appropriate value to target Windows 98 and Windows 2000 or later.
#endif
#ifndef _WIN32_WINNT // Allow use of features specific to Windows NT 4 or later.
#define _WIN32_WINNT 0x0501 // Change this to the appropriate value to target Windows 98 and Windows 2000 or later.
#endif
#ifndef _WIN32_WINDOWS // Allow use of features specific to Windows 98 or later.
#define _WIN32_WINDOWS 0x0501 // Change this to the appropriate value to target Windows Me or later.
#endif
#ifndef _WIN32_IE // Allow use of features specific to IE 4.0 or later.
#define _WIN32_IE 0x0601 // Change this to the appropriate value to target IE 5.0 or later.
#endif
]]>
1銆?/span>new A;
2銆?/span>new A();
涔熻寰堝浜哄寘鎷垜鑷繁錛岄兘鍙互椹笂緇欏嚭絎竴縐嶆儏鍐電殑絳旀錛氬湪鍫嗕笂涓?/span>A綾誨垎閰嶅唴瀛橈紝鐒跺悗璋冪敤A鐨勬瀯閫犲嚱鏁般傝繖縐嶈娉曡澶у鎵鐔熺煡錛屽洜涓哄寘鎷?/span>STL婧愮爜鍓栨瀽銆嬬瓑澶т綔鍦ㄥ唴涔熼兘鏄繖涔堝啓鐨勶紙浣嗘槸浣犺涓鴻繖縐嶈娉曞畬鍏ㄦ紜悧錛?/span>鍏跺疄涓嶅敖鐒訛紝絳旀鍚庨潰鎻檽)
絎簩縐嶆儏鍐碉紝瀵硅薄鏋勯犵殑鏃跺欏垵濮嬪寲鍒楄〃涓虹┖浼氬拰絎竴縐嶆湁浠涔堜笉鍚屽憿錛熷浜庤繖縐嶅湪瀹為檯宸ョ▼涓緢灝戜嬌鐢ㄧ殑鎯呭喌錛屾垜涓鏃惰繕鐪熺粰涓嶅嚭紜垏鐨勭瓟妗堛?/span>
緗戜笂鎼滀簡涓涓嬶紝鐪嬪埌CSDN閲岄潰榪樻湁涓撻棬閽堝榪欎釜闂鐨勪竴涓笘瀛愶紙鍘熷笘閾炬帴 http://bbs.csdn.net/topics/320161716錛夈?/span>
濂藉儚鏈緇堜篃娌℃湁鍙互淇℃湇鐨勭瓟妗堬紝璁ゅ悓搴︽瘮杈冮珮鐨勬槸榪欐牱鐨勮娉曪細“鍔犳嫭鍙瘋皟鐢ㄦ病鏈夊弬鏁扮殑鏋勯犲嚱鏁幫紝涓嶅姞鎷彿璋冪敤榛樿鏋勯犲嚱鏁版垨鍞竴鐨勬瀯閫犲嚱鏁幫紝鐪嬮渶姹?/span>” 錛?/span>peakflys娉細榪欑璇存硶鏄敊璇殑錛岀瓟妗堝悗闈㈡彮鏅擄級
鏃㈢劧娌℃湁鐗瑰埆闈犺氨鐨勭瓟妗堬紝涓嶅鑷繁鍔ㄦ墜鎵懼嚭絳旀銆?/span>
鏋勯犱互涓嬬ず渚嬶細
鏌ョ湅main鍑芥暟鐨勬眹緙栦唬鐮?/span>(緙栬瘧鍣細gcc (GCC) 4.4.6 20120305 (Red Hat 4.4.6-4) )
榪欑鎯呭喌鏄被鏄劇ず鎻愪緵鍚粯璁ゅ肩殑鏋勯犲嚱鏁般?/span>
鏌ョ湅姹囩紪瀹炵幇濡備笅錛?/span>
涓婇潰鐨勬眹緙栦唬鐮佸氨涓嶅湪娣誨姞娉ㄩ噴浜嗭紝鍥犱負涓ょ鎿嶄綔浜х敓鐨勬眹緙栦唬鐮佹槸涓鏍風殑錛岄兘鏄厛璋冪敤operator new鍒嗛厤鍐呭瓨錛岀劧鍚庤皟鐢ㄦ瀯閫犲嚱鏁般?/span>
涓婇潰鐨勬儏鍐靛湪VS2010涓嬮獙璇佹槸涓鏍風殑鎯呭喌錛屾湁鍏磋叮鐨勬湅鍙嬪彲浠ヨ嚜宸卞幓鐪嬶紝榪欓噷灝變笉鍐嶈創鍑?/span>VS2010涓嬬殑姹囩紪浠g爜浜嗐?/span>
閫氳繃涓婇潰鐨勫垎鏋愶紝瀵逛簬new A鍜?/span> new A() 鐨勫尯鍒?/span>錛屾垜浠彲浠ュ緱鍑轟笅闈㈢殑緇撹錛?/span>
1銆佺被浣撳惈鏈夋樉紺洪傚悎鍦伴粯璁ゆ瀯閫犲嚱鏁版椂錛?/span>new A鍜?/span>new A()鐨勪綔鐢ㄤ竴鑷達紝閮芥槸棣栧厛璋冪敤operator new鍒嗛厤鍐呭瓨錛岀劧鍚庤皟鐢ㄩ粯璁ゆ瀯閫犲嚱鏁板垵濮嬪寲瀵硅薄銆?/span>
2銆佺被浣撴棤鏄劇ず鏋勯犲嚱鏁版椂錛?/span>new A()棣栧厛璋冪敤operator new鏉ヤ負瀵硅薄鍒嗛厤鍐呭瓨錛岀劧鍚庝嬌鐢ㄧ┖鍊煎垵濮嬪寲瀵硅薄鎴愬憳鍙橀噺錛岃?/span>new A浠呬粎鏄皟鐢?/span>operator new鍒嗛厤鍐呭瓨錛屽璞$殑鎴愬憳鍙橀噺鏄棤鎰忎箟鐨勯殢鏈哄鹼紒 錛?/span>peakflys娉細瀵逛簬鍩烘湰鏁版嵁綾誨瀷錛屽int絳?/span> 閫傜敤姝ゆ潯錛?/span>
娉ㄦ剰鍒幫紝鐜板湪寰堝涔︾睄瀵?/span>new鎿嶄綔絎︾殑璇存槑閮藉瓨鍦ㄧ喊婕忥紝渚嬪銆?/span>STL婧愮爜鍓栨瀽銆嬩腑2.2.2鑺備腑鏈変互涓嬬殑鎻忚堪錛?/span>

浜嬪疄璇佹槑錛?/span>new Foo鐨勬搷浣滄槸鍚︽湁鏋勯犲嚱鏁扮殑璋冪敤鏄笉紜畾鐨勶紝鍏蜂綋瑕佺湅Foo綾諱綋閲屾槸鍚︽湁鏄劇ず鏋勯犲嚱鏁扮殑鍑虹幇銆?/span>
/*****************************************鍗庝附鍒嗗壊綰?/span>**************************************
琛ュ厖錛氬垰鎵嶅彂鐜幫紝鍦?/span>C++Primer絎洓鐗?/span>5.11鑺備腑錛屽凡緇忔湁浜嗗浜?/span>new A()鐨勮鏄庯細
We indicate that we want to value-initialize the newly allocated object by following the type nameby a pair of empty parentheses. The empty parentheses signal that we want initialization but arenot supplying a specific initial value. In the case of class types (such as string) that define their own constructors, requesting value-initialization is of no consequence: The object is initialized by running the default constructor whether we leave it apparently uninitialized orask for value-initialization. In the case of built-in types or types that do not define any constructors, the difference is significant錛?/span>
int *pi = new int; // pi points to an uninitialized int
int *pi = new int(); // pi points to an int value-initialized to 0
In the first case, the int is uninitialized; in the second case, the int is initialized to zero.
榪欓噷緇欏嚭鐨勮В閲婂拰涓婇潰鑷繁鍒嗘瀽鐨?/span>new A()鐨勮涓烘槸涓鑷寸殑銆?br />
/***************************************鍐嶆鍗庝附鍒嗗壊綰?/span>************************************
閴翠簬涓婇潰鐨勭粨璁烘槸閫氳繃GCC鍜?/span>VS2010寰楀嚭鐨勶紝鑰屼笖鏈夋湅鍙嬩篃鎻愬嚭鍚屾牱鐨勮川鐤戯紝涓轟簡紜畾榪欑緇撴灉鏄惁鏄紪璇戝櫒鐩稿叧鐨勶紝鍒氭墠鐗規剰鏌ョ湅浜嗕竴涓?/span>C++鐨勬爣鍑嗗寲鏂囨。銆?/span>
鎽樿嚜錛?/span>ISO/IEC 14882:2003(E) 5.3.4 - 15
— If the new-initializer is omitted:
— If T is a (possibly cv-qualified) non-POD class type (or array thereof), the object is default-initialized(8.5). If T is a const-qualified type, the underlying class type shall have a user-declared default constructor.
— Otherwise, the object created has indeterminate value. If T is a const-qualified type, or a (possibly cv-qualified) POD class type (or array thereof) containing (directly or indirectly) a member of const-qualified type, the program is ill-formed;
— If the new-initializer is of the form (), the item is value-initialized (8.5);
鎵浠ュ彲浠ョ‘瀹氾紝榪欑鎯呭喌瀹屽叏鏄紪璇戝櫒鏃犲叧鐨?/span>(褰撶劧閭d簺涓嶅畬鍏ㄦ寜鐓ф爣鍑嗗疄鐜扮殑緙栬瘧鍣ㄩ櫎澶?/span>)銆?/span>
浣嗘槸閫氳繃涓婇潰鏍囧噯鍖栨枃妗g殑鎻忚堪錛屾垜浠彲浠ョ湅鍑烘枃涓new A鍦ㄦ棤鏄劇ず鏋勯犲嚱鏁版椂鐨勬葷粨騫朵笉鏄壒鍒噯紜紝閴翠簬寰堝鍏徃閮芥湁榪欓亾闈㈣瘯棰?/span>(鎾囧幓榪欎簺棰樼洰鐨勫疄闄呰冨療鎰忎箟涓嶈)錛屾垜浠湁蹇呰鍐嶈ˉ鍏呬竴涓嬶細 瀵逛簬new A: 榪欐牱鐨勮鍙ワ紝鍐嶈皟鐢ㄥ畬operator new鍒嗛厤鍐呭瓨涔嬪悗錛屽鏋?/span>A綾諱綋鍐呭惈鏈?/span>POD綾誨瀷錛屽垯POD綾誨瀷鐨勬垚鍛樺彉閲忓浜庢湭瀹氫箟鐘舵侊紝濡傛灉鍚湁闈?/span>POD綾誨瀷鍒欒皟鐢ㄨ綾誨瀷鐨勯粯璁ゆ瀯閫犲嚱鏁般傝?/span> new A()鍦ㄨ繖浜涙儏鍐典笅閮戒細鍒濆鍖栥?/span>
PS錛氫及璁″緢澶氬叕鍙哥殑“姝g‘絳旀“ 涔熶笉涓瀹氭紜惂銆?/span>
鏈枃杞嚜錛?/span>http://www.shnenglu.com/peakflys/archive/2013/04/08/199208.html
l 鍍靛寲鎬э紙Rigidity錛夛細寰堥毦瀵圭郴緇熻繘琛屾敼鍔紝鍥犱負姣忎釜鏀瑰姩閮戒細榪嬌璁稿瀵圭郴緇熷叾浠栭儴鍒嗙殑鍏朵粬鏀瑰姩銆?/span>
l 鑴嗗急鎬э紙Fragility錛夛細瀵圭郴緇熺殑鏀瑰姩浼氬鑷寸郴緇熶腑鍜屾敼鍔ㄧ殑鍦版柟鍦ㄦ蹇典笂鏃犲叧鐨勮澶氬湴鏂瑰嚭鐜伴棶棰樸?/span>
l 鐗㈠浐鎬э紙Immobility錛夛細寰堥毦瑙e紑緋葷粺鐨勭籂緇擄紝浣夸箣鎴愪負涓浜涘彲鍦ㄥ叾浠栫郴緇熶腑閲嶇敤鐨勭粍浠躲?/span>
l 綺樻粸鎬э紙Viscosity錛夛細鍋氭紜殑浜嬫儏姣斿仛閿欒鐨勪簨鎯呰鍥伴毦銆?/span>
l 涓嶅繀瑕佺殑澶嶆潅鎬э紙Needless Complexity錛夛細璁捐涓寘鍚湁涓嶅叿浠諱綍鐩存帴濂藉鐨勫熀紜緇撴瀯銆?/span>
l 涓嶅繀瑕佺殑閲嶅錛?/span>Needless Repetition錛夛細璁捐涓寘鍚湁閲嶅鐨勭粨鏋勶紝鑰岃閲嶅鐨勭粨鏋勬湰鍙互浣跨敤鍗曚竴鐨勬娊璞¤繘琛岀粺涓銆?/span>
l 鏅︽訂鎬э紙Opacity錛夛細寰堥毦闃呰銆佺悊瑙c傛病鏈夊緢濂界殑琛ㄧ幇鍑烘剰鍥俱?br />
鏁忔嵎璁捐鏄竴涓繃紼嬶紝涓嶆槸涓涓簨浠躲傚畠鏄竴涓寔緇殑搴旂敤鍘熷垯銆佹ā寮忎互鍙婂疄璺墊潵鏀硅繘杞歡鐨勭粨鏋勫拰鍙鎬х殑榪囩▼銆傚畠鑷村姏浜庝繚鎸佺郴緇熻璁″湪浠諱綍鏃墮棿閮藉敖鍙兘寰楃畝鍗曘佸共鍑浠ュ強瀵屾湁琛ㄧ幇鍔?/span>銆?/span>
1銆傛垜浠渶浼樺厛瑕佸仛鐨勬槸閫氳繃灝芥棭鐨勩佹寔緇殑浜や粯鏈変環鍊肩殑杞歡鏉ヤ嬌瀹㈡埛婊℃剰銆?/strong>
銆銆 瑙勫垝榪唬鏁呬簨鏃跺繀欏繪寜鐓т紭鍏堢駭瀹夋帓錛屼負瀹㈡埛鍏堟彁渚涙渶鏈変環鍊肩殑鍔熻兘銆傞氳繃棰戠箒榪唬鑳戒笌瀹㈡埛褰㈡垚鏃╂湡鐨勮壇濂藉悎浣滐紝鍙婃椂鍙嶉鎻愰珮浜у搧璐ㄩ噺銆傛晱鎹峰皬緇勫叧娉ㄥ畬鎴愬拰浜?浠樺叿鏈夌敤鎴蜂環鍊肩殑鍔熻兘錛岃屼笉鏄绔嬬殑浠誨姟銆備互鍓嶆垜浠兘鐢ㄩ渶姹傝鏍艱鏄庝功鎴栬呯敤渚嬫潵緙栧啓璇︾粏鐨勯渶姹傦紝鏁忔嵎浣跨敤鐢ㄦ埛鏁呬簨鏉ョ綏鍒楅渶姹傘傜敤鎴鋒晠浜嬫槸涓縐嶈〃紺洪渶姹傜殑 杞婚噺綰ф妧鏈紝瀹冩病鏈?/span>
鍥哄畾鐨勫艦寮忓拰寮哄埗鎬х殑璇硶銆備絾鏄湁涓浜涘浐瀹氱殑褰㈠紡鍙互鐢ㄦ潵鍙傝冭繕鏄瘮杈冩湁鐩婄殑銆傛晱鎹蜂及綆椾腑浣跨敤浜嗚繖涓ā鏉匡細“浣滀負銆愮敤鎴風殑綾誨瀷銆戯紝鎴戝笇 鏈涘彲浠ャ愯兘鍔涖戜互渚褲愪笟鍔′環鍊箋?#8220;銆備嬌鐢ㄥ熀浜庣敤鎴鋒晠浜嬬殑闇姹傚垎鏋愭柟娉曟椂錛屼粛鍙兘闇瑕佸師鍨嬪拰緙栧啓鏂囨。錛屽彧鏄伐浣滈噸鐐規洿澶氱殑杞Щ鍒頒簡鍙eご浜ゆ祦銆?/span>
2銆傚嵆浣垮埌浜嗗紑鍙戠殑鍚庢湡錛屼篃嬈㈣繋鏀瑰彉闇姹傘傛晱鎹瘋繃紼嬪埄鐢ㄥ彉鍖栨潵涓哄鎴峰垱閫犵珵浜変紭鍔褲?/strong>
銆銆鏁忔嵎榪囩▼鍙備笌鑰呬笉鎬曞彉鍖栵紝浠栦滑璁や負鏀瑰彉闇姹傛槸濂戒簨鎯咃紝鍥犱負榪欎簺鏀瑰彉鎰忓懗鐫鎴戜滑鏇翠簡瑙e競鍦洪渶姹傘?/span>
3銆傜粡甯告х殑浜や粯鍙互宸ヤ綔鐨勮蔣浠訛紝浜や粯鐨勯棿闅斿彲浠ヤ粠鍑犲懆鍒板嚑涓湀錛屼氦浠樼殑鏃墮棿闂撮殧瓚婄煭瓚婂ソ銆?/strong>
銆 銆榪唬鏄彈瀹炶返妗嗛檺鍒剁殑錛屾剰鍛崇潃鍗充嬌鏀懼純涓浜涘姛鑳戒篃蹇呴』鎸夋椂緇撴潫榪唬銆傚彧瑕佹垜浠彲浠ヤ繚璇佷氦浠樼殑杞歡鍙互寰堝ソ鐨勫伐浣滐紝閭d箞浜や粯鏃墮棿瓚婄煭錛屾垜浠拰瀹㈡埛鍗忎綔灝辮秺 绱у瘑錛屽浜у搧璐ㄩ噺灝辨洿鏈夌泭銆傝櫧鐒舵垜浠嬈¤凱浠o紝浣嗗茍涓嶆槸姣忔榪唬鐨勭粨鏋滈兘闇瑕佷氦浠樼粰鐢ㄦ埛錛屾晱鎹峰紑鍙戠殑鐩爣鏄浠栦滑鍙互浜や粯銆傝繖鎰忓懗鐫寮鍙戝皬緇勫湪姣忔榪唬涓?閮戒細澧炲姞涓浜涘姛鑳斤紝澧炲姞鐨勬瘡涓姛鑳介兘鏄粡榪囩紪鐮併佹祴璇曪紝杈懼埌浜嗗彲鍙戝竷鐨勮川閲忔爣鍑嗙殑銆?/span>
銆銆鍙﹀鏁忔嵎寮鍙戦」鐩腑瀵瑰紑鍙戦樁孌墊病鏈変粈涔堥噸瑕佺殑鍒嗗壊錛屾病鏈夊厛鏈熺殑闇姹傞樁孌碉紝鐒跺悗鏄垎鏋愰樁孌碉紝鏋舵瀯璁捐闃舵錛岀紪鐮佹祴璇曢樁孌電瓑錛屽湪欏圭洰鐪熸寮濮嬪悗錛屾瘡嬈¤凱浠d腑閮戒細鍚屾椂榪?/span>
琛屾墍鏈夌殑涓婅堪闃舵宸ヤ綔銆?/span>
4銆傚湪鏁翠釜欏圭洰寮鍙戞湡闂達紝涓氬姟浜哄憳鍜屽紑鍙戜漢鍛樺繀欏誨ぉ澶╅兘鍦ㄤ竴璧峰伐浣溿?/strong>
銆銆杞歡欏圭洰涓嶄細渚濈収涔嬪墠璁懼畾鐨勮鍒掑師璺墽琛岋紝涓棿瀵逛笟鍔$殑鐞嗚В銆佽蔣浠剁殑瑙e喅鏂規鑲畾浼氬瓨鍦ㄥ亸宸紝鎵浠ュ鎴楓侀渶姹備漢鍛樸佸紑鍙戜漢鍛樹互鍙婃秹浼椾箣闂村繀欏昏繘琛屾湁鎰忎箟鐨勩侀綣?nbsp;
鐨勪氦浜掞紝榪欐牱灝卞彲浠ュ湪鏃╂湡鍙婃椂鐨勫彂鐜板茍瑙e喅闂銆?/span>
5銆傚洿緇曡嬋鍔辮搗鏉ョ殑浜轟釜鏉ユ瀯寤洪」鐩傜粰浠栦滑鎻愪緵鎵闇瑕佺殑鐜鍜屾敮鎸侊紝騫朵笖淇′換浠栦滑鑳藉瀹屾垚宸ヤ綔銆?/strong>
銆銆涓氬姟鍜屾妧鏈槸寮曡搗涓嶇‘瀹氱殑浜屼釜涓昏鏂歸潰錛屼漢鏄涓変釜鏂歸潰銆傝屼笟鍔″拰鎶鏈張蹇呴』鐢變漢鏉ユ墽琛岋紝鎵浠ヨ兘澶熸縺鍔變漢鏉ヨВ鍐寵繖浜涢棶棰樻槸瑙e喅涓嶇‘瀹氭х殑鍏抽敭銆傚彧瑕佷釜浜虹殑鐩爣鍜屽洟
闃熺殑鐩爣涓鑷達紝鎴戜滑灝遍渶瑕侀紦鑸炶搗姣忎釜浜虹殑縐瀬鎬э紝浠ヤ釜浜轟負涓績鏋勫緩欏圭洰錛屾彁渚涙墍闇鐨勭幆澧冦佹敮鎸佷笌淇′換銆?/span>
6銆傚湪鍥㈤槦鍐呴儴錛屾渶鍏鋒湁鏁堟灉騫朵笖瀵屾湁鏁堢巼鐨勪紶閫掍俊鎭殑鏂規硶錛屽氨鏄潰瀵歸潰鐨勪氦璋堛?/strong>
銆銆鍦ㄥ崄鍑犳垨鑰呬簩鍗佸嚑涓漢緇勬垚鐨勫ぇ鍥㈤槦涓紝鏂囨。鏄竴縐嶆瘮杈冨悎閫傜殑浼犻掔煡璇嗗拰浜ゆ祦鐨勯斿緞銆傝屾晱鎹峰洟闃熶竴鑸笉浼氬緢澶氫漢錛堝ぇ鍥㈤槦瀹炴柦鏁忔嵎鏃朵篃浼氬垎鎴愬涓皬鐨勬晱鎹峰洟闃燂級錛屾墍浠?/span>
澶ч噺鐨勬枃妗d氦嫻佸叾瀹炲茍涓嶆槸寰堢粡嫻庣殑鍋氭硶銆傛鏃墮潰瀵歸潰鐨勪氦璋堝弽鑰屾洿蹇熸湁鏁堛?/span>
7銆佸彲宸ヤ綔鐨勮蔣浠舵槸棣栬榪涘害搴﹂噺鏍囧噯銆?/strong>
銆 銆涓鑸殑宸ヤ綔閮芥瘮杈冨鏄撹 閲忎換鍔¤繘灞曪紝姣斿璁╀綘鍘繪惉榪?鍚ㄧ殑鐭沖ご錛屾垜鍙鍘葷О涓涓嬩綘宸茬粡鎼繍鐨勭煶澶撮噸閲忓氨鐭ラ亾浣犲畬鎴愬灝戜簡銆傝屽浜庤蔣浠舵潵璇達紝鍦ㄨ蔣浠舵病鏈夌紪 鐮併佹祴璇曞畬
鎴愪箣鍓嶏紝鎴戜滑閮戒笉鑳藉洜涓轟唬鐮佺紪鍐欎簡澶氬皯琛岋紝嫻嬭瘯鐢ㄤ緥璺戜簡澶氬皯涓氨鍘誨害閲忚繖涓姛鑳芥槸鍚﹀畬鎴愪簡銆傝 閲忚繖涓姛鑳芥槸鍚﹀畬鎴愮殑棣栬鏍囧噯灝辨槸榪欎釜鍔熻兘鍙互宸?浣滀簡錛屽鐢ㄦ埛鏉ヨ宸茬粡鍙?/span>
浠ュ簲鐢ㄤ簡銆?/span>
8銆傛晱鎹瘋繃紼嬫彁鍙寔緇殑寮鍙戦熷害銆傝矗浠諱漢銆佸紑鍙戣呭拰鐢ㄦ埛搴旇鑳藉淇濇寔涓涓暱鏈熺殑銆佹亽瀹氱殑寮鍙戦熷害銆?/strong>
銆 銆寰堝浜洪兘璁や負杞歡寮鍙戜腑鍔犵彮鏄緢姝e父鐨勶紝涓嶅姞鐝弽鑰屼笉姝e父錛屾垜瀵規鏈夌偣涓嶇悊瑙o紝榪欎釜鍙兘鏄浗鎯呮墍鑷村惂銆傛晱鎹瘋繃紼嬪笇鏈涜兘澶熷彲鎸佺畫鐨勮繘琛屽紑鍙戯紝寮鍙戦熷害涓嶄細 闅忕潃榪唬鐨勪換鍔′笉鍚岃屼笉鍚岋紝涓嶆璧忔墍璋撶殑鎷間竴鎷間篃鑳藉畬鎴愮殑鎬佸害錛屽紑鍙戝伐浣滀笉搴旇鏄獊鍑昏涓恒傛垜浠笉鑳芥寚鏈涜紿佸嚮榪欎釜欏圭洰鍚庡氨鍙互杞繪澗浜嗭紝鍥犱負瀹屾垚涓涓」鐩?鍚庝細鎺ヨ傅鑰屾潵涓嬩竴涓」鐩紝鑰屽彧瑕佽繕鏄嫾鎷肩殑鎬佸害錛屼笅涓涓」鐩緷鏃т細璁╀綘鐨勭粍鍛樺啀嬈$獊鍑匯傝繖鏃朵笉鐭ラ亾鏈変漢浼氫笉浼氳錛岄偅鎴戜滑灝變竴鐩村姞鐝紝涔熸槸“鎸佺畫鐨勫紑鍙戦?搴?#8221;鍟婏紝榪欐椂鍙娉ㄦ剰浜嗭紝鎸佺畫鍔犵彮鏅?/span>
鎱у鑷翠漢鐤插姵銆佸帉鍊︼紝淇濇寔闀挎湡鎭掑畾鐨勯熷害涔熷彧鏄竴縐嶇悊鎯寵屽凡銆?/span>
9銆備笉鏂湴鍏蟲敞浼樼鐨勬妧鑳藉拰濂界殑璁捐浼氬寮烘晱鎹瘋兘鍔涖?/strong>
銆銆鏁忔嵎榪囩▼鏈夊緢澶氬ソ鐨勬妧鏈疄璺靛彲浠ュ姞寮轟駭鍝佹晱鎹瘋兘鍔涳紝寰堝鍘熷垯銆佹ā寮忓拰瀹炶返涔熷彲浠ュ寮烘晱鎹峰紑鍙戣兘鍔涖?銆婃晱鎹瘋蔣浠跺紑鍙戯紞鍘熷垯銆佹ā寮忎笌瀹炶返銆嬩竴涔︿腑浠嬬粛浜嗗緢澶氳璁★紝鎰熷叴瓚g殑鍙互鍘諱粩緇嗙湅鐪嬨?/span>
10銆傜畝鍗?---浣挎湭瀹屾垚鐨勫伐浣滄渶澶у寲鐨勮壓鏈?---鏄牴鏈殑銆?/strong>
銆 銆鎴戜滑涓嶅彲鑳介鏈熷悗闈㈤渶姹備細濡備綍鍙樺寲錛屾墍浠ヤ笉鍙兘涓寮濮嬪氨鏋勫緩涓涓畬緹庣殑鏋舵瀯鏉ラ傚簲浠ュ悗鐨勬墍鏈夊彉鍖栥傛晱鎹峰洟闃熶笉浼氬幓鏋勫緩鏄庡ぉ鐨勮蔣浠訛紝鑰屾妸娉ㄦ剰鍔涙斁鍦ㄥ浣曢?榪囨渶綆鍗曠殑鏂規硶瀹屾垚鐜板湪闇瑕佽В鍐崇殑闂銆傝繖鏃舵湁浜轟細璇達紝鎴戝凡緇忛璁″埌浜嗚偗瀹氬瓨鍦ㄥ摢浜涢渶姹傛墿灞曠偣錛屾垜浠湪涓寮濮嬫槸鍚﹂渶瑕佽冭檻鍛紵榪欐椂鍥㈤槦闇瑕佹牴鎹嚜宸辯殑鐞嗚В 鍘誨喅瀹氭槸鍚﹁冭檻錛屽鏋滄繁淇″湪鏄庡ぉ鍙戠敓浜嗚繖涓棶棰樹篃鍙互杞繪槗澶勭悊鐨勮瘽錛岄偅涔堝氨鏈濂藉厛涓嶈冭檻銆?/span>
11銆傛渶濂界殑鏋勬灦銆侀渶姹傚拰璁捐鍑鴻嚜涓庤嚜緇勭粐鐨勫洟闃熴?/strong>
鏁忔嵎涓湁寰堝縐嶅疄璺碉紝澶у閮界煡閬擄紝榪唬寮忓紑鍙戞槸涓昏鐨勫疄璺墊柟娉曪紝鑰岃嚜緇勭粐鍥㈤槦涔熸槸涓昏鐨勫疄璺典箣涓銆傚湪鑷粍緇囧洟闃熶腑錛岀鐞嗚呬笉鍐嶅彂鍙鋒柦浠わ紝鑰屾槸璁╁洟闃熻嚜韜鎵炬渶浣崇殑宸ヤ綔鏂瑰紡鏉ュ畬鎴愬伐浣溿傝褰㈡垚涓涓嚜緇勭粐鍥㈤槦鍏跺疄姣旇緝闅俱侰SDN閲囪Mishkin Berteig涓鍒?鑷粍緇囧洟闃熺殑絎竴涓绱犲氨鏄繀欏繪湁涓涓洟闃燂紝鑰屼笉浠呬粎鏄竴緹や漢銆備竴緹や漢鏄竴甯湪涓璧峰伐浣滅殑浜猴紝浠栦滑褰兼涔嬮棿騫舵病鏈夊お澶氱殑娌熼氾紝浠栦滑涔熷茍涓嶈褰兼涓轟竴浣撱傞」鐩竴寮濮嬶紝鎴戜滑灝變細緇勫緩“鍥㈤槦”錛屼絾寰堝鏃跺欑敱鏋勬灦甯堛侀渶姹備漢鍛樸佸紑鍙戜漢鍛樺拰嫻嬭瘯浜哄憳緇勬垚鐨勬槸涓緹や漢鑰屽凡銆備粬榪樿涓猴紝鍥㈤槦鐨勫艦鎴愬繀欏葷粡鍘嗗嚑涓椂鏈熴傚湪 緇忓巻浜嗗垵鏈熺殑紓ㄥ悎鍚庯紝鎴愬憳鎵嶄細寮濮嬪鍥㈤槦鍏卞悓鐨勫伐浣滅悊蹇典笌鏂囧寲褰㈡垚涓涓熀鏈殑璁よ瘑鍜岀悊瑙c傚洟闃熷唴浼氶愭笎褰㈡垚瑙勭煩錛岃屼笖榪欎簺瑙勭煩鏄笉璦鑰屽柣鐨勩傛瘮濡傦紝姣忎釜浜?閮界煡閬撲笂鍗堜節鐐規潵涓婄彮錛岄兘浼氫富鍔ㄨ闂埆浜烘槸鍚﹂渶瑕佸府鍔╋紝涔熼兘浼氬幓涓誨姩鍜屽埆浜烘帰璁ㄩ棶棰樸傚鏋滃洟闃熸垚鍛樹箣闂磋兘澶熻揪鎴愯繖鏍風殑榛樺錛岄偅涔堣繖涓洟闃熷皢鎴愪負涓涓湡姝i珮 鏁堢殑宸ヤ綔鍥㈤槦銆傚湪榪欐牱鍥㈤槦涓紝鎴愬憳涔嬮棿鐩鎬簰鐞嗚В錛屽伐浣滄晥鐜囬潪甯擱珮銆傚湪鑷粍緇囧洟闃熶腑錛屽洟闃熸垚鍛樹笉闇瑕侀伒浠庡埆浜虹殑璇︾粏鎸囦護銆備粬浠渶瑕佹洿楂樺眰嬈$殑鎸囧錛岃繖縐嶆寚 瀵兼洿鍍忔槸涓涓洰鏍囷紝涓涓嚧鍔涗簬寮鍙戝嚭鏇村ソ鐨勮蔣浠剁殑鐩爣銆傛諱箣錛岃嚜緇勭粐鍥㈤槦鏄竴涓嚜鍔ㄨ嚜鍙戙佹湁鐫鍏卞悓鐩爣鍜屽伐浣滄枃鍖栫殑鍥㈤槦錛岃繖鏍風殑鍥㈤槦鎬繪槸鍦ㄥ悜瀹冪殑緇勭粐鍋氬嚭 鎵胯銆備絾鏄紝瀹炵幇榪欎簺鎵胯瀵逛簬鑷粍緇囧洟闃熸潵璇撮潪甯擱噸瑕併傚惁鍒欙紝涓鏃﹀嚭鐜伴棶棰橈紝鍥㈤槦鎴愬憳涔嬮棿灝變細鍑虹幇淇′換鍗辨満銆?/span>
銆銆铏界劧鏁忔嵎寮鍙戝皬緇勬槸浠ュ皬緇勪負鏁翠綋 鏉ュ伐浣滅殑錛屼絾鏄繕鏄湁蹇呰鎸囨槑涓浜涙壙鎷呬竴瀹氫換鍔$殑瑙掕壊銆傜涓涓鑹叉槸浜у搧鎵鏈夎咃紙Product Owner錛夈備駭鍝佹墍鏈夎呯殑涓昏鑱岃矗鍖呮嫭錛氱‘璁ゅ皬緇勬墍鏈夋垚鍛橀兘鍦ㄨ拷姹備竴涓叡鍚岀殑欏圭洰鍓嶆櫙錛岀‘瀹氬姛鑳界殑浼樺厛綰т互渚挎繪槸鍦ㄥ鐞嗘渶鍏鋒湁浠峰肩殑鍔熻兘錛屼互鍙婁綔鍑哄喅瀹?浣垮緱瀵歸」鐩殑鎶曞叆鍙互浜х敓鑹ソ鐨勫洖鎶ャ傚彲浠ュ搴斾負浠ュ墠寮鍙戜腑鐨?#8220;浜у搧緇忕悊”銆傚彟涓瑙掕壊鏄紑鍙戝洟闃燂紙developer錛夛紝榪欓噷鐨勫紑鍙戜漢鍛樺寘鎷簡鏋舵瀯甯堛佽璁″笀銆佺▼搴忓憳銆侀渶姹備漢鍛樸佹祴璇曚漢鍛樸佹枃妗g紪鍐欒呯瓑錛屾湁鏃朵駭鍝佹墍鏈夎呬篃鍙互琚湅浣滄槸
寮鍙戜漢鍛樸傝繕鏈変竴涓噸瑕佽鑹插氨鏄」鐩粡鐞嗭紙project manager錛夈傛晱鎹峰紑鍙戠殑欏圭洰緇忕悊浼氭洿澶氱殑鍏蟲敞棰嗗鑰屼笉鏄鐞嗐傚湪鏌愪簺欏圭洰涓紝欏圭洰緇忕悊鍙兘鍚屾椂涔熸槸寮鍙戜漢鍛橈紝灝戞暟鏃跺欎篃浼氭媴浠諱駭鍝佹墍鏈夎呫?/span>
銆銆
12銆傛瘡闅斾竴瀹氭椂闂達紝鍥㈤槦浼氬湪濡備綍鎵嶈兘鏇存湁鏁堝湴宸ヤ綔鏂歸潰榪涜鍙嶇渷錛岀劧鍚庣浉搴斿湴瀵硅嚜宸辯殑琛屼負榪涜璋冩暣銆?/strong>
銆銆鐢變簬寰堝涓嶇‘瀹氭у洜绱犱細瀵艱嚧璁″垝澶辨晥錛屾瘮濡傞」鐩垚鍛樺鍑忋佹妧鏈簲鐢ㄦ晥鏋溿佺敤鎴烽渶姹傜殑鏀瑰彉銆佺珵浜夎呭鎴戜滑鐨勫獎鍝嶇瓑閮戒細璁╂垜浠綔鍑轟笉鍚岀殑鍙嶅簲銆傘鏁忔嵎涓嶆槸鍩轟簬棰勫畾涔夌殑宸ヤ綔鏂瑰紡錛岃屾槸鍩轟簬緇忛獙鎬х殑鏂瑰紡錛屽浠ヤ笂榪欎簺鍙樺寲錛屽皬緇勯氳繃涓嶆柇鐨勫弽鐪佽皟鏁存潵淇濇寔鍥㈤槦鐨勬晱鎹鋒с?/span>
l 鍗曚竴鑱岃矗鍘熷垯錛?/span>The Single Responsibility Principle錛岀畝縐?/span>SRP錛夛細灝變竴涓被鑰岃█錛屽簲璇ヤ粎鏈変竴涓紩璧峰畠鍙樺寲鐨勫師鍥?/span>銆傚湪SRP涓紝鎴戜滑鎶婅亴璐e畾涔変負“鍙樺寲鐨勫師鍥狅紙錛?#8221;銆傚鏋滀綘鑳藉鎯沖埌澶氫簬涓涓殑鍔ㄦ満鍘繪敼鍙樹竴涓被錛岄偅涔堣繖涓被灝卞叿鏈夊浜庝竴涓殑鑱岃矗銆傝蔣浠惰璁$湡姝h鍋氱殑璁稿鍐呭錛屽氨鏄彂鐜拌亴璐e茍鎶婇偅浜涜亴璐g浉浜掑垎紱匯?/span>浜嬪疄涓婏紝鎴戜滑灝嗚璁鴻堪鐨勫叾浣欏師鍒欓兘浼氫互榪欐牱鎴栭偅鏍風殑鏂瑰紡鍥炲埌榪欎釜闂涓娿?/span>
l 寮鏀懼皝闂師鍒?/span>錛?/span>The Open-Close Principle錛岀畝縐?/span>OCP錛夛細杞歡瀹炰綋錛堢被銆佹ā鍧椼佸嚱鏁扮瓑絳夛級搴旇鏄彲浠ユ墿灞曠殑錛屼絾鏄笉鍙互淇敼鐨?/span>銆傞伒寰紑鏀懼皝闂師鍒欒璁″嚭鐨勬ā鍧楀叿鏈変袱涓富瑕佺殑鐗瑰緛銆傚畠浠槸錛氾紙1錛夈佸浜庢墿灞曟槸寮鏀劇殑銆傝繖鎰忓懗鐫妯″潡鐨勮涓烘槸鍙互鎵╁睍鐨勩傚綋搴旂敤鐨勯渶姹傛敼鍙樻椂錛屾垜浠彲浠ュ妯″潡榪涜鎵╁睍錛屼嬌鍏跺叿鏈夋弧瓚抽偅浜涙敼鍙樼殑鏂拌涓恒傛崲鍙ヨ瘽璇達紝鎴戜滑鍙互鏀瑰彉妯″潡鐨勫姛鑳姐傦紙2錛夈佸妯″潡琛屼負榪涜鎵╁睍鏃訛紝涓嶅繀鏀瑰姩妯″潡鐨勬簮浠g爜鎴栬呬簩榪涘埗浠g爜銆傛ā鍧楃殑浜岃繘鍒跺彲鎵ц鐗堟湰錛屾棤璁烘槸鍙摼鎺ョ殑搴撱?/span>DLL鎴栬?/span>Java鐨?/span>.jar鏂囦歡錛岄兘鏃犻渶鏀瑰姩銆?/span>
l Liskov鏇挎崲鍘熷垯錛?/span>The Liskov Substitution Principle錛岀畝縐?/span>LSP錛夛細瀛愮被鍨嬪繀欏昏兘澶熸浛鎹㈡帀瀹冧滑鐨勫熀綾誨瀷銆?/span>OCP鍘熷垯鏄?/span>OOD涓緢澶氳娉曠殑鏍稿績銆?/span>LSP鏄嬌OCP鎴愪負鍙兘鐨勪富瑕佸師鍒欎箣涓銆傛寮忓瓙綾誨瀷鐨勫彲鏇挎崲鎬ф墠浣垮緱浣跨敤鍩虹被綾誨瀷鐨勬ā鍧楀湪鏃犻渶淇敼鐨勬儏鍐典笅灝卞彲浠ユ墿灞曘傝繖縐嶅彲鏇挎崲鎬у繀欏繪槸寮鍙戜漢鍛樺彲浠ラ殣寮忎緷璧栫殑涓滆タ銆?/span>
l 渚濊禆鍊掔疆鍘熷垯錛?/span>The Dependency Inversion Principle錛岀畝縐?/span>DIP錛夛細錛?/span>1錛夈侀珮灞傛ā鍧椾笉搴旇渚濊禆浜庡簳灞傛ā鍧椼備簩鑰呴兘搴旇渚濊禆浜庢娊璞?/span>銆傦紙2錛夈佹娊璞′笉搴旇渚濊禆浜庣粏鑺傘傜粏鑺傚簲璇ヤ緷璧栦簬鎶借薄銆備嬌鐢ㄤ紶緇熺殑榪囩▼鍖栬璁℃墍鍒涘緩鍑烘潵鐨勪緷璧栧叧緋葷粨鏋勶紝絳栫暐鏄緷璧栦簬緇嗚妭鐨勩傞潰鍚戝璞$殑紼嬪簭璁捐鍊掔疆浜嗕緷璧栧叧緋葷粨鏋勶紝浣垮緱緇嗚妭鍜岀瓥鐣ラ兘渚濊禆浜庢娊璞★紝騫朵笖甯稿父鏄鎴鋒嫢鏈夋湇鍔℃帴鍙c備簨瀹炰笂錛岃繖縐嶄緷璧栧叧緋繪寮忓ソ鐨勯潰鍚戝璞¤璁$殑鏍囧織鎵鍦ㄣ?/span>
l 鎺ュ彛闅旂鍘熷垯錛?/span>The Interface Segregation Interface錛岀畝縐?/span>ISP錛夛細涓嶅簲璇ュ己榪鎴蜂緷璧栧畠浠笉鐢ㄧ殑鏂規硶銆傚鏋滃己榪鎴風▼搴忎緷璧栦簬閭d簺瀹冧滑涓嶉傜敤鐨勬柟娉曪紝閭d箞榪欎簺瀹㈡埛紼嬪簭灝遍潰涓寸潃鐢變簬榪欎簺鏈嬌鐢ㄦ柟娉曠殑鏀瑰彉鎵甯︽潵鐨勫彉鏇淬傝繖灝辨棤鎰忎腑瀵艱嚧浜嗘墍鏈夊鎴風▼搴忎箣闂寸殑鑰﹀悎銆傛垜浠笇鏈涘敖鍙兘鍦伴伩鍏嶈繖縐嶈﹀悎錛屽洜姝ゆ垜浠笇鏈涘垎紱繪帴鍙c?/span>
鏋侀檺緙栫▼錛?/span>eXtreme Programming錛岀畝縐?/span>XP錛夋槸鏁忔嵎鏂規硶涓渶钁楀悕鐨勪竴涓傚畠鐢變竴緋誨垪綆鍗曞嵈鐩鎬簰渚濊禆鐨勬椂闂寸粍鎴愩傝繖浜涘疄璺電粨鍚堝湪涓璧峰艦鎴愪簡涓涓儨浜庨儴鍒嗙粨鍚堢殑鏁翠綋銆傚叾涓竴涓潪甯擱噸瑕佺殑錛屽綋鍓嶄篃鍙楀埌鏍煎閲嶈鐨勫疄璺靛氨鏄?/span>TDD錛堟祴璇曢┍鍔ㄧ殑寮鍙戞柟娉曪級銆?/span>
鍦ㄦ祴璇曢┍鍔ㄧ殑寮鍙戞柟娉曚腑錛岀紪鍐欐墍鏈夌殑浠g爜鐨勭洰鐨勯兘鏄負浜嗕嬌澶辮觸鐨勫崟鍏冩祴璇曡兘澶熼氳繃銆傞鍏堢紪鍐欎竴涓崟鍏冩祴璇曪紝鐢變簬瀹冭嫻嬭瘯鐨勫姛鑳借繕涓嶅湪錛屾墍浠ュ畠浼氳繍琛屽け璐ャ傜劧鍚庣紪鍐欎唬鐮佷嬌嫻嬭瘯閫氳繃銆?/span>
緙栧啓嫻嬭瘯鐢ㄤ緥鍜屼唬鐮佷箣闂寸殑鏇磋凱閫熷害鏄緢蹇殑錛屽熀鏈笂鍑犲垎閽熷乏鍙熾傛祴璇曠敤渚嬪拰浠g爜鍏卞悓婕斿寲錛屽叾涓祴璇曠敤渚嬪驚搴忔笎榪涘湴瀵逛唬鐮佺殑緙栧啓榪涜鎸囧銆備綔涓虹粨鏋滐紝涓涓潪甯稿畬鏁寸殑嫻嬭瘯鐢ㄤ緥闆嗗拰浠g爜涓璧峰彂灞曡搗鏉ャ?/span>
嫻嬭瘯綺楃暐鐨勫彲浠ュ垎涓哄崟鍏冩祴璇曞拰楠屾敹嫻嬭瘯銆傚崟鍏冩祴璇曟槸鐢ㄦ潵楠岃瘉緋葷粺涓釜鍒満鍒剁殑鐧界洅嫻嬭瘯銆?/span>
鍗曞厓嫻嬭瘯鐢ㄦ潵楠岃瘉緋葷粺鐨勫皬鐨勭粍鎴愬崟鍏冨簲璇ユ寜鐓ф墍鏈熸湜鐨勬柟寮忓伐浣滐紝浣嗘槸瀹冧滑娌℃湁楠岃瘉緋葷粺浣滀負涓涓暣浣撴椂宸ヤ綔鐨勬紜с傛墍浠ワ紝鍗曞厓嫻嬭瘯鏄繀瑕佺殑錛屼絾鏄笉澶熷厖鍒嗐?/span>
楠屾敹嫻嬭瘯鏄敤鏉ラ獙璇佺郴緇熸弧瓚沖鎴烽渶姹傜殑榛戠洅嫻嬭瘯銆傞獙鏀舵祴璇曠敱涓嶄簡瑙g郴緇熷唴閮ㄦ満鍒剁殑浜虹紪鍐欍傞獙鏀舵祴璇曟槸紼嬪簭錛屽洜姝ゆ槸鍙繍琛岀殑銆傞氬父閫氳繃浣跨敤涓撻棬涓哄簲鐢ㄧ▼搴忕殑瀹㈡埛鍒涘緩鐨勮剼鏈璦鏉ョ紪鍐欓獙鏀舵祴璇曘傛濡傚崟鍏冩祴璇曚綔涓哄彲緙栬瘧銆佽繍琛岀殑鏈夊叧緋葷粺鍐呴儴緇撴瀯鐨勬枃妗i偅鏍鳳紝楠屾敹嫻嬭瘯鏄湁鍏崇郴緇熺壒鎬х殑鍙紪璇戙佹墽琛岀殑鏂囨。銆?/span>
緙栧啓浠g爜鍓嶅氨緙栧啓鍗曞厓嫻嬭瘯浼氬甫鏉ュ洓涓緢鏄庢樉鐨勫ソ澶勶細
1銆侀鍏堢紪鍐欐祴璇曚嬌寰楃▼搴忎腑鐨勬瘡涓欏瑰姛鑳介兘鏈夋祴璇曟潵楠岃瘉瀹冪殑鎿嶄綔鐨勬紜с傝繖灝卞彲浠ョ粰浠ュ悗鐨勫紑鍙戞彁渚涙敮鎻達紝浣挎垜浠彲浠ユ洿鑷敱鍦板紼嬪簭榪涜鏇存敼錛屽洜涓烘祴璇曞彲浠ュ憡璇夋垜浠▼搴忎粛鐒跺叿鏈夋紜殑琛屼負銆?/span>
2銆侀鍏堢紪鍐欐祴璇曡揩浣挎垜浠繀欏諱粠紼嬪簭璋冪敤鑰呯殑鏈夊埄瑙嗚鍘昏瀵熸垜浠皢瑕佺紪鍐欑殑紼嬪簭銆傝繖鏍鳳紝鎴戜滑灝變細鍦ㄥ叧娉ㄧ▼搴忕殑鍔熻兘鐨勫悓鏃訛紝鐩存帴鍏蟲敞瀹冪殑鎺ュ彛錛屾垜浠篃灝卞彲浠ヨ璁″嚭渚夸簬璋冪敤鐨勮蔣浠躲?/span>
3銆侀鍏堢紪鍐欐祴璇曡揩浣挎垜浠妸紼嬪簭璁捐涓哄彲嫻嬭瘯鐨勩備負浜嗘妸紼嬪簭璁捐涓烘槗浜庤皟鐢ㄥ拰鍙祴璇曠殑錛岀▼搴忓繀欏誨拰瀹冨懆杈圭幆澧冭В鑰︺傝繖鏍烽鍏堢紪鍐欐祴璇曡揩浣挎垜浠В闄よ蔣浠朵腑鐨勮﹀悎銆傞潰鍚戝璞¤璁$殑鍘熷垯鍦ㄨ繘琛岃繖縐嶈В闄よ﹀悎鏂歸潰鍏鋒湁宸ㄥぇ鐨勫府鍔╀綔鐢ㄣ?/span>
4銆侀鍏堢紪鍐欐祴璇曠殑鍙︿竴涓噸瑕佹晥鏋滄槸錛屾祴璇曞彲浠ヤ綔涓轟竴縐嶆棤浠風殑鏂囨。褰㈠紡銆傛祴璇曞氨鍍忎竴濂楄寖渚嬶紝瀹冨府鍔╁叾浠栫▼搴忓憳浜嗚В濡備綍浣跨敤浠g爜銆傝繖浠芥枃妗f槸鍙紪璇戙佸彲榪愯鐨勩傚畠淇濇寔鏈鏂般傚畠涓嶄細鎾掕皫銆?/span>
棣栧厛緙栧啓楠屾敹嫻嬭瘯鐨勮涓哄浜庣郴緇熺殑鏋舵瀯鏂歸潰鍏鋒湁娣辮繙鐨勫獎鍝嶃備負浜嗕嬌緋葷粺鍏鋒湁鍙祴璇曟э紝灝卞繀欏昏鍦ㄥ緢楂樼殑緋葷粺鏋舵瀯灞傞潰瀵圭郴緇熻繘琛岃В鑰﹀悎銆傛濡傚崟鍏冩祴璇曞彲浠ヤ績浣夸綘鍦ㄥ皬鐨勬柟闈㈠彲浠ュ仛鍑轟紭鑹殑璁捐鍐崇瓥涓鏍鳳紝楠屾敹嫻嬭瘯鍙互淇冧嬌浣犲湪澶х殑鏂歸潰鍋氬嚭浼樿壇鐨勭郴緇熸灦鏋勫喅絳栥?br />
杞歡澶у笀銆?/span>C++涔嬬埗Bjarne Stroustrup鏇劇粡璇磋繃錛氳璁″拰緙栫▼閮芥槸浜虹殑媧誨姩銆傚繕璁頒簡榪欎竴鐐癸紝灝嗕細澶卞幓涓鍒?/span>銆傛晱鎹瘋蔣浠跺紑鍙戞柟娉曟鏄璇嗗埌杞歡寮鍙戠殑榪欎竴鏈川鐗瑰緛鑰屾彁鍑虹殑闈╂柊鎬у紑鍙戞柟娉曘備嬌鐢ㄦ晱鎹峰紑鍙戞柟娉曚細緇欐垜浠甫鏉ュ法澶х殑濂藉銆傚綋鐒惰瀹屽叏鍋氬埌涔熸槸寰堝洶闅劇殑銆傝繖涓嶄粎闇瑕佸鏁忔嵎鐨勬繁鍒葷悊瑙o紝鏇撮渶瑕佹晱鎹峰洟闃熸垚鍛樼殑鍏卞悓鍔姏銆?/span>
鎴戜滑甯稿父浼氶氳繃瑙傛懇鏉頒綔浣撲細騫跺涔犺壓鏈殑綺鵑珦錛岃屽彲鎵╁睍鎬т篃搴旇閬靛驚鍚屾牱鐨勮礬綰匡紒
鍦ㄨ繖綃囨枃绔犱腑錛屾垜灝嗗垪鍑烘暟嬈句負澶у鎵鑰崇啛鑳借鐨勫彲鎵╁睍鎬ф灦鏋勩傞氬父鎯呭喌涓嬶紝鏋舵瀯甯堜滑瀹屽叏鍙互鍊熼壌宸茬煡鐨勫彲鎵╁睍鏋舵瀯妯″紡錛岃繘鑰屽垱閫犲嚭鏂扮殑鍙墿灞曟灦鏋勩?/p>
緇間笂鎵榪幫紝鍙墿灞曟х殑瀹炵幇鍙湁涓夌鏂瑰紡錛屽嵆錛氬垎甯冦佺紦瀛樺強寮傛澶勭悊銆傚墠鏂囨墍鎻愬埌鐨勫悇縐嶆灦鏋勪簨瀹炰笂閮芥槸鎶婅繖涓夌鏂瑰紡榪涜涓嶅悓緇勫悎騫跺姞浠ュ疄鏂姐傝屽彟涓鏂?闈紝涓嶅埄浜庡彲鎵╁睍鎬х殑鍥犵礌錛岄櫎浜嗙碂緋曠殑緙栫爜鏈韓錛屽叏灞鎬у崗璋冧篃璧峰埌浜嗛噸瑕佺殑褰卞搷銆傜畝鍗曟潵璇達紝浠諱綍涓縐嶅叏灞鎬у崗璋冮兘浼氶檺鍒剁郴緇熺殑鍙墿灞曟с傛湰鏂囦腑鎵鎻愬埌鐨勫悇 縐嶆灦鏋勪篃鍙槸鍦ㄥ仛濂戒簡鏈湴鎬у崗璋冿紝鑰岄潪鍏ㄥ眬鎬у崗璋冦?/p>
鐒惰岋紝灝嗗畠浠湁鏈哄湴緇撳悎璧鋒潵浠ュ垱寤轟竴濂楁瀬鍏峰彲鎵╁睍鎬х殑鏋舵瀯鍙笉鍍忚璧鋒潵閭d箞瀹規槗錛岄櫎闈炴垜浠兘鎵懼埌涓縐嶅叏鏂扮殑鎵╁睍妯″紡銆備笉榪囩粡楠屽憡璇夋垜浠紝姣旇搗鎼炰竴濂楀叏鏂扮殑鏋舵瀯錛岄噰鐢ㄤ負鎴戜滑鎵鐔熺煡涓旀洿鏄撻┚椹殑鍙墿灞曟цВ鍐蟲柟妗堟案榪滄槸鏇村ソ鐨勯夋嫨銆?/p>
鎼滅儲璐ㄩ噺璇勪及鏄悳绱㈡妧鏈爺絀剁殑鍩虹鎬у伐浣滐紝涔熸槸鏍稿績宸ヤ綔涔嬩竴銆傝瘎浠鳳紙Metrics錛夊湪鎼滅儲鎶鏈爺鍙戜腑鎵紨鐫閲嶈瑙掕壊錛屼互鑷充簬浠諱綍涓縐嶆柊鏂規硶涓庝粬浠殑璇勪環鏂瑰紡鏄瀺涓轟竴浣撶殑銆?/p>
A Cranfield-like approach榪欎釜鍚嶇О鏉ユ簮浜庤嫳鍥紺ranfield University錛屽洜涓哄湪浜屽崄涓栫邯浜斿崄騫翠唬璇ュぇ瀛﹂鍏堟彁鍑轟簡榪欐牱涓濂楄瘎浠風郴緇燂細鐢辨煡璇㈡牱渚嬮泦銆佹紜瓟妗堥泦銆佽瘎嫻嬫寚鏍囨瀯鎴愮殑瀹屾暣璇勬祴鏂規錛屽茍浠庢紜珛浜?#8220;璇勪環”鍦ㄤ俊鎭绱㈢爺絀朵腑鐨勬牳蹇冨湴浣嶃?/p>
Cranfield璇勪環浣撶郴鐢變笁涓幆鑺傜粍鎴愶細
Cranfield璇勪環緋葷粺鍦ㄥ悇澶ф悳绱㈠紩鎿庡叕鍙稿唴鏈夊箍娉涚殑搴旂敤銆傚叿浣撳簲鐢ㄦ椂錛岄鍏堥渶瑕佽В鍐崇殑闂鏄瀯閫犱竴涓祴璇曠敤鏌ヨ璇嶉泦鍚堛?/p>
鎸夌収Andrei Broder錛堟浘鍦ˋltaVista/IBM/Yahoo浠昏亴錛夌殑鐮旂┒錛屾煡璇㈣瘝鍙垎涓?綾伙細瀵誨潃綾繪煡璇紙Navigational錛夈佷俊鎭被鏌ヨ(Informational)銆佷簨鍔$被鏌ヨ(Transactional)銆傚搴旂殑姣斾緥鍒嗗埆涓?/p>
Navigational 錛?12.3% Informational 錛?62.0% Transactional 錛?25.7%
涓轟簡浣垮緱璇勪及絎﹀悎綰夸笂瀹為檯鎯呭喌錛岄氬父鏌ヨ璇嶉泦鍚堜篃浼氭寜姣斾緥榪涜閫夊彇銆傞氬父浠庣嚎涓婄敤鎴風殑Query Log鏂囦歡涓嚜鍔ㄦ娊鍙栥?/p>
鍙﹀鏌ヨ闆嗗悎鐨勬瀯閫犳椂錛岄櫎浜嗕笂榪版煡璇㈢被鍨嬪錛岃繕鍙互鑰冭檻Query鐨勯嬈★紝瀵圭儹闂╭uery錛堥珮棰戞煡璇級銆侀暱灝緌uery錛堜腑浣庨錛夊垎鍒崰鐗瑰畾鐨勬瘮渚嬨?/p>
鍙﹀錛屽湪鎶藉彇Query鏃訛紝寰寰Query鐨勯暱鐭篃鏄竴涓緟鑰冭檻鐨勫洜绱犮傚洜涓虹煭query錛堝崟term鐨勬煡璇級鍜岄暱Query錛堝Term鐨勬煡璇級鎺掑簭綆楁硶寰寰浼氭湁涓浜涗笉鍚屻?/p>
鏋勬垚鏌ヨ闆嗗悎鍚庯紝浣跨敤榪欎簺鏌ヨ璇嶏紝鍦ㄤ笉鍚岀郴緇燂紙渚嬪瀵規瘮鐧懼害鍜孏oogle錛夋垨涓嶅悓鎶鏈棿錛堟柊鏃т袱濂桼anking綆楁硶鐨勭幆澧冿級榪涜鎼滅儲錛屽茍瀵圭粨鏋滆繘琛岃瘎鍒嗭紝浠ュ喅瀹氫紭鍔c?/p>
闄勫浘錛氬鍚屼竴Query錛?#8220;紺句細淇濋櫓娉?#8221;錛屽悇澶ф悳绱㈠紩鎿庣殑緇撴灉紺烘剰鍥俱備笅闈㈠叿浣撹皥璋堣瘎鍒嗙殑鏂規硶銆?/p>
淇℃伅媯绱㈤鍩熸渶騫夸負浜虹煡鐨勮瘎浠鋒寚鏍囦負Precision-Recall錛堝噯紜巼-鍙洖鐜囷級鏂規硶銆傝鏂規硶浠庢彁鍑鴻嚦浠婂凡緇忓巻鍗婁釜涓栫邯錛岃嚦浠婂湪寰堝鎼滅儲寮曟搸鍏徃鐨勬晥鏋滆瘎浼頒腑浣跨敤銆?/p>
欏懼悕鎬濅箟錛岃繖涓柟娉曠敱鍑嗙‘鐜囧拰鍙洖鐜囪繖涓や釜鐩鎬簰鍏寵仈鐨勭粺璁¢噺鏋勬垚錛氬彫鍥炵巼錛圧ecall錛夎 閲忎竴涓煡璇㈡悳绱㈠埌鎵鏈夌浉鍏蟲枃妗g殑鑳藉姏錛岃屽噯紜巼錛圥recision錛夎 閲忔悳绱㈢郴緇熸帓闄や笉鐩稿叧鏂囨。鐨勮兘鍔涖傦紙閫氫織鐨勮В閲婁竴涓嬶細鍑嗙‘鐜囧氨鏄畻涓綆椾綘鏌ヨ寰楀埌鐨勭粨鏋滀腑鏈夊灝戞槸闈犺氨鐨勶紱鑰屽彫鍥炵巼琛ㄧず鎵鏈夐潬璋辯殑緇撴灉涓紝鏈夊灝戣浣犵粰鎵懼洖鏉ヤ簡錛夈傝繖涓ら」鏄瘎浠鋒悳绱㈡晥鏋滅殑鏈鍩虹鎸囨爣錛屽叾鍏蜂綋鐨勮綆楁柟娉曞涓嬨?/p>
Precision-recall鏂規硶鍋囧畾瀵逛竴涓粰瀹氱殑鏌ヨ錛屽搴斾竴涓媯绱㈢殑鏂囨。闆嗗悎鍜屼竴涓笉鐩稿叧鐨勬枃妗i泦鍚堛傝繖閲岀浉鍏蟲ц鍋囪涓轟簩鍏冪殑錛岀敤鏁板褰㈠紡鍖栨柟娉曟潵鎻忚堪錛屽垯鏄細
A琛ㄧず鐩稿叧鏂囨。闆嗗悎
A琛ㄧず涓嶇浉鍏抽泦鍚?/p>
B琛ㄧず琚绱㈠埌鐨勬枃妗i泦鍚?/p>
B琛ㄧず鏈媯绱㈠埌鐨勬枃妗i泦鍚?/p>
鍒欏崟嬈℃煡璇㈢殑鍑嗙‘鐜囧拰鍙洖鐜囧彲浠ョ敤涓嬭堪鍏紡鏉ヨ〃杈撅細
錛堣繍綆楃∩ 琛ㄧず涓や釜闆嗗悎鐨勪氦闆嗐倈x|絎﹀彿琛ㄧず闆嗗悎x涓殑鍏冪礌鏁伴噺錛?/p>
浠庝笂闈㈢殑瀹氫箟涓嶉毦鐪嬪嚭錛屽彫鍥炵巼鍜屽噯紜巼鐨勫彇鍊艱寖鍥村潎鍦╗0,1]涔嬮棿銆傞偅涔堜笉闅炬兂璞★紝濡傛灉榪欎釜緋葷粺鎵懼洖鐨勭浉鍏寵秺澶氾紝閭d箞鍙洖鐜囪秺楂橈紝濡傛灉鐩稿叧緇撴灉鍏ㄩ儴閮界粰鍙洖浜嗭紝閭d箞recall姝ゆ椂灝辯瓑浜?.0銆?/p>
鐩稿叧鐨?/p> | 涓嶇浉鍏?/p> | |
琚绱㈠埌 | A∩ B | A∩ B |
鏈媯绱㈠埌 | A∩B | A∩B |
鍙洖鐜囧拰鍑嗙‘鐜囧垎鍒弽鏄犱簡媯绱㈢郴緇熺殑涓や釜鏈閲嶈鐨勪晶闈紝鑰岃繖涓や釜渚ч潰鍙堢浉浜掑埗綰︺傚洜涓哄ぇ瑙勬ā鏁版嵁闆嗗悎涓紝濡傛灉鏈熸湜媯绱㈠埌鏇村鐩稿叧鐨勬枃妗o紝蹇呯劧闇瑕?#8220;鏀懼”媯绱㈡爣鍑嗭紝鍥犳浼氬鑷翠竴浜涗笉鐩稿叧緇撴灉娣瘋繘鏉ワ紝浠庤屼嬌鍑嗙‘鐜囧彈鍒板獎鍝嶃傜被浼肩殑錛屾湡鏈涙彁楂樺噯紜巼錛屽皢涓嶇浉鍏蟲枃妗e敖閲忓幓闄ゆ椂錛屽姟蹇呰鎵ц鏇?#8220;涓ユ牸”鐨勬绱㈢瓥鐣ワ紝榪欐牱涔熶細浣夸竴浜涚浉鍏崇殑鏂囨。琚帓闄ゅ湪澶栵紝浣垮彫鍥炵巼涓嬮檷銆?/p>
鎵浠ヤ負浜嗘洿娓呮櫚鐨勬弿榪頒袱鑰呴棿鐨勫叧緋伙紝閫氬父鎴戜滑灝哖recison-Recall鐢ㄦ洸綰跨殑鏂瑰紡緇樺埗鍑烘潵錛屽彲浠ョ畝縐頒負P-R diagram銆傚父瑙佺殑褰㈠紡濡備笅鍥炬墍紺恒傦紙閫氬父鏇茬嚎鏄竴涓愭鍚戜笅鐨勮蛋鍔匡紝鍗抽殢鐫Recall鐨勬彁楂橈紝Precision閫愭闄嶄綆錛?/p>
涓浜涚壒瀹氭悳绱㈠簲鐢紝浼氭洿鍏蟲敞鎼滅儲緇撴灉涓敊璇殑緇撴灉銆備緥濡傦紝鎼滅儲寮曟搸鐨勫弽浣滃紛緋葷粺錛圓nti-Spam System錛変細鏇村叧娉ㄦ绱㈢粨鏋滀腑娣峰叆浜嗗灝戞潯浣滃紛緇撴灉銆傚鏈晫鎶婅繖浜涢敊璇粨鏋滅О浣滃亣闃蟲э紙False Positive錛夌粨鏋滐紝瀵硅繖浜涘簲鐢紝閫氬父閫夋嫨鐢ㄨ櫄鎶ョ巼錛團allout錛夋潵緇熻錛?/p>
Fallout鍜孭resion鏈川鏄畬鍏ㄧ浉鍚岀殑銆傚彧鏄垎鍒粠姝e弽涓ゆ柟闈㈡潵璁$畻銆傚疄闄呬笂鏄疨-R鐨勪竴涓彉縐嶃?/p>
鍐嶅洖鍒頒笂鍥撅紝Presion-Recall鏄竴涓洸綰匡紝鐢ㄦ潵姣旇緝涓や釜鏂規硶鐨勬晥鏋滃線寰涓嶅鐩磋錛岃兘涓嶈兘瀵逛袱鑰呰繘琛岀患鍚堬紝鐩存帴鍙嶆槧鍒頒竴涓暟鍊間笂鍛紵涓烘IR瀛︽湳鐣屾彁鍑轟簡F鍊煎害閲忥紙F -Measure錛夌殑鏂規硶銆侳-Measure閫氳繃Presion鍜孯ecall鐨勮皟鍜屽鉤鍧囨暟鏉ヨ綆楋紝鍏紡涓猴細
鍏朵腑鍙傛暟λε(0,1)璋冭妭緋葷粺瀵筆recision鍜孯ecall鐨勫鉤琛$▼搴︺傦紙閫氬父鍙?#955;=0.5錛屾鏃?nbsp;
錛?/p>
榪欓噷浣跨敤璋冨拰騫沖潎鏁拌屼笉鏄氬父鐨勫嚑浣曞鉤鍧囨垨綆楁湳騫沖潎錛屽師鍥犳槸璋冨拰騫沖潎鏁板己璋冭緝灝忔暟鍊肩殑閲嶈鎬э紝鑳芥晱鎰熺殑鍙嶆槧灝忔暟瀛楃殑鍙樺寲錛屽洜姝ゆ洿閫傚悎鐢ㄦ潵鍙嶆槧媯绱㈡晥鏋溿?/p>
浣跨敤F Measure鐨勫ソ澶勬槸鍙渶瑕佷竴涓崟涓鐨勬暟瀛楀氨鍙互鎬葷粨緋葷粺鐨勬绱㈡晥鏋滐紝渚夸簬姣旇緝涓嶅悓鎼滅儲緋葷粺鐨勬暣浣撴晥鏋溿?/p>
浼犵粺鐨凱recision-Recall騫朵笉瀹屽叏閫傜敤瀵規悳绱㈠紩鎿庣殑璇勪及錛屽師鍥犳槸鎼滅儲寮曟搸鐢ㄦ埛鐨勭偣鍑繪柟寮忔湁鍏剁壒孌婃э紝鍖呮嫭錛?/p>
A 60-65%鐨勬煡璇㈢偣鍑諱簡鍚嶅垪鎼滅儲緇撴灉鍓?0鏉$殑緗戦〉錛? B 20-25%鐨勪漢浼氳冭檻鐐瑰嚮鍚嶅垪11鍒?0鐨勭綉欏碉紱 C 浠呮湁3-4%鐨勪細鐐瑰嚮鍚嶅垪鎼滅儲緇撴灉涓垪絎?1鍒扮30鍚嶇殑緗戦〉
涔熷氨鏄錛岀粷澶ч儴鍒嗙敤鎴鋒槸涓嶆効鎰忕炕欏靛幓鐪嬫悳绱㈠紩鎿庣粰鍑虹殑鍚庨潰鐨勭粨鏋溿?/p>
鑰屽嵆浣垮湪鎼滅儲緇撴灉鐨勯欏碉紙閫氬父鍒楀嚭鐨勬槸鍓?0鏉$粨鏋滐級錛岀敤鎴風殑鐐瑰嚮琛屼負涔熷緢鏈夋剰鎬濓紝鎴戜滑閫氳繃涓嬮潰鐨凣oogle鐐瑰嚮鐑浘錛圚eat Map錛夋潵瑙傚療錛堣繖涓儹鍥懼湪浜岀淮鎼滅儲緇撴灉欏典笂閫氳繃鍏夎氨鏉ュ艦璞$殑琛ㄨ揪涓嶅悓浣嶇疆鐢ㄦ埛鐨勭偣鍑葷儹搴︺傞鑹茬害闈犺繎綰㈣壊琛ㄧず鐐瑰嚮寮哄害瓚婇珮錛夛細
浠庡浘涓彲浠ョ湅鍑猴紝鎼滅儲緇撴灉鐨勫墠3鏉″惛寮曚簡澶ч噺鐨勭偣鍑伙紝灞炰簬鐑害鏈楂樼殑閮ㄥ垎銆備篃灝辨槸璇達紝瀵規悳鑻忓紩鎿庢潵璇達紝鏈鍓嶇殑鍑犳潯緇撴灉鏄渶鍏抽敭鐨勶紝鍐沖畾浜嗙敤鎴風殑婊℃剰紼嬪害銆?/p>
搴蜂箖灝斿ぇ瀛︾殑鐮旂┒浜哄憳閫氳繃eye tracking瀹為獙鑾峰緱浜嗘洿涓虹簿紜殑Google鎼滅儲緇撴灉鐨勭敤鎴瘋涓哄垎鏋愬浘銆備粠榪欏紶鍥句腑鍙互鐪嬪嚭錛岀涓鏉$粨鏋滆幏寰椾簡56.38%鐨勬悳绱㈡祦閲忥紝絎簩鏉″拰絎笁鏉$粨鏋滅殑鎺掑悕渚濇闄嶄綆錛屼絾榪滀綆浜庢帓鍚嶇涓鐨勭粨鏋溿傚墠涓夋潯緇撴灉鐨勭偣鍑繪瘮渚嬪ぇ綰︿負11:3:2 銆傝屽墠涓夋潯緇撴灉鐨勬葷偣鍑誨嚑涔庡垎嫻佷簡鎼滅儲嫻侀噺鐨?0%銆?/p>
鍙﹀鐨勪竴浜涙湁瓚g殑緇撹鏄紝鐐瑰嚮閲忓茍涓嶆槸鎸夌収欏哄簭渚濇閫掑噺鐨勩傛帓鍚嶇涓冧綅鑾峰緱鐨勭偣鍑繪槸鏈灝戠殑錛屽師鍥犲彲鑳藉湪浜庣敤鎴峰湪嫻忚榪囩▼涓笅鎷夐〉闈㈠埌搴曢儴錛岃繖鏃跺欏氨鍙樉紺烘渶鍚庝笁浣嶆帓鍚嶇綉绔欙紝絎竷鍚嶄究瀹規槗琚拷鐣ャ傝岄灞忔渶鍚庝竴涓粨鏋滆幏寰楃殑娉ㄦ剰鍔涳紙2.55錛夋槸澶т簬鍊掓暟絎簩浣嶇殑(1.45)錛屽師鍥犳槸鐢ㄦ埛鍦ㄧ炕欏靛墠錛屽鏈鍚庝竴鏉$粨鏋滃嵃璞$浉瀵硅緝娣便傛悳绱㈢粨鏋滈〉闈㈢浜岄〉鎺掑悕絎竴鐨勭綉欏碉紙鍗蟲繪帓鍚?1浣嶇殑緇撴灉錛夋墍鑾峰緱鐨勭偣鍑誨彧鏈夐欏墊帓鍚嶇鍗佺綉绔欑殑40%錛屼笌棣栭〉鐨勭涓鏉$粨鏋滅浉姣旓紝鏇存槸鍙湁鍏?/60鑷?/100鐨勭偣鍑婚噺銆?/p>
鍥犳鍦ㄩ噺鍖栬瘎浼版悳绱㈠紩鎿庣殑鏁堟灉鏃訛紝寰寰闇瑕佹牴鎹互涓婃悳绱㈢敤鎴風殑琛屼負鐗圭偣錛岃繘琛岄拡瀵規х殑璁捐銆?/p>
P@N鏈韓鏄疨recision@N鐨勭畝縐幫紝鎸囩殑鏄鐗瑰畾鐨勬煡璇紝鑰冭檻浣嶇疆鍥犵礌錛屾嫻嬪墠N鏉$粨鏋滅殑鍑嗙‘鐜囥備緥濡傚鍗曟鎼滅儲鐨勭粨鏋滀腑鍓?綃囷紝濡傛灉鏈?綃囦負鐩稿叧鏂囨。錛屽垯P@5 = 4/5 = 0.8 銆?/p>
嫻嬭瘯閫氬父浼氫嬌鐢ㄤ竴涓煡璇㈤泦鍚堬紙鎸夌収鍓嶆枃鎵榪版柟娉曟瀯閫狅級錛屽寘鍚嫢騫叉潯涓嶅悓鐨勬煡璇㈣瘝錛屽湪瀹為檯浣跨敤P@N榪涜璇勪及鏃訛紝閫氬父浣跨敤鎵鏈夋煡璇㈢殑P@N鏁版嵁錛岃綆楃畻鏈鉤鍧囧鹼紝鐢ㄦ潵璇勫垽璇ョ郴緇熺殑鏁翠綋鎼滅儲緇撴灉璐ㄩ噺銆?/p>
瀵圭敤鎴鋒潵璇達紝閫氬父鍙叧娉ㄦ悳绱㈢粨鏋滄渶鍓嶈嫢騫叉潯緇撴灉錛屽洜姝ら氬父鎼滅儲寮曟搸鐨勬晥鏋滆瘎浼板彧鍏蟲敞鍓?銆佹垨鑰呭墠3緇撴灉錛屾墍浠ユ垜浠父鐢ㄧ殑N鍙栧間負P@3鎴朠@5絳夈?/p>
瀵逛竴浜涚壒瀹氱被鍨嬬殑鏌ヨ搴旂敤錛屽瀵誨潃綾葷殑鏌ヨ錛圢avigational Search錛夛紝鐢變簬鐩爣緇撴灉鏋佷負鏄庣‘錛屽洜姝ゅ湪璇勪及鏃訛紝浼氶夋嫨N=1錛堝嵆浣跨敤P@1錛夈備婦涓緥瀛愭潵璇達紝鎼滅儲“鏂版氮緗?#8221;銆佹垨“鏂版氮棣栭〉”錛屽鏋滈鏉$粨鏋滀笉鏄?鏂版氮緗戯紙url錛?a style="box-sizing: border-box; color: #0b59b2;">www.sina.com.cn錛夛紝鍒欑洿鎺ュ垽璇ユ鏌ヨ綺懼害涓嶆弧瓚抽渶姹傦紝鍗砅@1=0
涓婅堪鐨凱@N鏂規硶錛屾槗浜庤綆楀拰鐞嗚В銆備絾緇嗗績鐨勮鑰呬竴瀹氫細鍙戠幇闂錛屽氨鏄湪鍓峃緇撴灉涓紝鎺掑簭絎?浣嶅拰絎琋浣嶇殑緇撴灉錛屽鍑嗙‘鐜囩殑褰卞搷鏄竴鏍風殑銆備絾瀹為檯鎯呭喌鏄紝鎼滅儲寮曟搸鐨勮瘎浠鋒槸鍜屾帓搴忎綅緗瀬涓虹浉鍏崇殑銆傚嵆鎺掔涓鐨勭粨鏋滈敊璇紝鍜岀10浣嶇殑緇撴灉閿欒錛屽叾涓ラ噸紼嬪害鏈夊ぉ澹や箣鍒傚洜姝ゅ湪璇勪環緋葷粺涓紝闇瑕佸紩鍏ヤ綅緗繖涓洜绱犮?/p>
MRR鏄鉤鍧囨帓搴忓掓暟錛圡ean Reciprocal Rank錛夌殑綆縐幫紝MRR鏂規硶涓昏鐢ㄤ簬瀵誨潃綾繪绱紙Navigational Search錛夋垨闂瓟綾繪绱紙Question Answering錛夛紝榪欎簺媯绱㈡柟娉曞彧闇瑕佷竴涓浉鍏蟲枃妗o紝瀵瑰彫鍥炵巼涓嶆晱鎰燂紝鑰屾槸鏇村叧娉ㄦ悳绱㈠紩鎿庢绱㈠埌鐨勭浉鍏蟲枃妗f槸鍚︽帓鍦ㄧ粨鏋滃垪琛ㄧ殑鍓嶉潰銆侻RR鏂規硶棣栧厛璁$畻姣忎竴涓煡璇㈢殑絎竴涓浉鍏蟲枃妗d綅緗殑鍊掓暟錛岀劧鍚庡皢鎵鏈夊掓暟鍊兼眰騫沖潎銆備緥濡備竴涓寘鍚笁涓煡璇㈣瘝鐨勬祴璇曢泦錛屽墠5緇撴灉鍒嗗埆涓猴細
鏌ヨ涓緇撴灉錛?.AN 2.AR 3.AN 4.AN 5.AR 鏌ヨ浜岀粨鏋滐細1.AN 2.AR 3.AR 4.AR 5.AN 鏌ヨ涓夌粨鏋滐細1.AR 2.AN 3.AN 4.AN 5.AR
鍏朵腑AN琛ㄧず涓嶇浉鍏崇粨鏋滐紝AR琛ㄧず鐩稿叧緇撴灉銆傞偅涔堢涓涓煡璇㈢殑鎺掑簭鍊掓暟錛圧eciprocal Rank錛塕R1 = 1/2=0.5 錛涚浜屼釜緇撴灉RR2 = 1/2 = 0.5 錛?娉ㄦ剰鍊掓暟鐨勫間笉鍙橈紝鍗充嬌鏌ヨ浜岃幏寰楃殑鐩稿叧緇撴灉鏇村銆傚悓鐞嗭紝RR3= 1/1 = 1銆?瀵逛簬榪欎釜嫻嬭瘯闆嗗悎錛屾渶緇圡RR=錛圧R1+RR2+RR3錛? 3 = 0.67
鐒惰屽澶ч儴鍒嗘绱㈠簲鐢ㄦ潵璇達紝鍙湁涓鏉$粨鏋滄棤娉曟弧瓚抽渶姹傦紝瀵硅繖縐嶆儏鍐碉紝闇瑕佹洿鍚堥傜殑鏂規硶鏉ヨ綆楁晥鏋滐紝鍏朵腑鏈甯哥敤鐨勬槸涓嬭堪MAP鏂規硶銆?/p>
MAP鏂規硶鏄疢ean Average Precison錛屽嵆騫沖潎鍑嗙‘鐜囨硶鐨勭畝縐般傚叾瀹氫箟鏄眰姣忎釜鐩稿叧鏂囨。媯绱㈠嚭鍚庣殑鍑嗙‘鐜囩殑騫沖潎鍊鹼紙鍗矨verage Precision錛夌殑綆楁湳騫沖潎鍊鹼紙Mean錛夈傝繖閲屽鍑嗙‘鐜囨眰浜嗕袱嬈″鉤鍧囷紝鍥犳縐頒負Mean Average Precision銆傦紙娉細娌″彨Average Average Precision涓鏄洜涓洪毦鍚紝浜屾槸鍥犱負鏃犳硶鍖哄垎涓ゆ騫沖潎鐨勬剰涔夛級
MAP 鏄弽鏄犵郴緇熷湪鍏ㄩ儴鐩稿叧鏂囨。涓婃ц兘鐨勫崟鍊兼寚鏍囥傜郴緇熸绱㈠嚭鏉ョ殑鐩稿叧鏂囨。瓚婇潬鍓?rank 瓚婇珮)錛孧AP灝卞簲璇ヨ秺楂樸傚鏋滅郴緇熸病鏈夎繑鍥炵浉鍏蟲枃妗o紝鍒欏噯紜巼榛樿涓?銆?/p>
渚嬪錛氬亣璁炬湁涓や釜涓婚錛?/p>
涓婚1鏈?涓浉鍏崇綉欏碉紝涓婚2鏈?涓浉鍏崇綉欏點?/p>
鏌愮郴緇熷浜庝富棰?媯绱㈠嚭4涓浉鍏崇綉欏碉紝鍏秗ank鍒嗗埆涓?, 2, 4, 7錛?/p>
瀵逛簬涓婚2媯绱㈠嚭3涓浉鍏崇綉欏碉紝鍏秗ank鍒嗗埆涓?,3,5銆?/p>
瀵逛簬涓婚1錛屽鉤鍧囧噯紜巼MAP璁$畻鍏紡涓猴細
(1/1+2/2+3/4+4/7)/4=0.83銆?
瀵逛簬涓婚2錛屽鉤鍧囧噯紜巼MAP璁$畻鍏紡涓猴細
(1/1+2/3+3/5+0+0)/5=0.45銆?
鍒橫AP= (0.83+0.45)/2=0.64銆?#8221;
DCG鏄嫳鏂嘍iscounted cumulative gain鐨勭畝縐幫紝涓枃鍙炕璇戜負“鎶樻墸澧炵泭鍊?#8221;銆侱CG鏂規硶鐨勫熀鏈濇兂鏄細
鎴戜滑棣栧厛鏉ョ湅絎竴鏉★細鐩稿叧鎬у垎綰с傝繖閲屾瘮璁$畻Precision鏃剁畝鍗曠粺璁?#8220;鍑嗙‘”鎴?#8220;涓嶅噯紜?#8221;瑕佹洿涓虹簿緇嗐傛垜浠彲浠ュ皢緇撴灉緇嗗垎涓哄涓瓑綰с傛瘮濡傚父鐢ㄧ殑3綰э細Good錛堝ソ錛夈丗air錛堜竴鑸級銆丅ad錛堝樊錛夈傚搴旂殑鍒嗗紃el涓猴細Good:3 / Fair:2 / Bad:1 銆備竴浜涙洿涓虹粏鑷寸殑璇勪及浣跨敤5綰у垎綾繪硶錛歏ery Good錛堟槑鏄懼ソ錛夈丟ood錛堝ソ錛夈丗air錛堜竴鑸級銆丅ad錛堝樊錛夈乂ery Bad錛堟槑鏄懼樊錛夛紝鍙互灝嗗搴斿垎鍊紃el璁劇疆涓猴細Very Good:2 / Good:1 / Fair:0 / Bad:-1 / Very Bad: -2
璇勫垽緇撴灉鐨勬爣鍑嗗彲浠ユ牴鎹叿浣撶殑搴旂敤鏉ョ‘瀹氾紝Very Good閫氬父鏄寚緇撴灉鐨勪富棰樺畬鍏ㄧ浉鍏籌紝騫朵笖緗戦〉鍐呭涓板瘜銆佽川閲忓緢楂樸傝屽叿浣撳埌姣忔潯
DCG鐨勮綆楀叕寮忓茍涓嶅敮涓錛岀悊璁轟笂鍙姹傚鏁版姌鎵e洜瀛愮殑騫蟲粦鎬с傛垜涓漢璁や負涓嬮潰鐨凞CG鍏紡鏇村悎鐞嗭紝寮鴻皟浜嗙浉鍏蟲э紝絎?銆?鏉$粨鏋滅殑鎶樻墸緋繪暟涔熸洿鍚堢悊錛?/p>
姝ゆ椂DCG鍓?涓綅緗笂緇撴灉鐨勬姌鎵e洜瀛愶紙Discount factor錛夋暟鍊間負錛?/p>
i | log2 (i+1) | 1/log2 (i+1) |
1 | 1 | 1 |
2 | 1.59 | 0.63 |
3 | 2 | 0.5 |
4 | 2.32 | 0.43 |
鍙栦互2涓哄簳鐨刲og鍊間篃鏉ヨ嚜浜庣粡楠屽叕寮忥紝騫朵笉瀛樺湪鐞嗚涓婄殑渚濇嵁銆傚疄闄呬笂錛孡og鐨勫熀鏁板彲浠ユ牴鎹鉤婊戠殑闇姹傝繘琛屼慨鏀癸紝褰撳姞澶ф暟鍊兼椂錛堜緥濡備嬌鐢╨og5 浠f浛log2錛夛紝鎶樻墸鍥犲瓙闄嶄綆鏇翠負榪呴燂紝姝ゆ椂寮鴻皟浜嗗墠闈㈢粨鏋滅殑鏉冮噸銆?/p>
涓轟簡渚夸簬涓嶅悓綾誨瀷鐨剄uery緇撴灉涔嬮棿妯悜姣旇緝錛屼互DCG涓哄熀紜錛屼竴浜涜瘎浠風郴緇熻繕瀵笵CG榪涜浜嗗綊涓錛岃繖浜涙柟娉曠粺縐頒負nDCG錛堝嵆 normalize DCG錛夈傛渶甯哥敤鐨勮綆楁柟娉曟槸閫氳繃闄や互姣忎竴涓煡璇㈢殑鐞嗘兂鍊糹DCG錛坕deal DCG錛夋潵榪涜褰掍竴錛屽叕寮忎負錛?/p>
姹俷DCG闇瑕佹爣瀹氬嚭鐞嗘兂鎯呭喌鐨刬DCG錛屽疄闄呮搷浣滅殑鏃跺欐槸寮傚父鍥伴毦鐨勶紝鍥犱負姣忎釜浜哄“鏈濂界殑緇撴灉”鐞嗚В寰寰鍚勪笉鐩稿悓錛屼粠嫻烽噺鏁版嵁閲岄夊嚭鏈浼樼粨鏋滄槸寰堝洶闅劇殑浠誨姟錛屼絾鏄瘮杈冧袱緇勭粨鏋滃摢涓洿濂介氬父鏇村鏄擄紝鎵浠ュ疄璺靛簲鐢ㄤ腑錛岄氬父閫夋嫨緇撴灉瀵規瘮鐨勬柟娉曡繘琛岃瘎浼般?/p>
浠ヤ笂鎵浠嬬粛鐨勬悳绱㈠紩鎿庨噺鍖栬瘎浼版寚鏍囷紝鍦–ranfield璇勪及妗嗘灦錛圕ranfield Evaluation Framework錛変腑琚箍娉涗嬌鐢ㄣ備笟鐣岀煡鍚嶇殑TREC錛堟枃鏈俊鎭绱細璁級灝變竴鐩村熀浜庢綾繪柟娉曠粍緇囦俊鎭绱㈣瘎嫻嬪拰鎶鏈氦嫻併傞櫎浜員REC澶栵紝涓浜涢拡瀵逛笉鍚屽簲鐢ㄨ璁$殑Cranfield璇勬祴璁哄潧涔熷湪榪涜榪涜錛堝 NTCIR銆両REX絳夛級銆?/p>
浣咰ranfield璇勪及妗嗘灦瀛樺湪鐨勯棶棰樻槸鏌ヨ鏍蜂緥闆嗗悎鐨勬爣娉ㄤ笂銆傚埄鐢ㄦ墜宸ユ爣娉ㄧ瓟妗堢殑鏂瑰紡榪涜緗戠粶淇℃伅媯绱㈢殑璇勪環鏄竴涓棦鑰楄垂浜哄姏銆佸張鑰楄垂鏃墮棿鐨勮繃紼嬶紝鍙湁灝戞暟澶у叕鍙歌兘澶熶嬌鐢ㄣ傚茍涓旂敱浜庢悳绱㈠紩鎿庣畻娉曟敼榪涖佽繍钀ョ淮鎶ょ殑闇瑕侊紝媯绱㈡晥鏋滆瘎浠峰弽棣堢殑鏃墮棿闇瑕佸敖閲忕緝鐭紝鍥犳鑷姩鍖栫殑璇勬祴鏂規硶瀵規彁楂樿瘎浼版晥鐜囧崄鍒嗛噸瑕併傛渶甯哥敤鐨勮嚜鍔ㄨ瘎浼版柟娉曟槸A/B testing緋葷粺銆?/p>
A/B Testing緋葷粺
A/B testing緋葷粺鍦ㄧ敤鎴鋒悳绱㈡椂錛岀敱緋葷粺鏉ヨ嚜鍔ㄥ喅瀹氱敤鎴風殑鍒嗙粍鍙鳳紙Bucket id錛夛紝閫氳繃鑷姩鎶藉彇嫻侀噺瀵煎叆涓嶅悓鍒嗘敮錛屼嬌寰楃浉搴斿垎緇勭殑鐢ㄦ埛鐪嬪埌鐨勬槸涓嶅悓浜у搧鐗堟湰錛堟垨涓嶅悓鎼滅儲寮曟搸錛夋彁渚涚殑緇撴灉銆傜敤鎴峰湪涓嶅悓鐗堟湰浜у搧涓嬬殑琛屼負灝嗚璁板綍涓嬫潵錛岃繖浜涜涓烘暟鎹氳繃鏁版嵁鍒嗘瀽褰㈡垚涓緋誨垪鎸囨爣錛岃岄氳繃榪欎簺鎸囨爣鐨勬瘮杈冿紝鏈鍚庡氨褰㈡垚浜嗗悇鐗堟湰涔嬮棿瀛頒紭瀛板姡鐨勭粨璁恒?/p>
鍦ㄦ寚鏍囪綆楁椂錛屽張鍙粏鍒嗕負涓ょ鏂規硶錛屼竴縐嶆槸鍩轟簬涓撳璇勫垎鐨勬柟娉曪紱涓縐嶆槸鍩轟簬鐐瑰嚮緇熻鐨勬柟娉曘?/p>
涓撳璇勫垎鐨勬柟娉曢氬父鐢辨悳绱㈡牳蹇冩妧鏈爺鍙戝拰浜у搧浜哄憳鏉ヨ繘琛岋紝鏍規嵁棰勫厛璁懼畾鐨勬爣鍑嗗A銆丅涓ゅ鐜鐨勭粨鏋滅粰浜堣瘎鍒嗭紝鑾峰彇姣忎釜Query鐨勭粨鏋滃姣旓紝騫舵牴鎹畁DCG絳夋柟娉曡綆楁暣浣撹川閲忋?/p>
鐐瑰嚮璇勫垎鏈夋洿楂樼殑鑷姩鍖栫▼搴︼紝榪欓噷浣跨敤浜嗕竴涓亣璁撅細鍚屾牱鐨勬帓搴忎綅緗紝鐐瑰嚮鏁伴噺澶氱殑緇撴灉璐ㄩ噺浼樹簬鐐瑰嚮鏁伴噺灝戠殑緇撴灉銆傦紙鍗矨2琛ㄧずA嫻嬭瘯鐜絎?鏉$粨鏋滐紝濡傛灉A2 > B2錛屽垯琛ㄧずA2璐ㄩ噺鏇村ソ錛夈傞氫織鐨勮錛岀浉淇$兢浼楋紙鍥犱負緹や紬鐨勭溂鐫涙槸闆寒鐨勶級銆傚湪榪欎釜鍋囪鍓嶆彁涓嬶紝鎴戜滑鍙互灝咥/B鐜鍓峃鏉$粨鏋滅殑鐐瑰嚮鐜囪嚜鍔ㄦ槧灝勪負璇勫垎錛岄氳繃緇熻澶ч噺鐨凲uery鐐瑰嚮緇撴灉錛屽彲浠ヨ幏寰楀彲闈犵殑璇勫垎瀵規瘮銆?/p>
鍙﹀2003騫寸敱Thorsten Joachims 絳変漢鎻愬嚭鐨処nterleaving testing鏂規硶涔熻騫挎硾浣跨敤銆傝鏂規硶璁捐浜嗕竴涓厓鎼滅儲寮曟搸錛岀敤鎴瘋緭鍏ユ煡璇㈣瘝鍚庯紝灝嗘煡璇㈣瘝鍦ㄥ嚑涓憲鍚嶆悳绱㈠紩鎿庝腑鐨勬煡璇㈢粨鏋滈殢鏈烘販鍚堝弽棣堢粰鐢ㄦ埛錛屽茍鏀墮泦闅忓悗鐢ㄦ埛鐨勭粨鏋滅偣鍑昏涓轟俊鎭紟鏍規嵁鐢ㄦ埛涓嶅悓鐨勭偣鍑誨懼悜鎬э紝灝卞彲浠ュ垽鏂悳绱㈠紩鎿庤繑鍥炵粨鏋滅殑浼樺姡錛?/p>
濡備笅鍥炬墍紺猴紝灝嗙畻娉旳鍜孊鐨勭粨鏋滀氦鍙夋斁緗紝騫跺垎嫻侀噺榪涜嫻嬭瘯錛岃褰曠敤鎴風偣鍑諱俊鎭傛牴鎹偣鍑誨垎甯冩潵鍒ゆ柇A鍜孊鐜鐨勪紭鍔c?/p>
Interleaving Testing璇勪及鏂規硶
Joachims鍚屾椂璇佹槑浜咺nterleaving Testing璇勪環鏂規硶涓庝紶緇烠ranfield璇勪環鏂規硶鐨勭粨鏋滃叿鏈夎緝楂樼殑鐩稿叧鎬с傜敱浜庤褰曠敤鎴烽夋嫨媯绱㈢粨鏋滅殑琛屼負鏄竴涓笉鑰楄垂浜哄姏鐨勮繃紼嬶紝鍥犳鍙互渚挎嵎鐨勫疄鐜拌嚜鍔ㄥ寲鐨勬悳绱㈡晥鏋滆瘎浼般?/p>
娌℃湁璇勪及灝辨病鏈夎繘姝?#8212;—瀵規悳绱㈡晥鏋滅殑閲忓寲璇勬祴錛岀洰鐨勬槸鍑嗙‘鐨勬壘鍑虹幇鏈夋悳绱㈢郴緇熺殑涓嶈凍錛堟病鏈夊摢涓悳绱㈢郴緇熸槸瀹岀編鐨勶級錛岃繘鑰屼竴姝ヤ竴涓剼鍗板綆楁硶銆佺郴緇熻繘琛屾敼榪涖傛湰鏂囦負澶у鎬葷粨浜嗗父鐢ㄧ殑璇勪環妗嗘灦鍜岃瘎浠鋒寚鏍囥傝繖浜涙妧鏈儚涓鎶婃妸灝哄瓙錛屽害閲忕潃鎼滅儲鎶鏈瘡涓嬈″墠榪涚殑璺濈銆?/p>
鎰熻阿寮犲嚡宄?/a>瀵?鏈枃鐨勫鏍°?/p> 緇橧nfoQ涓枃绔欐姇紼挎垨鑰呭弬涓庡唴瀹圭炕璇戝伐浣滐紝璇烽偖浠惰嚦editors@cn.infoq.com銆備篃嬈㈣繋澶у鍔犲叆鍒?a target="_blank" style="box-sizing: border-box; color: #0b59b2;">InfoQ涓枃绔欑敤鎴瘋璁虹粍
鎴戜滑鎴幏鍑芥暟鎵ц鏈鐩存帴鐨勭洰鐨勫氨鏄負鍑芥暟澧炴坊鍔熻兘錛屼慨鏀硅繑鍥炲鹼紝鎴栬呬負璋冭瘯浠ュ強鎬ц兘嫻嬭瘯鍔犲叆闄勫姞鐨勪唬鐮侊紝鎴栬呮埅鑾峰嚱鏁扮殑杈撳叆杈撳嚭浣滅爺絀訛紝鐮磋В浣跨敤銆傞氳繃璁?闂簮浠g爜錛屾垜浠彲浠ヨ交鑰屾槗涓劇殑浣跨敤閲嶅緩錛圧ebuilding錛夋搷浣滅郴緇熸垨鑰呭簲鐢ㄧ▼搴忕殑鏂規硶鍦ㄥ畠浠腑闂存彃鍏ユ柊鐨勫姛鑳芥垨鑰呭仛鍔熻兘鎵╁睍銆傜劧鑰岋紝鍦ㄤ粖澶╄繖涓晢涓?鍖栫殑寮鍙戜笘鐣岄噷錛屼互鍙婂湪鍙湁浜岃繘鍒朵唬鐮佸彂甯冪殑緋葷粺涓紝鐮旂┒浜哄憳鍑犱箮娌℃湁鏈轟細鍙互寰楀埌婧愪唬鐮併傛湰鏂囦富瑕佽璁篋etour鍦╓indows浜岃繘鍒禤E鏂囦歡鍩虹 涓婄殑API鎴幏鎶鏈傚浜嶭inux騫沖彴錛屼綔榪欎歡浜嬫儏灝嗕細闈炲父鐨勭畝鍗曪紝鐢變簬鏈鍒濈殑鎿嶄綔緋葷粺璁捐鑰呭紩鍏ヤ簡LD_PRELOAD銆傚鏋滀綘璁劇疆 LD_PRELOAD=mylib.so 錛岄偅涔堝簲鐢ㄧ▼搴忓湪杞藉叆 dll鏃訛紝浼氬厛鏌ョ湅mylib.so鐨勭鍙瘋〃錛屽湪relocation 鐨勬椂鍊欎細浼樺厛 浣跨敤mylib.so 閲岀殑 symbol 銆傚亣濡備綘鍦╩ylib.so閲屾湁涓猵rintf() 錛岄偅涔堣繖涓猵rintf灝變細鏇夸唬libc鐨?printf銆?鑰屽湪mylib.so閲岀殑榪欎釜printf鍙互鐩存帴璁塊棶 libc.so閲岀殑printf鍑芥暟鎸囬拡鏉ヨ幏寰楃湡姝g殑 printf鐨勫叆鍙e湴 鍧銆?榪欐牱錛屾墍鏈夌殑dll鐨凙PI HOOK鍦╨oader鍔犺澆dll鐨勬椂鍊欏氨宸茬粡瀹屾垚錛岄潪甯歌嚜鐒訛紝鍜屽鉤鍙扮浉鍏崇殑閮ㄥ垎鍏ㄩ儴浜ょ粰loader鍘誨鐞嗐?/span>
涓銆?nbsp; Detour寮鍙戝簱錛?/span>
飦?nbsp; 綆浠?/span>
Detours鏄竴涓湪x86騫沖彴涓婃埅鑾蜂換鎰廤in32鍑芥暟璋冪敤鐨勫伐鍏峰簱銆備腑鏂唬鐮佸彲浠ュ湪榪愯鏃跺姩鎬佸姞杞姐侱etours浣跨敤涓涓棤鏉′歡杞Щ鎸囦護鏉ユ浛鎹㈢洰 鏍囧嚱鏁扮殑鏈鍒濆嚑鏉℃寚浠わ紝灝嗘帶鍒舵祦杞Щ鍒頒竴涓敤鎴鋒彁渚涚殑鎴幏鍑芥暟銆傝岀洰鏍囧嚱鏁頒腑鐨勪竴浜涙寚浠よ淇濆瓨鍦ㄤ竴涓縐頒負“trampoline” 錛堣瘧娉細鑻辨枃鎰忎負韞?搴婏紝鏉傛妧錛夌殑鍑芥暟涓紝鍦ㄨ繖閲屾垜瑙夊緱緲昏瘧鎴愮洰鏍囧嚱鏁扮殑閮ㄥ垎鍏嬮殕/鎷瘋礉姣旇緝璐村垏銆傝繖浜涙寚浠ゅ寘鎷洰鏍囧嚱鏁頒腑琚浛鎹㈢殑浠g爜浠ュ強涓涓噸鏂拌煩杞埌鐩爣鍑芥暟鐨勬棤鏉′歡鍒?鏀傝屾埅鑾峰嚱鏁板彲浠ユ浛鎹㈢洰鏍囧嚱鏁幫紝鎴栬呴氳繃鎵ц“trampoline”鍑芥暟鐨勬椂鍊欏皢鐩爣鍑芥暟浣滀負瀛愮▼搴忔潵璋冪敤鐨勫姙娉曟潵鎵╁睍鍔熻兘銆?/span>
Detours鏄墽琛屾椂琚彃鍏ョ殑銆傚唴瀛樹腑鐨勭洰鏍囧嚱鏁扮殑浠g爜涓嶆槸鍦ㄧ‖鐩樹笂琚慨鏀圭殑錛屽洜鑰屽彲浠ュ湪涓涓緢濂界殑綺掑害涓婁嬌寰楁埅鑾蜂簩榪涘埗鍑芥暟鐨勬墽琛屽彉寰楁洿瀹規槗銆備緥濡傦紝 涓涓簲鐢ㄧ▼搴忔墽琛屾椂鍔犺澆鐨凞LL涓殑鍑芥暟榪囩▼鍙互琚彃鍏ヤ竴孌墊埅鑾蜂唬鐮侊紙detoured錛夛紝涓庢鍚屾椂錛岃繖涓狣LL榪樺彲浠ヨ鍏朵粬搴旂敤紼嬪簭鎸夋甯告儏鍐墊墽琛岋紙璇?娉細涔熷氨鏄寜鐓т笉琚埅鑾風殑鏂瑰紡鎵ц錛屽洜涓篋LL浜岃繘鍒舵枃浠舵病鏈夎淇敼錛屾墍浠ュ彂鐢熸埅鑾鋒椂涓嶄細褰卞搷鍏朵粬榪涚▼絀洪棿鍔犺澆榪欎釜DLL錛夈備笉鍚屼簬DLL鐨勯噸鏂伴摼鎺ユ垨鑰?闈欐侀噸瀹氬悜錛孌etours搴撲腑浣跨敤鐨勮繖縐嶄腑鏂妧鏈‘淇濅笉浼氬獎鍝嶅埌搴旂敤紼嬪簭涓殑鏂規硶鎴栬呯郴緇熶唬鐮佸鐩爣鍑芥暟鐨勫畾浣嶃?/span>
濡傛灉鍏朵粬浜轟負浜嗚皟璇曟垨鑰呭湪鍐呴儴浣跨敤鍏朵粬緋葷粺媯嫻嬫墜孌佃岃瘯鍥句慨鏀逛簩榪涘埗浠g爜錛孌etours灝嗘槸涓涓彲浠ユ櫘閬嶄嬌鐢ㄧ殑寮鍙戝寘銆傛嵁鎴戞墍鐭ワ紝Detours鏄涓 涓彲浠ュ湪浠繪剰騫沖彴涓婂皢鏈慨鏀圭殑鐩爣浠g爜浣滀負涓涓彲浠ラ氳繃“trampoline”璋冪敤鐨勫瓙紼嬪簭鏉ヤ繚鐣欑殑寮鍙戝寘銆傝屼互鍓嶇殑緋葷粺鍦ㄩ昏緫涓婇鍏堝皢鎴幏浠g爜鏀懼埌鐩?鏍囦唬鐮佷腑錛岃屼笉鏄皢鍘熷鐨勭洰鏍囦唬鐮佸仛涓轟竴涓櫘閫氱殑瀛愮▼搴忔潵璋冪敤銆傛垜浠嫭鐗圭殑“trampoline”璁捐瀵逛簬鎵╁睍鐜版湁鐨勮蔣浠剁殑浜岃繘鍒朵唬鐮佹槸鑷沖叧閲嶈鐨勩?/span>
鍑轟簬浣跨敤鍩烘湰鐨勫嚱鏁版埅鑾峰姛鑳界殑鐩殑錛孌etours鍚屾牱鎻愪緵浜嗙紪杈戜換浣旸LL瀵煎叆琛ㄧ殑鍔熻兘錛岃揪鍒板悜瀛樺湪鐨勪簩榪涘埗浠g爜涓坊鍔犱換鎰忔暟鎹妭琛ㄧ殑鐩殑錛屽悜涓涓柊榪?紼嬫垨鑰呬竴涓凡緇忚繍琛岀潃鐨勮繘紼嬩腑娉ㄥ叆涓涓狣LL銆備竴鏃﹀悜涓涓繘紼嬫敞鍏ヤ簡DLL錛岃繖涓姩鎬佸簱灝卞彲浠ユ埅鑾蜂換浣昗in32鍑芥暟錛屼笉璁哄畠鏄湪搴旂敤紼嬪簭涓垨鑰呭湪緋葷粺搴?涓?/span>
飦?nbsp; 鍩烘湰鍘熺悊
1錛?nbsp; WIN32榪涚▼鐨勫唴瀛樼鐞?
浼楁墍鍛ㄧ煡錛學INDOWS NT瀹炵幇浜嗚櫄鎷熷瓨鍌ㄥ櫒錛屾瘡涓WIN32榪涚▼鎷ユ湁4GB鐨勮櫄瀛樼┖闂達紝 鍏充簬WIN32榪涚▼鐨勮櫄瀛樼粨鏋勫強鍏舵搷浣滅殑鍏蜂綋緇嗚妭璇峰弬闃匴IN32 API鎵嬪唽錛?浠ヤ笅浠呮寚鍑轟笌Detours鐩稿叧鐨勫嚑鐐癸細
(1) 榪涚▼瑕佹墽琛岀殑鎸囦護涔熸斁鍦ㄨ櫄瀛樼┖闂翠腑
(2) 鍙互浣跨敤QueryProtectEx鍑芥暟鎶婂瓨鏀炬寚浠ょ殑欏甸潰鐨勬潈闄愭洿鏀逛負鍙鍙啓鍙墽琛岋紝鍐嶆敼鍐欏叾鍐呭錛屼粠鑰屼慨鏀規鍦ㄨ繍琛岀殑紼嬪簭
(3) 鍙互浣跨敤VirtualAllocEx浠庝竴涓繘紼嬩負鍙︿竴姝h繍琛岀殑榪涚▼鍒嗛厤铏氬瓨錛屽啀浣跨敤 QueryProtectEx鍑芥暟鎶婇〉闈㈢殑鏉冮檺鏇存敼涓哄彲璇誨彲鍐欏彲鎵ц錛屽茍鎶婅鎵ц鐨勬寚浠や互浜岃繘鍒舵満鍣ㄧ爜鐨勫艦寮忓啓鍏ワ紝浠庤屼負涓涓鍦ㄨ繍琛岀殑榪涚▼娉ㄥ叆浠繪剰鐨勪唬鐮?銆?/span>
2錛?鎷︽埅WIN32 API鐨勫師鐞?
Detours瀹氫箟浜嗕笁涓蹇碉細
(1) Target鍑芥暟錛氳鎷︽埅鐨勫嚱鏁幫紝閫氬父涓篧indows鐨凙PI銆?/span>
(2) Trampoline鍑芥暟錛歍arget鍑芥暟鐨勯儴鍒嗗鍒跺搧銆傚洜涓篋etours灝嗕細鏀瑰啓Target鍑芥暟錛屾墍浠ュ厛鎶奣arget鍑芥暟鐨勫墠5涓瓧鑺傚鍒朵繚瀛樺ソ錛屼竴鏂歸潰浠嶇劧淇濆瓨Target鍑芥暟鐨勮繃紼嬭皟鐢ㄨ涔夛紝鍙︿竴鏂歸潰渚夸簬浠ュ悗鐨勬仮澶嶃?/span>
(3) Detour 鍑芥暟錛氱敤鏉ユ浛浠arget鍑芥暟鐨勫嚱鏁般?
Detours鍦═arget鍑芥暟鐨勫紑澶村姞鍏MP Address_of_ Detour_ Function鎸囦護錛堝叡5涓瓧鑺傦級鎶婂Target鍑芥暟 鐨勮皟鐢ㄥ紩瀵煎埌鑷繁鐨凞etour鍑芥暟錛?鎶奣arget鍑芥暟鐨勫紑澶寸殑5涓瓧鑺傚姞涓奐MP Address_of_ Target _ Function+ 5鍏?0涓瓧鑺備綔涓篢rampoline鍑芥暟銆傝鍙傝冧笅闈㈢殑鍥?鍜屽浘2銆?/span>
(鍥?錛欴etour鍑芥暟鐨勮繃紼?
![]()
錛堝浘2錛?Detour鍑芥暟鐨勮皟鐢ㄨ繃紼嬶級
![]()
璇存槑錛?/span>
飦?nbsp; 鐩爣鍑芥暟錛?/span>
鐩爣鍑芥暟鐨勫嚱鏁頒綋錛堜簩榪涘埗錛夎嚦灝戞湁5涓瓧鑺備互涓娿傛寜鐓у井杞殑璇存槑鏂囨。Trampoline鍑芥暟鐨勫嚱鏁頒綋鏄嫹璐濆墠5涓瓧鑺傚姞涓涓棤鏉′歡璺寵漿鎸囦護鐨勮瘽錛堝鏋滄病 鏈夌壒孌婂鐞嗕笉鍙垎鍓叉寚浠ょ殑璇濓級錛岄偅涔堝墠5涓瓧鑺傚繀欏繪槸瀹屾暣鎸囦護錛屼篃灝辨槸涓嶈兘絎?涓瓧鑺傚拰絎?涓瓧鑺傛槸涓鏉′笉鍙垎鍓茬殑鎸囦護錛屽惁鍒欎細閫犳垚Trampoline 鍑芥暟鎵ц閿欒錛屼竴鏉″畬鏁寸殑鎸囦護琚‖鎬у垎鍓插紑鏉ワ紝閫犳垚紼嬪簭宕╂簝銆傚浜庣5瀛楄妭鍜岀6涓瓧鑺傛槸涓嶅彲鍒嗗壊鎸囦護闇瑕佽皟鏁存嫹璐濆埌鏉傛妧鍑芥暟(Trampoline)鐨?瀛楄妭涓暟錛岃繖涓煎彲浠ユ煡鐪嬬洰鏍囧嚱鏁扮殑姹囩紪浠g爜寰楀埌銆傛鍑芥暟鏄洰鏍囧嚱鏁扮殑淇敼鐗堟湰錛屼笉鑳藉湪Detour鍑芥暟涓洿鎺ヨ皟鐢紝闇瑕侀氳繃瀵筎rampoline鍑芥暟 鐨勮皟鐢ㄦ潵杈懼埌闂存帴璋冪敤銆?/span>
飦?nbsp; Trampoline鍑芥暟錛?/span>
姝ゅ嚱鏁伴粯璁ゅ垎閰嶄簡32涓瓧鑺傦紝鍑芥暟鐨勫唴瀹瑰氨鏄嫹璐濈殑鐩爣鍑芥暟鐨勫墠5涓瓧鑺傦紝鍔犱笂涓涓狫MP Address_of_ Target _ Function+5鎸囦護,鍏?0涓瓧鑺傘?/span>
姝ゅ嚱鏁頒粎渚涙偍鐨凞etour鍑芥暟璋冪敤錛屾墽琛屽畬鍓?涓瓧鑺傜殑鎸囦護鍚庡啀緇濆璺寵漿鍒扮洰鏍囧嚱鏁扮殑絎?涓瓧鑺傜戶緇墽琛屽師鍔熻兘鍑芥暟銆?/span>
飦?nbsp; Detour鍑芥暟錛?/span>
姝ゅ嚱鏁版槸鐢ㄦ埛闇瑕佺殑鎴幏API鐨勪竴涓ā鎷熺増鏈紝璋冪敤鏂瑰紡錛屽弬鏁頒釜鏁板繀欏誨拰鐩爣鍑芥暟鐩鎬竴鑷淬傚鐩爣鍑芥暟鏄痏_stdcall錛屽垯Detour鍑芥暟澹版槑涔熷繀欏?鏄痏_stdcall,鍙傛暟涓暟鍜岀被鍨嬩篃蹇呴』鐩稿悓錛屽惁鍒欎細閫犳垚紼嬪簭宕╂簝銆傛鍑芥暟鍦ㄧ▼搴忚皟鐢ㄧ洰鏍囧嚱鏁扮殑絎竴鏉℃寚浠ょ殑鏃跺欏氨浼氳璋冪敤錛堟棤鏉′歡璺寵漿榪囨潵鐨勶級錛屽 鏋滃湪姝ゅ嚱鏁頒腑鎯崇戶緇皟鐢ㄧ洰鏍囧嚱鏁幫紝蹇呴』璋冪敤Trampoline鍑芥暟錛圱rampoline鍑芥暟鍦ㄦ墽琛屽畬鐩爣鍑芥暟鐨勫墠5涓瓧鑺傜殑鎸囦護鍚庝細鏃犳潯浠惰煩杞埌鐩爣 鍑芥暟鐨?涓瓧鑺傚悗緇х畫鎵ц錛夛紝涓嶈兘鍐嶇洿鎺ヨ皟鐢ㄧ洰鏍囧嚱鏁幫紝鍚﹀垯灝嗚繘鍏ユ棤絀烽掑綊錛堢洰鏍囧嚱鏁拌煩杞埌Detour鍑芥暟錛孌etour鍑芥暟鍙堣煩杞埌鐩爣鍑芥暟鐨勯掑綊錛?鍥犱負鐩爣鍑芥暟鍦ㄥ唴瀛樹腑鐨勫墠5涓瓧鑺傚凡緇忚淇敼鎴愮粷瀵硅煩杞級銆傞氳繃瀵筎rampoline鍑芥暟鐨勮皟鐢ㄥ悗鍙互鑾峰彇鐩爣鍑芥暟鐨勬墽琛岀粨鏋滐紝姝ょ壒鎬у鍒嗘瀽鐩爣鍑芥暟闈?甯告湁鐢紝鑰屼笖鍙互灝嗙洰鏍囧嚱鏁扮殑杈撳嚭緇撴灉榪涜淇敼鍚庡啀浼犲洖緇欏簲鐢ㄧ▼搴忋?/span>
Detour鎻愪緵浜嗗悜榪愯涓殑搴旂敤紼嬪簭娉ㄥ叆Detour鍑芥暟鍜屽湪浜岃繘鍒舵枃浠跺熀紜涓婃敞鍏etour鍑芥暟涓ょ鏂瑰紡銆傛湰绔犱富瑕佽璁虹浜岀宸ヤ綔鏂瑰紡銆傞氳繃 Detours鎻愪緵鐨勫紑鍙戝寘鍙互鍦ㄤ簩榪涘埗EXE鏂囦歡涓坊鍔犱竴涓悕縐頒負Detour鐨勮妭琛紝濡備笅鍥?鎵紺猴紝涓昏鐩殑鏄疄鐜癙E鍔犺澆鍣ㄥ姞杞藉簲鐢ㄧ▼搴忕殑鏃跺欎細鑷?鍔ㄥ姞杞芥偍緙栧啓鐨凞etours DLL錛屽湪Detours Dll涓殑DLLMain涓畬鎴愬鐩爣鍑芥暟鐨凞etour銆?/span>
錛堝浘3錛?/span>
![]()
浜屻?nbsp; Detours鎻愪緵鐨勬埅鑾稟PI鐨勭浉鍏蟲帴鍙?/span>
Detours鐨勬彁渚涚殑API 鎺ュ彛鍙互浣滀負涓涓叡浜獶LL緇欏閮ㄧ▼搴忚皟鐢紝涔熷彲浠ヤ綔涓轟竴涓潤鎬丩ib閾炬帴鍒版偍鐨勭▼搴忓唴閮ㄣ?/span>
Trampoline鍑芥暟鍙互鍔ㄦ佹垨鑰呴潤鎬佺殑鍒涘緩錛屽鏋滅洰鏍囧嚱鏁版湰韜槸涓涓摼鎺ョ鍙鳳紝浣跨敤闈欐佺殑trampoline鍑芥暟灝嗛潪甯哥畝鍗曘傚鏋滅洰鏍囧嚱鏁頒笉鑳藉湪閾炬帴鏃跺彲瑙侊紝閭d箞鍙互浣跨敤鍔ㄦ乼rampoline鍑芥暟銆?/span>
飦?nbsp; 瑕佷嬌鐢ㄩ潤鎬佺殑trampoline鍑芥暟鏉ユ埅鑾風洰鏍囧嚱鏁幫紝搴旂敤紼嬪簭鐢熸垚trampoline鐨勬椂鍊欏繀欏諱嬌鐢?/span>
DETOUR_TRAMPOLINE瀹忋侱ETOUR_TRAMPOLINE鏈変袱涓緭鍏ュ弬鏁幫細trampoline鐨勫師鍨嬪拰鐩爣鍑芥暟鐨勫悕瀛椼?/span>
娉ㄦ剰錛屽浜庢紜殑鎴幏妯″瀷錛屽寘鎷洰鏍囧嚱鏁幫紝trampoline鍑芥暟錛屼互鍙婃埅鑾峰嚱鏁伴兘蹇呴』鏄畬鍏ㄤ竴鑷寸殑璋冪敤褰㈠紡錛屽寘鎷弬鏁版牸寮忓拰璋冪敤綰﹀畾銆傚綋閫氳繃 trampoline鍑芥暟璋冪敤鐩爣鍑芥暟鐨勬椂鍊欐嫹璐濇紜弬鏁版槸鎴幏鍑芥暟鐨勮矗浠匯傜敱浜庣洰鏍囧嚱鏁頒粎浠呮槸鎴幏鍑芥暟鐨勪竴涓彲璋冪敤鍒嗘敮錛堟埅鑾峰嚱鏁板彲浠ヨ皟鐢?trampoline鍑芥暟涔熷彲浠ヤ笉璋冪敤錛夛紝榪欑璐d換鍑犱箮灝辨槸涓縐嶄笅鎰忚瘑鐨勮涓恒?/span>
浣跨敤鐩稿悓鐨勮皟鐢ㄧ害瀹氬彲浠ョ‘淇濆瘎瀛樺櫒涓殑鍊艱姝g‘鐨勪繚瀛橈紝騫朵笖淇濊瘉璋冪敤鍫嗘爤鍦ㄦ埅鑾峰嚱鏁拌皟鐢ㄧ洰鏍囧嚱鏁扮殑鏃跺欒兘姝g‘鐨勫緩绔嬪拰閿姣併?/span>
鍙互浣跨敤DetourFunctionWithTrampoline鍑芥暟鏉ユ埅鑾風洰鏍囧嚱鏁般傝繖涓嚱鏁版湁涓や釜鍙傛暟錛歵rampoline鍑芥暟浠ュ強鎴幏鍑芥暟鐨勬寚閽堛傚洜涓虹洰鏍囧嚱鏁板凡緇忚鍔犲埌trampoline鍑芥暟涓紝鎵鏈変笉闇瑕佸湪鍙傛暟涓壒鍒寚瀹氥?/span>
飦?nbsp; 鎴戜滑鍙互浣跨敤DetourFunction鍑芥暟鏉ュ垱寤轟竴涓姩鎬佺殑trampoline鍑芥暟錛屽畠鍖呮嫭涓や釜鍙傛暟錛氫竴涓寚鍚戠洰鏍囧嚱鏁扮殑鎸囬拡鍜屼竴涓埅鑾峰嚱鏁扮殑鎸囬拡銆侱etourFunction鍒嗛厤涓涓柊鐨則rampoline鍑芥暟騫跺皢閫傚綋鐨勬埅鑾蜂唬鐮佹彃鍏ュ埌鐩爣鍑芥暟涓幓銆?/span>
褰撶洰鏍囧嚱鏁頒笉鏄緢瀹規槗浣跨敤鐨勬椂鍊欙紝DetourFindFunction鍑芥暟鍙互鎵懼埌閭d釜鍑芥暟錛屼笉綆″畠鏄疍LL涓鍑虹殑鍑芥暟錛屾垨鑰呮槸鍙互閫氳繃浜岃繘鍒剁洰鏍囧嚱鏁扮殑璋冭瘯絎﹀彿鎵懼埌銆?/span>
DetourFindFunction鎺ュ彈涓や釜鍙傛暟錛氬簱鐨勫悕瀛楀拰鍑芥暟鐨勫悕瀛椼傚鏋淒etourFindFunction鍑芥暟鎵懼埌浜嗘寚瀹氱殑鍑芥暟錛岃繑鍥炶鍑芥暟 鐨勬寚閽堬紝鍚﹀垯灝嗚繑鍥炰竴涓狽ULL鎸囬拡銆侱etourFindFunction浼氶鍏堜嬌鐢╓in32鍑芥暟LoadLibrary 鍜?GetProcAddress鏉ュ畾浣嶅嚱鏁幫紝濡傛灉鍑芥暟娌℃湁鍦―LL鐨勫鍑鴻〃涓壘鍒幫紝DetourFindFunction灝嗕嬌鐢↖mageHlp搴撴潵鎼滅儲鏈?鏁堢殑璋冭瘯絎﹀彿錛堣瘧娉細榪欓噷鐨勮皟璇曠鍙鋒槸鎸嘩indows鏈韓鎻愪緵鐨勮皟璇曠鍙鳳紝闇瑕佸崟鐙畨瑁咃紝鍏蜂綋淇℃伅璇峰弬鑰僕indows鐨勭敤鎴瘋瘖鏂敮鎸佷俊鎭級銆?DetourFindFunction榪斿洖鐨勫嚱鏁版寚閽堝彲浠ョ敤鏉ヤ紶閫掔粰DetourFunction浠ョ敓鎴愪竴涓姩鎬佺殑trampoline鍑芥暟銆?/span>
鎴戜滑鍙互璋冪敤DetourRemoveTrampoline鏉ュ幓鎺夊涓涓洰鏍囧嚱鏁扮殑鎴幏銆?/span>
娉ㄦ剰錛屽洜涓篋etours涓殑鍑芥暟浼氫慨鏀瑰簲鐢ㄧ▼搴忕殑鍦板潃絀洪棿錛岃紜繚褰撳姞鍏ユ埅鑾峰嚱鏁版垨鑰呭幓鎺夋埅鑾峰嚱鏁扮殑鏃跺欐病鏈夊叾浠栫嚎紼嬪湪榪涚▼絀洪棿涓墽琛岋紝榪欐槸紼嬪簭鍛樼殑璐d換銆備竴涓畝鍗曠殑鏂規硶淇濊瘉榪欎釜鏃跺欐槸鍗曠嚎紼嬫墽琛屽氨鏄湪鍔犺澆Detours搴撶殑鏃跺欏湪DllMain涓懠鍙嚱鏁般?/span>
涓夈?nbsp; 浣跨敤Detours瀹炵幇瀵笰PI鐨勬埅鑾風殑涓ょ鏂規硶
寤虹珛涓涓狹FC瀵硅瘽妗嗗伐紼嬶紝鍦ㄥ璇濇鐨凮K鎸夐挳鐨勫崟鍑諱簨浠朵腑鍔犲叆瀵筂essageBoxA鍑芥暟鐨勮皟鐢紝緙栬瘧鍚庣殑紼嬪簭鍚嶇ОMessageBoxApp,鏁堟灉濡傚浘銆?/span>
![]()
(鍥?)
飦?nbsp; 闈欐佹柟娉?/span>
寤虹珛涓涓狣ll宸ョ▼錛屽悕縐頒負ApiHook錛岃繖閲屼互Visual C++6.0寮鍙戠幆澧冿紝浠ユ埅鑾稟SCII鐗堟湰鐨凪essageBoxA鍑芥暟鏉ヨ鏄庛傚湪Dll鐨勫伐紼嬪姞鍏ワ細
DETOUR_TRAMPOLINE(int WINAPI Real_Messagebox(HWND hWnd ,
LPCSTR lpText,
LPCSTR lpCaption,
UINT uType), ::MessageBoxA);
鐢熸垚涓涓潤鎬佺殑MessageBoxA鐨凾rampoline鍑芥暟錛屽湪Dll宸ョ▼涓姞鍏ョ洰鏍囧嚱鏁扮殑Detour鍑芥暟錛?/span>
int WINAPI MessageBox_Mine( HWND hWnd ,
LPCSTR lpText,
LPCSTR lpCaption,
UINT uType)
{
CString tmp= lpText;
tmp+=” 琚獶etour鎴幏”;
return Real_Messagebox(hWnd,tmp,lpCaption,uType);
// return ::MessageBoxA(hWnd,tmp,lpCaption,uType); //Error
}
鍦―ll鍏ュ彛鍑芥暟涓殑鍔犺澆Dll浜嬩歡涓姞鍏ワ細
DetourFunctionWithTrampoline((PBYTE)Real_Messagebox, (PBYTE)MessageBox_Mine);
鍦―ll鍏ュ彛鍑芥暟涓殑鍗歌澆Dll浜嬩歡涓姞鍏ワ細
DetourRemove((PBYTE)Real_Messagebox, (PBYTE)MessageBox_Mine);
飦?nbsp; 鍔ㄦ佹柟娉?/span>
寤虹珛涓涓狣ll宸ョ▼錛屽悕縐頒負ApiHook錛岃繖閲屼互Visual C++6.0寮鍙戠幆澧冿紝浠ユ埅鑾稟SCII鐗堟湰鐨凪essageBoxA鍑芥暟鏉ヨ鏄庛傚湪Dll鐨勫伐紼嬪姞鍏ワ細
//澹版槑MessageBoxA涓鏍風殑鍑芥暟鍘熷瀷
typedef int (WINAPI * MessageBoxSys)( HWND hWnd ,
LPCSTR lpText,
LPCSTR lpCaption,
UINT uType);
//鐩爣鍑芥暟鎸囬拡
MessageBoxSys SystemMessageBox=NULL;
//Trampoline鍑芥暟鎸囬拡
MessageBoxSys Real_MessageBox=NULL;
鍦―ll宸ョ▼涓姞鍏ョ洰鏍囧嚱鏁扮殑Detour鍑芥暟錛?/span>
int WINAPI MessageBox_Mine( HWND hWnd ,
LPCSTR lpText,
LPCSTR lpCaption,
UINT uType)
{
CString tmp= lpText;
tmp+=” 琚獶etour鎴幏”;
return Real_Messagebox(hWnd,tmp,lpCaption,uType);
// return ::MessageBoxA(hWnd,tmp,lpCaption,uType); //Error
}
鍦―ll鍏ュ彛鍑芥暟涓殑鍔犺澆Dll浜嬩歡涓姞鍏ワ細
SystemMessageBox=(MessageBoxSys)DetourFindFunction("user32.dll","MessageBoxA");
if(SystemMessageBox==NULL)
{
return FASLE;
}
Real_MessageBox=(MessageBoxSys)DetourFunction((PBYTE)SystemMessageBox, (PBYTE)MessageBox_Mine);
鍦―ll鍏ュ彛鍑芥暟涓殑鍗歌澆Dll浜嬩歡涓姞鍏ワ細
DetourRemove((PBYTE)Real_Messagebox, (PBYTE)MessageBox_Mine);
飦?nbsp; 閲嶅啓浜岃繘鍒跺彲鎵ц鏂囦歡
浣跨敤Detours鑷甫鐨凷etDll.exe閲嶅啓浜岃繘鍒跺彲鎵ц鏂囦歡錛屽彲浠ュ湪闇瑕佹埅鑾風殑紼嬪簭涓姞鍏ヤ竴涓柊鐨凞etours鐨凱E鑺傝〃銆傚浜庢湰鏂囧氨鏄柊寤轟竴涓壒澶勭悊鏂囦歡璋冪敤SetDll.exe銆?/span>
@echo off
if not exist MessageBoxApp.exe (
echo 璇峰皢鏂囦歡瑙e帇鍒癕essageBoxApp.exe鐨勫畨瑁呯洰褰? 鐒跺悗鎵ц琛ヤ竵紼嬪簭
) else (
setdll /d:ApiHook.dll MessageBoxApp.exe
)
Pause
璋冪敤鍚庝嬌鐢╠epends.exe錛堝井杞疺C6.0寮鍙戝寘鐨勫伐鍏蜂箣涓錛夎瀵烳essageBoxApp.exe鍓嶅悗鍙樺寲錛?鍙互鐪嬪埌Setdll宸茬粡閲嶅啓MessageBoxApp.exe
鎴愬姛錛屽姞鍏ヤ簡瀵笰piHook.dll鐨勪緷璧栧叧緋匯?/span>
![]()
錛堟墽琛孲etDll.exe鍓嶏級 (鎵цSetDll.exe鍚?
鎵цSetDll.exe閲嶅啓鍚庣殑MessageBoxApp.exe錛岀偣鍑葷‘瀹氬悗鍙互鐪嬪埌緇撴灉濡備笅錛?/span>
鑷蟲錛孧essageBoxApp.exe瀵筂essageBoxA鍑芥暟鐨勮皟鐢ㄥ凡緇忚鎴幏錛屽脊鍑虹殑瀵硅瘽妗嗗唴瀹瑰凡緇忔槑鏄捐鏄庤繖涓鐐廣?/span>![]()
鏈枃杞嚜錛?/span>http://www.cnblogs.com/flying_bat/archive/2008/04/18/1159996.html
1銆佸洿緇曟暟鎹紪紼嬩笌涓嶆槸鍥寸粫UI緙栫▼
褰撴垜浠嬁鍒伴渶姹傛渶鍏堟帴瑙﹀埌鐨勫氨鏄疷I鐨勮璁★紝涔熻鏄編宸ョ敾鐨勶紝涔熻鏄璁¤崏鍥俱傚伐紼嬪笀鍦ㄥ叿浣撹璁$殑鏃跺欏鏄撳彈UI鐨勫獎鍝嶏紝鎴栬呭共鑴嗕粠UI寮濮嬬紪紼嬨?/span>
榪欐槸涓涓敊璇殑緙栫▼涔犳儻錛屾棤璁篣I濡備綍灞曠幇涓庝氦浜掞紝鏈緇堥兘搴旇鍥寸粫鏁版嵁緙栫▼銆傛嬁鍒伴渶姹傚悗錛屽簲璇ュ厛鎬濊冨拰鎺ㄦ暡鏁版嵁鐨勮璁′笌嫻佽漿錛孶I涓嶈繃灝辨槸鏁版嵁鐨勪竴縐嶅睍鐜板艦寮忚屽凡銆?/span>
2銆佸仛濂経I涓庨昏緫鐨勮В鑰?/span>
UI鐨勭紪紼嬩細娑夊強鍒拌澶氭帶浠剁殑鎿嶄綔錛屾秷鎭殑澶勭悊錛屼笉鐭ヤ笉瑙夛紝涓涓猆I綾葷殑浠g爜浼氳秺鍐欒秺澶э紝浠ヨ嚦浜庝竴孌墊椂闂翠互鍚庯紝嫻忚鍜屾⒊鐞嗛兘浼氬彉寰椾笉澶柟渚褲?/span>
鍦║I綾婚噷錛岄櫎浜嗕笌UI鏈韓鐨勬搷浣滄湁鍏崇殑浠g爜浠ュ錛屼換浣曢昏緫浠g爜閮藉簲璇ヤ笌姝よВ鑰︼紝騫舵牴鎹叿浣撴儏鍐佃繘琛屽皝瑁呰皟鐢ㄣ傚鏋滀竴涓帶浠跺叧鑱斾簡澶鏁版嵁鎿嶄綔錛屽簲璇ユ妸榪欎簺鎿嶄綔灝佽鍒版帶浠剁殑緇ф壙綾諱腑錛屾妸涓綾諱唬鐮佽繘琛岄泦涓鐞嗗拰緇存姢銆?/span>
涓婅堪闂錛屽湪紼嬪簭鍐欎綔鐨勫垵鏈熻繕涓嶅お鏄庢樉錛岄殢鐫浠g爜閫愭笎鑶ㄨ儉錛屼細瓚婁細瓚婅浜洪毦浠ュ繊鍙椼?/span>
3銆佹暟鎹崟鍚戜緷璧栵紝鍗曞悜鏇存柊
UI鍥寸粫鐨勬暟鎹繘琛屽睍鐜頒笌鏇存柊錛屽湪榪欎釜榪囩▼涓紝鎵浠ュ鏁版嵁鐨勬搷浣滃簲璇ヨ繘琛屽皝瑁咃紝鑰屼笉鏄暎钀藉湪UI紼嬪簭鍦ㄥ悇涓钀斤紝鏁版嵁鐨勬洿鏂般佽幏鍙栧拰UI浼犻掓秷鎭椂錛屽簲璇ュ崟鍚戞搷浣滐紝濡傛灉鍑虹幇寰幆澶勭悊鐨勬儏鍐碉紝鍦ㄤ互鍚庣淮鎶よ皟璇曠殑BUG鐨勮繃紼嬩腑浼氬彉寰楁瘮杈冨洶闅撅紝瀵艱嚧緇存姢鏁堢巼涓嬮檷銆?/span>
鏈枃鏉ヨ嚜CSDN鍗氬錛岃漿杞借鏍囨槑鍑哄錛?/span>http://www.shnenglu.com/humanchao
1銆佷笉鎰挎剰灝嗗氨鐨勪漢
紼嬪簭璁捐宸ヤ綔鏄竴欏瑰湴鍦伴亾閬撶殑鑴戝姏鍔沖姩錛屾妸宸ヤ綔鍋氬緱寰堝ソ鍜屽仛鐨勫緢宸線寰鍙湪宸ヤ綔涓殑涓涓皬灝忕殑緇嗚妭錛屾垜鍙戠幇鎴戣韓杈逛紭縐鐨勭▼搴忓憳閮戒笉澶枩嬈㈠皢灝憋紝濮嬬粓鎶婅嚜宸辯殑璁$畻鏈哄拰鑷繁鐨勫紑鍙戠幆澧冭皟鏁村埌鏈浣崇姸鎬侊紝鍘熸潵甯︽垜鐨勮佸憳宸ョ敋鑷充細鑷繁鍐欎竴浜涘皬宸ュ叿錛屾潵鎻愰珮宸ヤ綔鏁堢巼銆?/span>
2銆佷笉鍠滄铔共
鑴戝姏鍔沖姩涓庝綋鍔涘姵鍔ㄤ笉鍚岋紝寰堝鏃跺欏緢闅鵑氳繃綆鍗曠殑閲忕殑縐瘡杈懼埌鐩殑錛屽挨鍏舵槸澶勭悊涓浜涢毦棰樼殑鏃跺欍備竴鍛崇殑寮鴻皟铔共錛屽姞鐝嚑涔庡ぉ鐢熶笌楂樻墜鏃犵紭銆傛病鏈夋濊礬鐨勬椂鍊欙紝鎹釜鐜錛屼篃璁哥瓟妗堝氨鍦ㄦ槑澶╀笂鐝殑璺笂鎯寵搗銆?/span>
3銆佹効鎰忔濊冦佷笓娉ㄦ敼榪?/strong>
紼嬪簭鍛樹笌鍏朵粬鍔沖姩鑰呯浉浼鹼紝鐔熺粌浜嗕互鍚庨兘浼氬艦鎴愭儻鎬ф濈淮錛屼細涓嶈嚜瑙夌殑鐢ㄨ嚜宸變範鎯殑鏂瑰紡瑙e喅闂錛屼絾闂鐨勫艦寮忎笌鏈川鎬諱細鍙樺寲錛屽彧鏈変笉鏂殑鏀硅繘鎵嶈兘浣垮伐浣滄晥鐜囦笉鏂彁楂樸傝屾妸鑴戝姏鍔沖姩鍙樻垚浣撳姏鍔沖姩鐨勭幇璞″湪瀹為檯宸ヤ綔涓瘮姣旂殕鏄?/span>
4銆佽壇濂界殑鍩虹鍜屼笉鏂殑瀛︿範
鑹ソ鐨勫熀紜涓庝笉鏂殑瀛︿範鏄ぉ鐢熺殑涓瀵瑰鐢熷厔寮燂紝鍥犱負鍩虹濂芥墍浠ュ鐨勫揩錛屽洜涓哄寰楀揩錛屾墍浠ュ熀鏈姛濂姐傝壇濂藉涔犱範鎯笉鏄笉鍋滅殑綆鍗曡拷韙柊鎶鏈紝涓鏂歸潰鏄簡瑙f柊鎶鏈紝鍙︿竴鏂歸潰闇瑕佷笉鏂殑寮ヨˉ鎬濈淮鐩插尯錛屽涔犲彲浠ユ湁寰堝縐嶇姸鎬侊紝鏈変竴縐嶆槸闂諱竴鑰岀煡涓錛屾妧涔燂紝鏈変竴縐嶆槸闂諱竴鑰岀煡涓夛紝鏈篃錛屾湁涓縐嶆槸闂諱竴鑰岀煡鍗侊紝閬撲篃銆?/span>
5銆佺洿鎺ュ垏鍏ラ棶棰樼殑鑳藉姏
鍦ㄨВ鍐充竴涓棶棰樼殑鏃跺欙紝鏈変簺浜烘繪槸鑳藉鐩存帴鍒囧叆闂鏍稿績錛岃屾湁浜涗漢鎬繪槸鍠滄鍏蟲敞杈圭紭闂銆傜洿鍏ヤ富棰樻槸涓縐嶆牳蹇冭兘鍔涳紝闇瑕佹濊冿紝瀹炶返錛屾敼榪涳紝縐瘡錛屾彁楂橈紝鍛ㄨ屽浣匡紝铻烘棆涓婂崌銆傚彟澶栨垜瑙夊緱榪欎笌鎬濈淮鏂瑰紡涓庣煡璇嗛潰鍏崇郴寰堝ぇ錛屽娑夌寧涓浜涢鍩熸病鏈夊潖澶勩?/span>
***鑻辮***錛氬懙鍛碉紝瀵癸紝榪樻槸鑻辮錛屾祦鍒╃殑鍚璇誨啓銆?/span>
鏈枃鏉ヨ嚜CSDN鍗氬錛岃漿杞借鏍囨槑鍑哄錛?/span>http://www.shnenglu.com/humanchao
鍏堢粰澶у鐪嬩竴孌墊嵁璇存槸鍙蹭笂鏈寮虹殑紼嬪簭錛?br />e100 33 f6 bf 0 20 b5 10 f3 a5 8c c8 5 0 2 50 68 13 1 cb e 1f be a1 1 bf 0 1
e11b 6 57 b8 11 1 bb 21 13 89 7 4b 4b 48 79 f9 ad 86 e0 8b c8 bd ff ff e8 20
e134 0 3d 0 1 74 1a 7f 3 aa eb f3 2d ff 0 50 e8 f 0 5a f7 d8 8b d8 26 8a 1 aa
e14f 4a 75 f9 eb de cb 57 bb 21 13 8b c1 40 f7 27 f7 f5 8b fb ba 11 1 4f 4f 4a
e168 39 5 7f f9 52 8b c5 f7 25 f7 37 2b c8 95 f7 65 2 f7 37 95 2b e8 fe e fe
e181 10 79 6 c6 6 fe 10 7 46 d0 14 d1 d1 d1 e5 79 ec 5a b8 11 1 ff 7 4b 4b 48
e19b 3b d0 75 f7 5f c3 83 f7 83 a6 5d 59 82 cd b2 8 42 46 9 57 a9 c5 ca aa 1b
.............................................................................
榪欐紼嬪簭鏄?997騫翠笘鐣岀▼搴忚璁″ぇ璧涚殑涓絳夊浣滃搧鐨勯儴鍒嗕唬鐮侊紙瀹屾暣鐨勪唬鐮佷笅杞斤紝鎶婁唬鐮佸鍒剁矘璐村埌cmd鐨刣ebug鍛戒護涓紝鍥炶濺鐪嬪埌鏁堟灉錛夈傝繖涓▼搴忚繍琛屽悗灝嗘槸涓涓?D鐨勪笖浼撮殢鐫闊充箰鐨勫姩鐢匯傞渿鎾煎惂錛?br />鏄笉鏄粠浜嬭蔣浠跺紑鍙戠殑浜哄憳閮藉笇鏈涙垚涓鴻繖鏍風殑姝︽灄楂樻墜鍛紵鐒惰岀湡瑕佹槸鐢ㄨ繖鏍風殑楂樻墜鏉ヨ璁°佺紪鍐欐垜浠殑浜у搧浠g爜錛屾亹鎬曟煇涓澶╋紝鎴戜滑浠涔堥兘涓嶇敤騫蹭簡錛屽彧鑳戒漢鎵嬩竴鏈満鍣ㄤ唬鐮侊紝涓鍙ヤ竴鍙ヨ繘琛岀炕璇戜簡錛涢偅涔堝浜庤蔣浠朵駭鍝佸紑鍙戣岃█錛屽浣曞啓濂戒唬鐮佸憿錛熶竴嫻佺殑杞歡浜у搧鐨勪唬鐮佸叿澶囧摢浜涚壒寰佸憿錛?/p>
涓嫻佷唬鐮佺殑鐗瑰緛
1銆佺ǔ瀹氬彲闈狅紙Robustness錛?
浠g爜鍐欏嚭鏉ヤ互鍚庯紝涓瀹氳鑳藉榪愯寰楅潪甯稿ソ錛岄潪甯哥ǔ瀹氬彲闈犮傚湪鐜頒粖鐨処T琛屼笟錛岃蔣浠朵駭鍝侀兘鏄槸24*7錛屽嵆瑕佷繚璇佺郴緇熶竴澶?4灝忔椂錛屼竴鏄熸湡7澶╀腑閮藉彲浠ユ棤闂存柇鐨勬甯歌繍琛屻傛瘮濡傛垜浠櫨搴︾殑鎼滅儲寮曟搸緋葷粺錛屾瘮濡傛垜浠殑閫氫俊緋葷粺錛岀瓑絳夈傚埌浜嗕駭鍝佸紑鍙戝悗鏈燂紝澶ч儴鍒嗙殑鎴愭湰閮藉皢鎶曞叆鍒頒駭鍝佺ǔ瀹氭х殑鎻愰珮銆?
2銆佸彲緇存姢涓旂畝媧侊紙Maintainable and Simple Code錛?br />鍦ㄥ啓浠g爜鏃訛紝棣栧厛瑕佽冭檻鐨勬槸錛氬啓鍑烘潵鐨勪唬鐮佷笉浣嗚鑷繁鍙互璇繪噦錛岃屼笖鎴戜滑鐨勫悓浜嬨佹祴璇曞伐紼嬪笀閮藉彲鑳借淇敼榪欎簺浠g爜錛屽鍏惰繘琛屽鍑忋傚鏋滀唬鐮佸緢澶嶆潅錛屼笉瀹規槗璇繪噦錛屽紼嬪簭涓殑閫掑綊涓澶у爢銆佺▼搴忎笉鐭ヤ綍鏃舵垨浠庝綍鍦拌煩鍑猴紝鍒欎細浣跨▼搴忕殑鍙淮鎶ゆу拰綆媧佹ч檷浣庛傛墍浠ュ繀瑕佺殑娉ㄩ噴銆佺粺涓鐨勭紪紼嬭鑼冪瓑閮芥槸闈炲父閲嶈鐨勩?
3銆侀珮鏁堬紙Fast錛?br />鍦ㄨ蔣浠惰涓氫腑鏁堢巼鏄潪甯擱噸瑕佺殑錛屾瘮濡傛悳绱㈠紩鎿庛傛湁浜涜蔣浠剁殑鎼滅儲鏁堢巼灝變笉楂橈紝鎼滅儲榪囩▼鐗瑰埆緙撴參錛岃浜洪毦浠ユ帴鍙椼傚綋鐒惰繖閲岄潰鏈変竴涓甫瀹界殑闂錛屼絾鏄▼搴忔晥鐜囦笉楂樹篃鏄竴涓噸瑕佺殑鍘熷洜銆傝屽疄闄呬笂紼嬪簭鐨勬晥鐜囨彁楂橈紝鏈夋椂鍊欏緢綆鍗曪紝騫舵病鏈変粈涔堢縐樹箣澶勶紝濡備嬌鐢ㄦ暟緇勭儲寮曟椂鍊欙紝鍙互鐢ㄦ寚閽堟柟寮忚屼笉浣跨敤鏁扮粍涓嬫爣錛涙暟緇勭殑絀洪棿瀹氫箟搴旇瀹氫箟涓?鐨凬嬈″箓絳夌瓑銆?
4銆佺畝鐭紙Small錛?br />榪欐柟闈㈠ぇ瀹剁殑鎰熷彈鍙兘涓嶆槸寰堟繁錛屼絾鏄垜鐨勬劅鍙楁槸寰堟繁鐨勩傞厤緗繃PSTN紼嬫帶浜ゆ崲鏈恒佽礬鐢卞櫒銆乂oIP緗戝叧璁懼鐨勪漢閮界煡閬擄紝榪欎簺璁懼鐨勮蔣浠墮兘鏄粠PC鏈洪氳繃緗戝彛鎴栦覆鍙d笅杞藉埌榪欎簺璁懼鐨凢lash涓婏紙綾諱技PC鏈虹殑BIOS錛夊啀閫氳繃璁懼涓婄殑CPU鍚姩銆傚鏋滅▼搴忓啓鐨勫緢緗楀棪錛岄殢鐫鐗規т笉鏂鍔狅紝紼嬪簭瑙勬ā灝嗗彉澶х殑宸ㄥぇ錛孎lash絀洪棿鍛婃ャ佸唴瀛樺憡鎬ャ佷笅杞藉崌綰у彉鐨勪笉鍙繊鍙楋紝絳夌瓑錛屽甫鏉ョ殑灝辨槸鎴愭湰涓嶆柇澧炲姞錛屽埄娑︿笉鏂笅闄嶃?
5銆佸叡浜э紙Reusable錛?br />濡傛灉鍋氬ぇ鍨嬩駭鍝佸紑鍙戯紝紼嬪簭鐨勫叡浜т篃鏄潪甯擱噸瑕佺殑銆傛垜浠駭鍝佹湁閭d箞澶氬紑鍙戜漢鍛橈紝濡傛灉姣忎竴涓漢閮借嚜宸卞畾涔夊瓧絎︿覆銆侀摼琛ㄧ瓑鏁版嵁緇撴瀯錛岄偅涔堝紑鍙戞晥鐜囧氨浼氶檷浣庯紝鎴戜滑鐨勪駭鍝佹亹鎬曞埌浠婂ぉ涔熶笉鑳藉嚭鍙般傛垜鎵璇寸殑“鍏變韓”涓嶆槸鎸囧皢鍒漢鐨勪唬鐮佸鍒跺埌鑷繁鐨勪唬鐮佷腑錛岃屾槸鎸囩洿鎺ヨ皟鐢ㄥ埆浜虹殑浠g爜錛屾嬁鏉ュ嵆鍙敤銆傝繖涓鏂歸潰鍙互鍑忓皯浠g爜鐨勫啑浣欐э紝鍙︿竴鏂歸潰鍙互澧炲己浠g爜鐨勫彲緇存姢鎬с傚鏋滃埆浜虹殑浠g爜閲屾湁Bug錛屽彧闇淇敼浠栫殑浠g爜錛岃岃皟鐢ㄦ浠g爜鐨勭▼搴忎笉鐢ㄨ繘琛屼換浣曚慨鏀瑰氨鍙互杈懼埌鍚屾銆傝繖鍚屾椂瑕佹眰鎴戜滑鍦ㄨ璁$殑鏃跺欙紝濡備綍鑰冭檻緋葷粺鐨勫唴鑱氬拰鑰﹀悎鐨勯棶棰樸?
6銆佸彲嫻嬭瘯鎬э紙Testable錛?br />鎴戜滑鐨勪駭鍝佸紑鍙戦噷錛岄櫎浜嗚蔣浠跺紑鍙戜漢鍛橈紝榪樻湁涓閮ㄥ垎宸ョ▼甯堣礋璐h蔣浠舵祴璇曘傝蔣浠舵祴璇曚漢鍛樹細灝嗗紑鍙戜唬鐮佹嬁鏉ワ紝涓琛屼竴琛屽湴榪愯錛岀湅紼嬪簭榪愯鏄惁鏈夐敊銆傚鏋滆蔣浠跺紑鍙戜漢鍛樼殑浠g爜涓嶅彲嫻嬭瘯錛岄偅嫻嬭瘯宸ョ▼甯堝氨娌℃湁鍔炴硶榪涜宸ヤ綔銆傚洜姝ゅ彲嫻嬭瘯鎬у湪澶у瀷杞歡寮鍙戦噷鏄緢閲嶈鐨勪竴鐐廣傚彲嫻嬭瘯鎬ф湁鏃跺欎笌鍙淮鎶ゆф槸閬ョ浉鍛煎簲鐨勶紝涓涓叿鏈夊ソ鐨勫彲嫻嬭瘯鎬у拰鍙淮鎶ゆх殑浠g爜錛屾祴璇曚漢鍛樺彲浠ユ牴鎹紑鍙戞彁渚涚殑緇存姢鎵嬪唽銆乨ebug淇℃伅鎵嬪唽絳夊氨鍙互鍒ゆ柇鍑虹▼搴忓嚭閿欏湪鍝釜妯″潡銆?
7銆佸彲縐繪鎬э紙Portable錛?br />鍙Щ妞嶆ф槸鎸囩▼搴忓啓鍑烘潵浠ュ悗錛屼笉浠呭湪windows 2000閲屽彲浠ヨ繍琛岋紝鍦∟T/9X涓嬪彲浠ヨ繍琛岋紝鑰屼笖鍦↙inux鐢氳嚦Macintosh絳夌郴緇熶笅閮藉彲浠ヨ繍琛屻傛墍鏈夎繖浜涚壒鎬ч兘鏄竴嫻佷唬鐮佹墍鍏峰鐨勭壒鎬с備絾鏄叾涓湁浜涚壒鎬ф槸浼氭湁鍐茬獊鐨勩傛瘮濡傞珮鏁堟э紝紼嬪簭鍐欑殑鏁堢巼寰堥珮錛屽氨鍙兘鍙樺緱寰堝鏉傦紝鐗虹壊鐨勫氨鏄畝媧併傚ソ鐨勪唬鐮佽鍦ㄨ繖浜涚壒鎬т腑鍙栧緱騫寵 銆?
鍐欏ソ浠g爜鐨?0涓瀵?br />
1銆佺櫨瀹朵箣闀垮綊鎴戞墍鏈夛紙Follow Basic Coding Style錛?br />鍏跺疄鍐欎唬鐮佺殑鏂瑰紡鏈夊緢澶氾紝姣忎釜浜洪兘鏈夎嚜宸辯殑椋庢牸錛屼絾鏄紬澶氱殑椋庢牸涓繪湁涓浜涘叡鎬х殑銆佸熀鏈殑鍐欎唬鐮佺殑椋庢牸錛屽涓虹▼搴忓啓娉ㄩ噴銆佷唬鐮佸榻愶紝絳夌瓑銆傛槸涓嶆槸緙栫▼瑙勮寖錛熷灝辨槸緙栫▼瑙勮寖銆?
2銆佸彇涓ソ鍚嶅瓧錛圲se Naming Conventions錛?br />鍙栦釜濂界殑鍑芥暟鍚嶃佸彉閲忓悕錛屾渶濂芥寜鐓т竴瀹氱殑瑙勫垯璧峰悕銆傝繕鏄紪紼嬭鑼冦?
3銆佸噷娉㈠井姝ワ紝鏈繀鎽旇筏錛圗vil goto's?Maybe Not...錛?br />榪欓噷鎴戠敤“鍑屾嘗寰”鏉ュ艦瀹筭oto璇彞銆傞氬父錛実oto璇彞浣跨▼搴忚煩鏉ヨ煩鍘伙紝涓嶅鏄撹錛岃屼笖涓嶈兘浼樺寲錛屼絾鏄湪鏌愮鎯呭喌涓嬶紝goto璇彞鍙嶈屽彲浠ュ寮虹▼搴忕殑鍙鎬с侸ust go ahead錛宯ot go back銆?
4銆佸厛鍙戝埗浜猴紝鍚庡彂鍒朵簬浜猴紙Practic Defensive Coding錛?br />Defensive Coding鎸囦竴浜涘彲鑳戒細鍑洪敊鐨勬儏鍐碉紝濡傚彉閲忕殑鍒濆鍖栫瓑錛岃鑰冭檻鍒板嚭鐜伴敊璇儏鍐典笅鐨勫鐞嗙瓥鐣ャ傛祴璇曟椂瑕佸榪愯鍑犱釜綰跨▼銆傛湁浜涚▼搴忓湪涓涓嚎鍩庝笅榪愯鏄甯哥殑錛屼絾鏄湪澶氫釜綰跨▼騫惰榪愯鏃跺氨浼氬嚭鐜伴棶棰橈紱鑰屾湁浜涚▼搴忓湪涓涓狢PU涓嬭繍琛屽嚑涓嚎紼嬫槸姝e父鐨勶紝浣嗘槸鍦ㄥ涓狢PU涓嬭繍琛屾椂灝變細鍑虹幇闂錛屽洜涓哄崟CPU榪愯綰跨▼鍙槸鐙箟鐨勫茍琛岋紝澶欳PU涓璧瘋繍琛岀▼搴忥紝鎵嶆槸鐪熸鐨勫茍琛岃繍綆椼?
5銆佽鎷涙媶鎷涳紝婊存按涓嶆紡錛圚andle The Error Cases錛歍hey Will Occur錛侊級
榪欓噷鐨凟rror Case錛堥敊璇儏鍐碉級錛屾槸鎸囬偅浜涗笉鏄撻噸瑙嗙殑閿欒銆傚鏋滀笉瀵笶rror Case榪涜澶勭悊錛岀▼搴忓湪澶氭暟鎯呭喌涓嬩笉浼氬嚭閿欙紝浣嗘槸涓鏃﹀嚭鐜板紓甯革紝紼嬪簭灝變細宕╂簝銆?6銆佺啛涔犲墤娉曞垁鏈紝鎵鍚戞棤鏁岋紙Learn Win32 API Seriously錛?br />鐢?#8220;鍓戞硶鍒鏈?#8221;鏉ュ艦瀹逛竴浜汚PI鏄洜涓哄畠浠兘鏄粡榪囦簡寰堝浼樼寮鍙戜漢鍛樼殑涓嶆柇寮鍙戙佹祴璇曪紝鍏舵晥鐜囧緢楂橈紝鑰屼笖綆媧佹槗鎳傦紝甯屾湜澶у鑳芥帉鎻″畠錛岀啛鎮夊畠錛屼嬌鐢ㄥ畠銆傛槸涓嶆槸璞℃垜浠殑ULIB銆?
7銆佸弻鎵嬩簰鎼忥紝鏃犲潥涓嶆懅錛圱est,but don't stop there錛?br />榪欓噷鐨勬祴璇曚笉鏄寚鍒漢鏉ユ祴璇曚綘鐨勪唬鐮侊紝鑰屾槸鎸囪嚜宸卞幓嫻嬭瘯銆傚洜涓轟綘鏄啓浠g爜鐨勫師浣滆咃紝瀵逛唬鐮佺殑浜嗚В鏈娣憋紝鍒漢涓嶅彲鑳芥瘮浣犳洿浜嗚В錛屾墍浠ヤ綘鑷繁鍦ㄦ祴璇曟椂錛屽彲浠ュ緢濂藉湴鍘繪祴璇曞摢浜涜竟鐣屾潯浠訛紝浠ュ強涓浜涙剰鍚戜笉鍒扮殑鎯呭喌銆?
8銆佹椿鐢ㄦ柇璦錛圲se,don't abuse,assertions錛?br />鏂█錛坅ssertion錛夋槸涓緢濂界殑璋冭瘯宸ュ叿鍜屾柟娉曪紝甯屾湜澶у鑳藉鐢ㄦ柇璦錛屼絾鏄茍涓嶆槸鎵鏈夌殑鎯呭喌涓嬮兘鍙互鐢ㄥ埌鏂█銆傛湁浜涙儏鍐典嬌鐢ㄦ柇璦鍙嶈屼笉鍚堥傘?
9銆佽崏鏈ㄧ殕鍏碉紝涓嶅彲澶ф剰錛圓void Assumptions錛?br />鏄寚鍦ㄥ啓浠g爜鏃訛紝瑕佸皬蹇冧竴浜涜緭鍏ョ殑鎯呭喌錛屾瘮濡傝緭鍏ユ枃浠躲乀CP鐨剆ockets銆佸嚱鏁扮殑鍙傛暟絳夌瓑錛屼笉瑕佽涓轟嬌鐢ㄦ垜浠殑API鐨勭敤鎴烽兘鐭ラ亾浠涔堟槸姝g‘鐨勩佷粈涔堟槸閿欑殑錛屼篃灝辨槸璇翠竴瀹氳鑰冭檻鍒板澶栨帴鍙g殑鍑洪敊澶勭悊闂銆?
10銆佹渶楂樺鐣屻佹棤鎷涜儨鏈夋嫑錛圫top writing so much code錛?br />鎰忔濆氨鏄灝介噺閬垮厤鍐欏お澶氱殑浠g爜錛屽啓鐨勮秺澶氾紝鍑洪敊鐨勬満浼氫篃瓚婂銆傛渶濂借兘閲嶇敤鍒漢寮鏀劇殑鎺ュ彛鍑芥暟鎴栫洿鎺ヨ皟鐢ㄥ埆浜虹殑api銆?
鏈枃鏉ヨ嚜CSDN鍗氬錛岃漿杞借鏍囨槑鍑哄錛?a href="http://www.shnenglu.com/humanchao/archive/2010/08/05/122334.html">http://www.shnenglu.com/humanchao/archive/2010/08/05/122334.html
杞嚜錛?a >http://yinkai210.blog.163.com/blog/static/287483452009050256466/
榪欎簺绔彛濡傛灉琚叾浠栫▼搴忓崰鐢ㄥ氨涓嶈兘姝e父鍚姩錛屾瘮濡傛湁鏃跺惎鍔ㄦ椂浼氭彁紺篧EB鍚姩澶辮觸錛屽叾瀹炲氨鏄?0绔彛琚崰鐢ㄤ簡錛岃岃繀闆風瓑涓嬭澆杞歡鎭版伆灝辨槸鍗犵敤浜?0绔彛錛屽叧鎺夊氨琛屼簡銆備絾鏈夋椂榪呴浄絳夐兘娌℃湁寮涔熷惎鍔ㄤ笉浜嗭紝閭e氨鏄埆鐨勪笢瑗垮崰鐢ㄤ簡錛岄偅鎬庝箞鍔炲憿錛熸垜鏉ュ彨浣犳煡鐪嬬鍙e茍鍏蟲帀鐨勬柟娉曘?br />1.鍦ㄥ紑濮?-榪愯 閲岄潰杈撳叆cmd鐐瑰洖杞︼紝浼氬嚭鐜拌繍琛岀獥鍙c?br />2.鍦ㄦ彁紺虹鍚庤緭鍏etstat -ano鍥炶濺錛屾壘鍒皌cp 80绔彛瀵瑰簲鐨刾id錛屾瘮濡?484.
3.ctrl+alt+del鎵撳紑浠誨姟綆$悊鍣紝閫夎繘紼嬶紝榪欓噷鏈夊緢澶氭鍦ㄨ繍琛岀殑紼嬪簭鎬庝箞鎵撅紵鍒ョ偣涓婇潰鐨?nbsp; 鏌ョ湅--閫夋嫨鍒?-鍦≒ID錛堣繘紼嬫爣紺虹錛夊墠闈㈡墦閽┿傚ソ浜嗭紝涓嬮潰鐨勮繘紼嬪墠闈㈤兘鏈変簡PID鍙風爜銆傝繖鏃朵笂涓姝ユ壘鍒扮殑PID灝辨湁鐢ㄤ簡錛屾壘鍒?484錛屾瘮濡侾EER.EXE浠涔堢殑錛岀粨鏉熻繘紼嬪惂銆傝繖鏃跺啀寮鏈嶅姟鍣紝鐪媁EB鍙互鍚姩浜嗭紒
濡備笂闈㈢殑涓嶆竻妤氳繕鏈夌畝鏄庣殑錛?/strong>
鍋囧鎴戜滑闇瑕佺‘瀹氳皝鍗犵敤浜嗘垜浠殑80绔彛
1銆乄indows騫沖彴
鍦╳indows鍛戒護琛岀獥鍙d笅鎵ц錛?br />C:\>netstat -aon|findstr "80"
TCP 127.0.0.1:80 0.0.0.0:0 LISTENING 2448
鐪嬪埌浜嗗悧錛岀鍙h榪涚▼鍙蜂負2448鐨勮繘紼嬪崰鐢紝緇х畫鎵ц涓嬮潰鍛戒護錛?br />C:\>tasklist|findstr "2448"
thread.exe 2016 Console 0 16,064 K
寰堟竻妤氬惂錛宼hread鍗犵敤浜嗕綘鐨勭鍙?Kill it
濡傛灉絎簩姝ユ煡涓嶅埌錛岄偅灝卞紑浠誨姟綆$悊鍣紝鐪嬪摢涓繘紼嬫槸2448錛岀劧鍚庢潃涔嬪嵆鍙?/strong>
濡傛灉闇瑕佹煡鐪嬪叾浠栫鍙c傛妸 80 鏀規帀鍗沖彲
Linux鏌ョ湅绔彛浣跨敤鐘舵併佸叧闂鍙f柟娉?br />杞嚜錛?a >http://blog.csdn.net/wudiyi815/article/details/7473097
鍓嶆彁錛氶鍏堜綘蹇呴』鐭ラ亾錛岀鍙d笉鏄嫭绔嬪瓨鍦ㄧ殑錛屽畠鏄緷闄勪簬榪涚▼鐨勩傛煇涓繘紼嬪紑鍚紝閭d箞瀹冨搴旂殑绔彛灝卞紑鍚簡錛岃繘紼嬪叧闂紝鍒欒绔彛涔熷氨鍏抽棴浜嗐備笅嬈¤嫢鏌愪釜榪涚▼鍐嶆寮鍚紝鍒欑浉搴旂殑绔彛涔熷啀嬈″紑鍚傝屼笉瑕佺函綺圭殑鐞嗚В涓哄叧闂帀鏌愪釜绔彛錛屼笉榪囧彲浠ョ鐢ㄦ煇涓鍙c?/span>
1. 鍙互閫氳繃"netstat -anp" 鏉ユ煡鐪嬪摢浜涚鍙h鎵撳紑銆?/span>
錛堟敞錛氬姞鍙傛暟'-n'浼氬皢搴旂敤紼嬪簭杞負绔彛鏄劇ず錛屽嵆鏁板瓧鏍煎紡鐨勫湴鍧錛屽錛歯fs->2049, ftp->21錛屽洜姝ゅ彲浠ュ紑鍚袱涓粓绔紝涓涓瀵瑰簲涓涓嬬▼搴忔墍瀵瑰簲鐨勭鍙e彿錛?/span>
2. 鐒跺悗鍙互閫氳繃"lsof -i:$PORT"鏌ョ湅搴旂敤璇ョ鍙g殑紼嬪簭錛?PORT鎸囧搴旂殑绔彛鍙鳳級銆傛垨鑰呬綘涔熷彲浠ユ煡鐪嬫枃浠?etc/services錛屼粠閲岄潰鍙互鎵懼嚭绔彛鎵瀵瑰簲鐨勬湇鍔°?/span>
錛堟敞錛氭湁浜涚鍙i氳繃netstat鏌ヤ笉鍑烘潵錛屾洿鍙潬鐨勬柟娉曟槸"sudo nmap -sT -O localhost"錛?/span>
3. 鑻ヨ鍏抽棴鏌愪釜绔彛錛屽垯鍙互錛?/span>
1)閫氳繃iptables宸ュ叿灝嗚绔彛紱佹帀錛屽錛?/span>
"sudo iptables -A INPUT -p tcp --dport $PORT -j DROP"
"sudo iptables -A OUTPUT -p tcp --dport $PORT -j DROP"
2)鎴栬呭叧鎺夊搴旂殑搴旂敤紼嬪簭錛屽垯绔彛灝辮嚜鐒跺叧闂簡錛屽錛?/span>
"kill -9 PID" (PID錛氳繘紼嬪彿)
濡傦細 閫氳繃"netstat -anp | grep ssh"
鏈夋樉紺猴細 tcp 0 127.0.0.1:2121 0.0.0.0:* LISTEN 7546/ssh
鍒欙細 "kill -9 7546"
錛堝彲閫氳繃"chkconfig"鏌ョ湅緋葷粺鏈嶅姟鐨勫紑鍚姸鎬侊級