緙栧啓濂界殑闈㈠悜瀵硅薄浠g爜
鏈枃鏄?a >java.net涓婄殑涓綃?a >鍗氬錛屼綔鑰?a >Curtis Cooley瀵圭紪鍐欏ソ鐨勯潰鍚戝璞′唬鐮佹湁浜涘緩璁紝甯屾湜瀵瑰ぇ瀹墮兘鏈夋墍甯姪銆?2008.10.08鏈鍚庢洿鏂?
鑾峰彇緇忛獙娌℃湁鎹峰緞銆傜紪鍐欏ソ鐨勯潰鍚戝璞′唬鐮侀渶瑕佺粡楠岋紝浣嗚繖鍎挎湁涓夌鍋氭硶鑳藉府浣犲湪涓寮濮嬪氨寰堥『鍒╋紝鍗充究浣犳槸鑰侀〗鍥猴細
1. 浣跨敤嫻嬭瘯椹卞姩寮鍙?TDD)緙栧啓浣犳墍鏈夌殑浠g爜
2. 閬靛驚綆鍗曟硶鍒?/a>
3. 鍛婁箣鑰岄潪闂箣
浣跨敤TDD緙栧啓鎵鏈変唬鐮?/strong>
鎸?a href="http://ponderingobjectorienteddesign.blogspot.com/2008/09/tdd-is-design-activity.html">嫻嬭瘯鍏堣緙栧啓鐨勪唬鐮佷笌鎸夋祴璇曞悗琛岀紪鍐欑殑浠g爜鏄瀬涓轟笉鍚岀殑浠g爜銆傛寜嫻嬭瘯鍏堣緙栧啓鐨勪唬鐮佹槸鏉捐﹀悎涓庨珮鑱氬悎鐨勩傚綋鏌愪釜灞炴ф垨縐佹湁鏂規硶闇瑕佹毚闇茬粰嫻嬭瘯紼嬪簭鏃訛紝鎸夋祴璇曞悗琛岀紪鍐欑殑浠g爜甯鎬細鎵撶牬灝佽錛屽洜涓鴻綾誨茍涓嶆槸涓轟簡嫻嬭瘯鑰岃璁$殑銆傚鏋滀綘棣栧厛緙栧啓嫻嬭瘯浠g爜錛屼綘鐨勪緷璧栧皢浼氭洿濂斤紝浣犵殑浠g爜灝嗘槸鏉捐﹀悎涓庨珮鑱氬悎鐨勩傚悗闈細鏈夋洿澶氬叧浜庢祴璇曡兘甯姪浣犺璁℃洿浣充唬鐮佺殑鍐呭銆?br />
閬靛驚綆鍗曟硶鍒?/strong>
浠g爜鏄畝鍗曠殑錛屽彧瑕佸綋瀹冿細
1. 鎵ц浜嗘墍鏈夌殑嫻嬭瘯
2. 涓嶅寘鍚噸澶?br />
3. 琛ㄨ揪浜嗘墍鏈夌殑鎰忓浘
4. 浣跨敤鏈灝戠殑綾誨拰鏂規硶
娉ㄦ剰鍒版垜鐢ㄧ殑鏄釜琚帓搴忎簡鐨勫垪琛ㄦ槸寰堥噸瑕佺殑銆傞『搴忔槸閲嶈鐨勩傚彧鏈変竴涓猰ain()鏂規硶鐨勭殑GodClass[1]涓嶄細鏄畝鍗曠殑銆傝繖涓被鍙兘鎵ц浜嗘墍鏈夌殑嫻嬭瘯錛屼絾鍦ㄤ換浣曟瘮"Hello, world!"鏇村鏉傜殑紼嬪簭涓紝瀹冭偗瀹氬寘鍚簡閲嶅錛屽茍涓斾篃娌℃湁琛ㄨ揪鍑哄叏閮ㄧ殑鎰忓浘銆?br />
鎴戝姫鍔涗嬌鐢ㄧ畝鍗曟硶鍒欏幓鍏蟲敞If闂銆傛垜涓嶇煡閬撳浣曚嬌鐢ㄧ畝鍗曟硶鍒欏幓闃繪鏌愪漢緙栧啓閲嶉噺綰х殑If浠g爜銆傛湁浜哄彲鑳戒細鎻愬嚭涓嶅悓鎰忚錛屾垜涔熷皾璇曡繃錛屼絾榪欐牱鐨勯噸閲忕駭If浠g爜紜疄鏃犳硶琛ㄨ揪鎰忓浘銆備絾褰撲綘闃呰濡備笅浠g爜鏃?/span>
if (mobile.getType() == MobileTypes.STANDARD) {
alert();
}
紜疄闅句互鐪嬪嚭鍏朵腑鐨勬剰鍥俱傝繖浜涗唬鐮佹棤璁哄浜庡摢涓柟娉曠殑涓婁笅鏂囩幆澧冧腑錛屾垜浠兘鑳界煡閬擄紝濡傛灉mobile鏄疭TANDARD綾誨瀷鐨勮瘽錛岄偅涔堝氨鎶ヨ銆傝屼綘鎵闇瑕佺殑鏇村鎰忓浘鍛紵
鎴戣繕鏈変竴鐐瑰効鐏墊劅鏄劇幇銆傚鏋滄湁閭f牱鐨勪唬鐮侊紝閭d箞鍦ㄥ叾瀹冨湴鏂硅偗瀹氳繕浼氭湁鏇村閭f牱鐨勪唬鐮併傝繖浜涗唬鐮佸彲鑳藉氨鍍忥細
if (mobile.getType() == MobileTypes.GAS) {
registerGasReading();
}
鍜?/span>
if (mobile.getType() == MobileTypes.TEXT) {
sendTextMessage();
}
鍜?/span>
if (mobile.getType() == MobileTypes.LOCATION) {
notifyLocation();
}
浣犵湅鍑烘潵浜嗗悧錛熸垜鏄湅鍑烘潵浜嗐傚畠榪濆弽浜嗚鍒?錛屾湁寰堝鍦版柟閮借繚鍙嶄簡瑙勫垯2錛屽茍涓旀槸涓縐嶆渶鍧忕殑鎯呭艦銆傝繖孌典唬鐮佹湁澶氬閲嶅銆傞噸澶嶅皢鏋侀毦鍙戠幇銆傛墍浠ワ紝璇峰府鍔╅槻姝㈣繖縐嶆儏褰㈢殑鍙戠敓錛屾垜宸插寘鍚叾涓簡銆?br />
鍛婁箣鑰岄潪闂箣
綆璦涔嬶紝鍛婁箣鑰岄潪闂箣鎰忔寚涓嶈鍏堥棶涓涓璞$殑鐘舵侊紝鐒跺悗鎵嶈瀹冨幓宸ヤ綔銆傝屽簲璇ュ憡涔嬪璞″浣曞幓宸ヤ綔銆傝繖灝辨剰鍛崇潃涔嬪墠鎵鏈夌殑閭d簺If渚嬪瓙搴旇鍙樹負錛?/span>
mobile.alert();
鍜?/span>
mobile.registerGasReading();
鍜?/span>
mobile.sendTextMessage();
鍜?/span>
mobile.notifyLocation();
鐜板亣璁鵑亶甯冭紼嬪簭涓殑涓浜汭f璇彞鍧楁湁閲嶅鐨勫疄鐜般傚湪"閲嶉噺綰f"鐗堟湰鐨勭▼搴忎腑錛屽彲鑳藉緢闅懼彂鐜板畠浠紱浣嗗湪"鍛婁箣鑰岄潪闂箣"鐗堟湰鐨勭▼搴忎腑錛屾墍鏈夌殑瀹炵幇閮藉湪Mobile涓傛墍鏈夌殑瀹炵幇閮藉湪涓澶勶紝榪欏氨渚夸簬瀵熻騫舵牴闄ら棶棰樸?br />
鍊懼惉浣犵殑嫻嬭瘯紼嬪簭涔熻兘甯姪浣犱繚鎸佷唬鐮佺殑綆媧併?/span>
public interface Alarm {
void alert(Mobile mobile);
}
public class Siren implements Alarm {
public void alert(Mobile mobile) {
if (mobile.getType == MobileTypes.STANDARD) {
soundSiren();
}
}
}
public class TestSiren extends TestCase {
public void test_alert() {
LocationMobile mobile = new LocationMobile();
Siren siren = new Siren();
siren.alert(mobile);
assert(sirenSounded());
}
}
濡傛灉浣犲瘑鍒囧湴鍊懼惉嫻嬭瘯紼嬪簭錛屽畠鍙兘浼氶棶浣狅紝"涓轟粈涔堜綘闇瑕佷竴涓狶ocationMobile鍘繪祴璇昐iren鍛紵"鐨勭‘錛屼負浠涔堝憿錛熺湅璧鋒潵錛孲iren搴旇榪樹笉鐭ラ亾LocationMobile鍚с?/span>
public class LocationMobile {
private Alarm alarm;
public LocationMobile(Alarm alarm) {
this.alarm = alarm;
}
public void alert() {
alarm.alert(); // alert on Alarm no longer needs a mobile
}
}
public class TestLocationMobile() extends TestCase {
public void test_alert() {
Alarm alarm = EasyMock.createMock(Alarm.class);
alarm.alert();
EasyMock.replay(alarm);
Mobile mobile = new LocationMobile(alarm);
mobile.alert();
EasyMock.verify(alarm);
}
濂藉儚鎴戝彧鏄氦鎹簡渚濊禆鍏崇郴銆侫larm涓嶅啀渚濊禆Mobile錛岀幇鍦ㄦ槸Mobile渚濊禆Alarm銆備絾濡傛灉浣犱粩緇嗗湴瑙傚療榪欎釜嫻嬭瘯紼嬪簭錛屼綘浼氬彂鐜扮湡姝g殑渚濊禆鍏崇郴鏄紝Siren鐭ユ檽浜哃ocationMobile銆備竴涓叿浣撶被渚濊禆鍙︿竴涓叿浣撶被錛岃繖榪濆弽浜?a >渚濊禆鍙嶈漿鍘熷垯(DIP)銆傜浜屼釜渚嬪瓙灝辮LocationMobile渚濊禆Alarm鎺ュ彛銆傚叿浣撶被渚濊禆鎶借薄錛岃繖灝辨弧瓚矰IP浜嗐?br />
濡傛灉浣犱嬌鐢═DD錛屽茍閬靛驚綆鍗曟硶鍒欏拰鍛婁箣鑰岄潪闂箣鍘熷垯鍘葷紪鍐欐墍鏈夌殑浠g爜錛屼綘灝卞浜庢垚涓轟竴涓洿濂界殑闈㈠悜瀵硅薄紼嬪簭鍛樼殑閬撹礬涓婁簡銆傚ソ鐨勯潰鍚戝璞′唬鐮佹槗浜庨槄璇誨拰緇存姢錛屼絾闅句互緙栧啓錛岃嚦灝戯紝鍦ㄥ紑濮嬫椂鏄繖鏍風殑銆備綘鍐欑殑瓚婂錛屼綘灝變細鍙樺緱瓚婂ソ錛屼篃浼氳幏寰楁洿澶氱殑緇忛獙銆傚悓鏃訛紝榪欎簺瀹炶返緇忛獙涔熶細浣夸綘鍦ㄨ嚜宸辯殑閬撹礬涓婂彈鐩婂尓嫻呫?br />
璇戞敞
[1]GodClass(涓婂笣綾?鎸囧寘鍚簡澶鍐呭鐨勭被銆?br />

]]>