锘??xml version="1.0" encoding="utf-8" standalone="yes"?>中文字幕亚洲码在线,亚洲人成www在线播放,亚洲国产美女精品久久久久 http://www.tkk7.com/raimundox/category/5762.html鐭ュぉ涔嬫墍涓猴紝鐭ヤ漢涔嬫墍涓鴻咃紝鑷崇煟銆傜煡澶╀箣鎵涓鴻咃紝澶╄岀敓涔燂紱鐭ヤ漢涔嬫墍涓鴻咃紝浠ュ叾鐭ヤ箣鎵鐭ヤ互鍏誨叾鐭ヤ箣鎵涓嶇煡錛岀粓鍏跺ぉ騫磋屼笉涓亾澶咃細鏄煡涔嬬洓涔熴?/description>zh-cn Tue, 20 Apr 2010 10:10:13 GMT Tue, 20 Apr 2010 10:10:13 GMT 60 Misquotation http://www.tkk7.com/raimundox/archive/2007/11/28/163761.htmlRaimundox Raimundox Wed, 28 Nov 2007 10:08:00 GMT http://www.tkk7.com/raimundox/archive/2007/11/28/163761.html http://www.tkk7.com/raimundox/comments/163761.html http://www.tkk7.com/raimundox/archive/2007/11/28/163761.html#Feedback 1 http://www.tkk7.com/raimundox/comments/commentRss/163761.html http://www.tkk7.com/raimundox/services/trackbacks/163761.html 琚腑鍥戒漢璇紶浜嗘暟鍗冨勾鐨勪竷鍙ヨ瘽銆嬶紝棰囨湁浜涘摥絎戜笉寰楃殑鎰熸叏錛?br />
1. 榪欎簺璇濈殑紜槸琚浼犱簡涓嶅亣錛屼絾鏄渶澶氫篃灝變竴鐧懼勾鍚с備腑鍥界煡璇嗗垎瀛愪笉璇誨洓涔︿簲緇忓彶瀛愰泦鐨勫潖椋庢皵澶ф姷鏄紑濮嬩簬鎵璋撶殑鏂版枃鍖栬繍鍔ㄥ惂銆傚啀寰鍓嶇殑浜猴紝瀵逛簬榪欎簺鍏哥睄瀛楀瓧鐖⒊錛屾彁浜嗕笂鍙ラ┈涓婅儗涓嬪彞錛屽氨綆楁槸浠ョ珷鍙ュ紡瑙h涓轟富鐨勫畫鍏冿紝涔熶笉搴旇闅忛殢渚夸究灝辮蹇芥?zhèn)犱簡锛屾洿涓嶇敤璇村弽瀵瑰畫鍎掔悊瀛﹁绌舵鏈竻婧愮殑鏄庢竻浜嗐?br />
2. 鍙や漢鏂珷鍙栦箟鏄竴縐嶉闆呯殑璦璋堜範鎯紝鎵璋?#8220;闆呰█”鏄瀛楀瓧鍑哄吀鐨勶紝鏈夌偣鍍忓鏆楀彿銆傛瘮濡傛垜浠鐚窇浜嗭紝鎼佸彜浠f垜鑲畾闂?#8220;璋佷箣榪囨錛?#8221;錛屽崄鏈夊叓涔?jié)浼氬洖绛旇_紝“璦鏄吀瀹堣呬箣榪囦篃”錛岃繖鍙ュ皠鐨勬槸“铏庡厱鍑轟簬鏌?#8221;錛屾濂藉簲鏅傜敋鑷充負浜嗚瘷璋愬簲鏅紝鏁呮剰鏇茶В鏂囦箟鐨勬儏鍐典篃鏄緢甯歌鐨勩傚鏋滀互姝や負璇佽璇紶鐨勮瘽錛屾亹鎬曞彧鑳界畻鏄墰鍤肩墶涓逛簡銆傞『渚垮璇翠竴鍙ワ紝鍏跺疄榪欎釜姣涚梾鐜頒唬浜轟篃鏈夛紝涓嶈繃涓嶅啀鏄彜鏂囦簡錛屽ぇ澶氭暟鏄數(shù)褰辯數(shù)瑙嗗彴璇嶏細“絀烘皵鍦ㄩⅳ鎶栦豢浣?jīng)澶┙I哄湪鐕冪儳銆傛槸鍟婏紝鏆撮闆ㄥ氨瑕佹潵浜?#8221;錛?#8220;閬撳摜錛岀墝瀛愬晩”錛?#8220;浣犵湅鎴戠殑鑻辮錛屾湁娌℃湁闀胯繘”涔嬬被鐨勶紝铏戒笉澶嶅彜闊碉紝浣嗕篃榪樼畻鏈夎叮銆?br />
P.S. : 浠婂ぉteam閲屾湁浜烘妸David Wheeler鐨勫悕璦錛岃創(chuàng)鍦ㄤ簡Quote Wall涓婏細“Any problem in computer science can be solved with another layer of indirection.”
榪欏埌鐨勭‘綆楁槸涓鍙ヨ璇紶鐨勫悕璦鍚э紝鍘熸枃鏄?#8220;Any problem in computer science can be solved with another layer of indirection. But that usually will create another problem. ”
]]> Feng Shui for Standard ML Programmers http://www.tkk7.com/raimundox/archive/2007/07/10/129436.htmlRaimundox Raimundox Tue, 10 Jul 2007 13:53:00 GMT http://www.tkk7.com/raimundox/archive/2007/07/10/129436.html http://www.tkk7.com/raimundox/comments/129436.html http://www.tkk7.com/raimundox/archive/2007/07/10/129436.html#Feedback 4 http://www.tkk7.com/raimundox/comments/commentRss/129436.html http://www.tkk7.com/raimundox/services/trackbacks/129436.html http://www.dcs.ed.ac.uk/home/stg/fengshui.ps.gz 浠婂ぉ鏃╀笂鎵撳紑Google Reader灝辯湅瑙佽繖涔堜竴綃囷紝鍐呭鍊掍篃緗簡錛屼笉榪囨槸bad smell鐨勫彟涓涓悕瀛楄屽凡錛岀‖瑕佹壇涓婂垎姘翠篃鍙兘綆楁槸鍕夊媺寮哄己銆備笉榪囬儊闂風殑鏄紝绔熺劧鏄釜媧嬩漢鐨勬墜絎旓紝鍥藉涓嶆槍瀹炰笉鑳戒笉浠ゆ垜杈堝績蹇у晩銆?br> p.s. 棰勮鏈潵6涓湀鍙eご紱咃細"浣犺繖鍐欏綋蹇冨潖浜嗛」鐩殑椋庢按" ]]> The Keyword 'end' Drives Me Crazy http://www.tkk7.com/raimundox/archive/2007/05/11/116864.htmlRaimundox Raimundox Fri, 11 May 2007 12:32:00 GMT http://www.tkk7.com/raimundox/archive/2007/05/11/116864.html http://www.tkk7.com/raimundox/comments/116864.html http://www.tkk7.com/raimundox/archive/2007/05/11/116864.html#Feedback 1 http://www.tkk7.com/raimundox/comments/commentRss/116864.html http://www.tkk7.com/raimundox/services/trackbacks/116864.html
1 while @productions.inject( false ) { | c, p | c |= ! nullable ? (p.nonterminal) && p.symbols.all ? { | s | nullable ? s} && @nullables << p.nonterminal}
娉ㄦ剰1涓嶆槸琛屽彿...榪欏彞鐢ㄧ殑statement modifier, 1鏄垜鑳芥兂鍒扮殑鏈灝弐uby璇彞浜?.. p.s. 鎴戠幇鍦ㄥ凡緇忔仮澶嶅埌OO淇濇姢妯″紡浜?..鍒氭墠榪芥眰鐭皬榪囦簡澶寸殑鍚屾椂錛屽彂鐜頒簡ruby bulid-in object鐨勪竴涓櫡闃?.. a = Array.new 5, [] [[],[],[],[],[]] a[0] << 1 [[1],[1],[1],[1],[1]] 鎯充笉鍒板崕涓界殑Array鐩存帴鍋囪浼犺繘鍘葷殑閮芥槸鍊煎璞′簡錛屽ソ姝規(guī)偍涔熻皟涓猟up鍟?.. ]]>Church Number http://www.tkk7.com/raimundox/archive/2006/10/09/73931.htmlRaimundox Raimundox Sun, 08 Oct 2006 18:32:00 GMT http://www.tkk7.com/raimundox/archive/2006/10/09/73931.html http://www.tkk7.com/raimundox/comments/73931.html http://www.tkk7.com/raimundox/archive/2006/10/09/73931.html#Feedback 2 http://www.tkk7.com/raimundox/comments/commentRss/73931.html http://www.tkk7.com/raimundox/services/trackbacks/73931.html 姣忎釜Church number閮芥槸涓涓帴鍙椾袱涓弬鏁扮殑鍑芥暟錛岃繖涓や釜鍙傛暟鍙堥兘鏄嚱鏁幫紝絎竴涓弬鏁扮О涓哄悗緇у嚱鏁幫紝絎簩涓弬鏁板垯鍙仛闆剁偣鍑芥暟銆備緷鎹繖涓や釜鍑芥暟錛屾垜浠彲浠ュ畾涔塁hurch number zero, one, two錛?br />(define zero聽 (lambda (successor聽zero)聽zero)) (define one 錛坙ambda (successor聽zero)聽(successor聽zero))) (define two聽聽 (lambda (successor聽zero)聽(successor聽(successor聽zero))))
鍙互鐪嬪嚭錛屾墍璋搊ne灝辨槸瀵歸浂鐐瑰嚱鏁板簲鐢ㄤ竴嬈″悗緇у嚱鏁幫紝鑰宼wo鍒欐槸瀵歸浂鐐瑰嚱鏁板簲鐢ㄥ悗緇у嚱鏁扮殑緇撴灉鍐嶆搴旂敤鍚庣戶鍑芥暟錛屼緷嬈$被鎺ㄥ彲浠ュ緱鍒癈hurch Number n銆備笅闈㈡垜浠彲浠ラ氳繃鍚庣戶鍑芥暟increase鍜岄浂鐐瑰嚱鏁癴(x) = 0鏉ョ湅鐪嬭繖浜汣hurch Number鐨勮綆楃粨鏋滐細(define聽(increase聽x)聽( + 聽x聽 1 )) (zero increase 0) > 0 (one increase 0) >1 (two increase 0) >2 an approximate Java version: public interface Function<T> { 聽聽聽 T apply(Object... parameters); } public interface ChurchNumber { 聽聽聽 Integer apply(Function<Integer> successor, Function<Integer> zero); } ChurchNumber zero = new ChurchNumber() { 聽聽 public Integer apply(Function<Integer> successor,聽 Function<Integer> zero) { 聽聽聽聽聽 return zero.apply(); 聽聽 } }; ChurchNumber one = new ChurchNumber() { 聽聽 public Integer apply(Function<Integer> successor, Function<Integer> zero) { 聽聽聽聽聽 return successor.apply(zero); 聽聽 } }; ChurchNumber two = new ChurchNumber() { 聽聽 public Integer apply(Function<Integer> successor, Function<Integer> zero) { 聽 聽 聽 return successor.apply(successor.apply(zero)); 聽聽 } }; Function increase = new Function<Integer>() { 聽public Integer apply(Object... parameters) { 聽聽 if (parameters[0] instanceof Function) { 聽聽聽聽聽 return ((Function<Integer>) parameters[0]).apply() + 1; 聽聽 } 聽聽 return (Integer) parameters[0] + 1; 聽} }; Function numberZero = new Function<Integer>() { 聽聽 public Integer apply(Object... parameters) { return 0;} }; System.out.println(zero.apply(increase, numberZero)); >0 System.out.println(one.apply(increase, numberZero)); >1 System.out.println(two.apply(increase, numberZero)); >2
瀹氫箟浜咰hurch number鍚庯紝鎴戜滑緇х畫瀹氫箟Church number涓婄殑榪愮畻錛岄鍏堟槸澧炲姞1錛?br />(define聽(inc聽x)聽(lambda (successor聽zero) (successor (x successor zero)) )) (define three (inc two)) (three increase 0) >3 an approximate Java version: static ChurchNumber inc(final ChurchNumber churchNumber) { 聽聽 return new ChurchNumber() { 聽聽聽聽聽 public Integer apply(Function<Integer> successor, Function<Integer> zero) { 聽聽聽 聽聽聽聽 return successor.apply(churchNumber.apply(successor, zero)); 聽聽聽 聽聽 } 聽聽 }; } ChurchNumber three = inc(two); System.out.println(three.apply(increase, numberZero)); >3
鐒跺悗鏄姞娉曪細(define聽(add聽x y)聽(lambda ( successor聽zero )聽 (x successor (y successor zero)))) (define five (add three two)) (five increase 0) >5 an approximate Java version: static ChurchNumber add(final ChurchNumber x, final ChurchNumber y) { 聽聽聽 聽聽聽 return new ChurchNumber() { 聽聽聽 聽聽聽 聽聽聽 public Integer apply(final Function<Integer> successor, 聽聽聽 聽聽聽 聽聽聽 聽聽聽 聽聽聽 final Function<Integer> zero) { 聽聽聽 聽聽聽 聽聽聽 聽聽聽 return x.apply(successor, new Function<Integer>() { 聽聽聽 聽聽聽 聽聽聽 聽聽聽 聽聽聽 public Integer apply(Object... parameters) { 聽聽聽 聽聽聽 聽聽聽 聽聽聽 聽聽聽 聽聽聽 return y.apply(successor, zero); 聽聽聽 聽聽聽 聽聽聽 聽聽聽 聽聽聽 } 聽聽聽 聽聽聽 聽聽聽 聽聽聽 }); 聽聽聽 聽聽聽 聽聽聽 } 聽聽聽 聽聽聽 }; } ChurchNumber five = add(two, three); System.out.println(five.apply(increase, numberZero)); >5
鏈鍚庢槸涔樻硶錛?br />(define聽(multiply聽x聽y) (lambda ( successor聽zero )聽 (x聽 (lambda (z) (y successor z)) zero))) (define four (multiply two two)) (four increase 0) >4 an approximate Java version: static ChurchNumber multiply(final ChurchNumber x, final ChurchNumber y) { 聽聽聽 聽聽聽 return new ChurchNumber() { 聽聽聽 聽聽聽 聽聽聽 public Integer apply(final Function<Integer> successor, 聽聽聽 聽聽聽 聽聽聽 聽聽聽 聽聽聽 Function<Integer> zero) { 聽聽聽 聽聽聽 聽聽聽 聽聽聽 return x.apply(new Function<Integer>() { 聽聽聽 聽聽聽 聽聽聽 聽聽聽 聽聽聽 public Integer apply(final Object... parameters) { 聽聽聽 聽聽聽 聽聽聽 聽聽聽 聽聽聽 聽聽聽 return y.apply(successor, new Function<Integer>() { 聽聽聽 聽聽聽 聽聽聽 聽聽聽 聽聽聽 聽聽聽 聽聽聽 public Integer apply(Object... ignoredParameters) { 聽聽聽 聽聽聽 聽聽聽 聽聽聽 聽聽聽 聽聽聽 聽聽聽 聽聽聽 if (parameters[0] instanceof Function) { 聽聽聽 聽聽聽 聽聽聽 聽聽聽 聽聽聽 聽聽聽 聽聽聽 聽聽聽 聽聽聽 return ((Function<Integer>) parameters[0]).apply(); 聽聽聽 聽聽聽 聽聽聽 聽聽聽 聽聽聽 聽聽聽 聽聽聽 聽聽聽 } 聽聽聽 聽聽聽 聽聽聽 聽聽聽 聽聽聽 聽聽聽 聽聽聽 聽聽聽 return (Integer) parameters[0]; 聽聽聽 聽聽聽 聽聽聽 聽聽聽 聽聽聽 聽聽聽 聽聽聽 } 聽聽聽 聽聽聽 聽聽聽 聽聽聽 聽聽聽 聽聽聽 }); 聽聽聽 聽聽聽 聽聽聽 聽聽聽 聽聽聽 } 聽聽聽 聽聽聽 聽聽聽 聽聽聽 }, zero); 聽聽聽 聽聽聽 聽聽聽 } 聽聽聽 聽聽聽 }; } ChurchNumber four = multiply(two, two); System.out.println(four.apply(increase, numberZero));
娌℃湁鍑忔硶鍜岄櫎娉曪紝Church褰撳勾鍙戞槑榪欏涓滆タ鐨勬椂鍊欏氨娌℃湁銆傚師鍥犳槸闈炲父鏄庢樉鐨?..鍥犳Church number鍙湁鍚庣戶鍑芥暟錛岃屾病鏈夊墠椹卞嚱鏁般備篃灝辨槸璇碈hurch number鍙兘寰鍓嶆暟...涓嶈兘鏈涘悗鏁?..鑷劧涓嶅彲鑳戒綔鍑哄噺娉曞拰闄ゆ硶浜嗐傚綋鐒舵墿灞曚竴涓嬩篃鏄潪甯稿鏄撶殑錛?br />(define聽negative - one聽(lambda聽(successor聽precursor聽zero)聽(precursor聽zero))) (define聽one聽(lambda聽(successor聽precursor聽zero)聽(successor聽zero))) (define聽(add聽x聽y)聽(lambda聽(successor聽precursor聽zero)聽(x聽successor聽precursor聽(聽y聽successor聽precursor聽zero)聽))) (define聽(inc聽x)聽( + 聽x聽 1 )) (define聽(dec聽x)聽( - 聽x聽 1 )) (define聽zero聽(add聽one聽negative - one)) (zero聽inc聽dec聽 0 ) > 0
whl鍚屽闂繖鏍瘋兘涓嶈兘瀹炵幇嫻偣錛岀瓟妗堟槸鍙互瀹炵幇鏈夐檺綺懼害鐨勬誕鐐規(guī)暟....鍥犱負鎸夌収榪欎釜鎬濊礬鍙戝睍涓嬪幓錛屾垜浠畾涔夋誕鐐圭殑successor鍜宲recursor鍑芥暟鍙兘鍦ㄦ湁闄愮殑浣嶆暟涔嬪唴...褰撶劧鏈変簡one,zero鍐嶇粨鍚坧air錛屾ā鎷?/1瀛樺偍瀹炵幇嫻偣涔熶笉鏄笉鍙兘鐨勪簨鎯?.. ]]>Selenium Better Pratice http://www.tkk7.com/raimundox/archive/2006/08/04/61860.htmlRaimundox Raimundox Fri, 04 Aug 2006 13:59:00 GMT http://www.tkk7.com/raimundox/archive/2006/08/04/61860.html http://www.tkk7.com/raimundox/comments/61860.html http://www.tkk7.com/raimundox/archive/2006/08/04/61860.html#Feedback 11 http://www.tkk7.com/raimundox/comments/commentRss/61860.html http://www.tkk7.com/raimundox/services/trackbacks/61860.html 1. Never use Selenium FIT mode
Selenium鍒嗕負涓ょ榪愯妯″紡錛孌riven Mode(鐜板湪鍙玈elenium Remote Control)鍜孎IT Mode(鐜板湪鍙玈elenium Core)銆?/p>
FIT Mode欏懼悕鎬濅箟錛屽氨鏄被浼糉IT Testing Framework閭g浣跨敤鏂瑰紡錛屼富瑕佺敤浜嶲A絳夐潪鎶鏈漢鍛樼紪鍐橶eb搴旂敤鐨勫姛鑳芥祴璇曘侳IT Mode鐨凷elenium嫻嬭瘯浣跨敤HTML鏉ョ粍緇囨祴璇曠敤渚嬨備緥濡傛垜瑕佹祴璇曚竴涓獁eb搴旂敤鐨勭櫥闄嗗姛鑳姐傛垜鍙兘鍐欏嚭榪欐牱鐨凥TML 琛ㄦ牸銆?/p>
聽1
<
table
>
聽2
<
tr
>
聽3
聽
<
td
>
open
</
td
>
聽4
聽聽聽聽聽聽聽聽
<
td
>
http://localhost:8080/login
</
td
>
聽5
聽聽聽聽聽聽聽聽
<
td
></
td
>
聽6
</
tr
>
聽7
<
tr
>
聽8
聽
<
td
>
type
</
td
>
聽9
聽聽聽聽聽聽聽聽
<
td
>
id=username
</
td
>
10
聽聽聽聽聽聽聽聽
<
td
>
someuser
</
td
>
11
</
tr
>
12
<
tr
>
13
聽
<
td
>
type
</
td
>
14
聽聽聽聽聽聽聽聽
<
td
>
id=password
</
td
>
15
聽聽聽聽聽聽聽聽
<
td
>
password
</
td
>
16
</
tr
>
17
<
tr
>
18
聽
<
td
>
click
</
td
>
19
聽聽聽聽聽聽聽聽
<
td
>
id=login_button
</
td
>
20
聽聽聽聽聽聽聽聽
<
td
></
td
>
21
</
tr
>
22
<
tr
>
23
聽
<
td
>
assertTextPresent
</
td
>
24
聽聽聽聽聽聽聽聽
<
td
>
Welcome聽to聽xxxx
</
td
>
25
聽聽聽聽聽聽聽聽
<
td
></
td
>
26
</
tr
>
27
</
table
>
涓嶅悓浜嶧IT錛孲elenium鍐呯疆浜嗕竴緋誨垪鐨勫懡浠わ紝濡備笂渚嬩腑鐨刼pen, type, click浠ュ強assertTextPresent錛屽洜姝A鍙互瀹屽叏鎶涘紑DEV鐙珛鍦扮紪鍐欐祴璇?FIT闇瑕丏EV鎻愪緵Behavior Fixture)銆傚洜姝IT Mode鏄浉褰撳鏄撲嬌鐢ㄧ殑錛屽摢鎬曚笉浼氫嬌鐢℉TML鐨凲A錛屼篃鍙互浣跨敤FrontPage鐢誨嚭涓夊垪琛ㄦ牸錛屼緷嬈″~鍏ユ暟鎹?/p>
鐒惰屽浜庡ぇ澶氭暟team鑰岃█鈥斺斿挨鍏舵槸鏁忔嵎team錛孎IT Mode騫蟲槗鐨勫琛ㄤ笅鏄護浜烘亹鎯х殑娉ユ布銆傚ぇ澶氭暟鍥㈤槦寰寰閫夋嫨浣跨敤Selenium浣滀負鍔熻兘嫻嬭瘯鍜岄泦鎴愭祴璇曞伐鍏瘋屼笉浠呬粎鏄疩A嫻嬭瘯宸ュ叿錛屽湪涓嶅悓鐨勮凱浠i棿閬囧埌鍔熻兘嫻佺▼鎴朥I鍙樺寲鏃訛紝蹇呴』瑕侀噸鏋凷elenium嫻嬭瘯錛屾垨鑰呰錛孎unctional Test Migration銆備護浜洪仐鎲劇殑鏄紝HTML based鐨凷elenium FIT Testing鐨勯噸鏋勭珶鐒朵護浜洪毦浠ョ疆淇$殑鍥伴毦銆傛垜浠彲浠ヤ嬌鐢╥nclude絳塖elenium FIT鎵╁睍錛屼嬌寰楀畠鍙互閲嶇敤璇︾粏鐨勫姛鑳斤紙Log in錛?Log out璇稿姝ょ被錛夈傚嵆渚垮姝わ紝鍦ㄤ竴涓湡瀹炵殑欏圭洰涓紝Selenium Test鐨勬暟閲忓線寰鍦?00-500涔嬮棿(鎴戠洰鍓嶆墍澶勭殑欏圭洰鍦ㄦ敼鐢―riven Mode鍓嶅凡杈?50+)錛屽浜庤繖涔堝ぇ鍩烘暟鐨凷elenium嫻嬭瘯錛屾墜宸ラ噸鏋勫嚑涔庢槸涓嶅彲鎯寵薄鐨勶紝鑰岀洰鍓嶅皻娌℃湁HTML浠g爜閲嶆瀯宸ュ叿銆傚嵆渚垮瓨鍦ㄦ硾娉涙剰涔変笂鐨凥TML閲嶆瀯宸ュ叿錛屽浜嶴elenium嫻嬭瘯閲嶆瀯鐨勬湁鏁堟у皻寰呭晢姒楓傝屼嬌鐢―riven Mode涓婅堪浠g爜鍙互鍐欎負:
1
public
聽
void
聽testShouldShowAWeclomeMessageAfterUserLoggedIn()聽
{
2
聽聽聽聽selenium.open(
"
http://localhost:8080/login
"
);
3
聽聽聽聽selenium.type(
"
id=username
"
,
"
someuser
"
);
4
聽聽聽聽selenium.type(
"
id=password
"
,聽
"
password
"
);
5
聽聽聽聽selenium.click(
"
id=login_button
"
);
6
聽聽聽聽assertTrue(selenium.isTextPresent(
"
Welcome聽to聽xxxx
"
));
7
}
寰堣嚜鐒訛紝涓涓緇冩湁绱犵殑紼嬪簭鍛樹細閲嶆瀯鍑哄涓嬩唬鐮?
聽1
public
聽
void
聽login(String聽username,聽String聽password)聽
{
聽2
聽聽聽聽selenium.open(
"
http://localhost:8080/login
"
);
聽3
聽聽聽聽selenium.type(
"
id=username
"
,username);
聽4
聽聽聽聽selenium.type(
"
id=password
"
,聽password);
聽5
聽聽聽聽selenium.click(
"
id=login_button
"
);聽
聽6
}
聽7
聽8
public
聽
void
聽testShouldShowAWeclomeMessageAfterUserLoggedIn()聽
{
聽9
聽聽聽聽login(
"
someuser
"
,聽
"
password
"
);
10
聽聽聽聽assertTrue(selenium.isTextPresent(
"
Welcome聽to聽xxxx
"
));
11
}
涔嬪悗鏃犺鏄痯ull up鍒板叕鍏卞熀綾昏繕鏄痚xtact鍒癠tils class閮芥槸寰堝鏄撶殑浜嬫儏銆傜敱浜嶫ava鍦ㄤ唬鐮侀噸鏋勪笂渚垮埄錛孞ava Selenium Remote Control鎴愪負浣跨敤Selenium鐨勬渶浣蟲柟寮忋傚湪榪欎竴鐐逛笂錛岀旱浣縍uby璇硶涓婃瘮Java綆鍗曠伒媧誨緱澶氾紝瀹冧粛涓嶆槸緙栧啓Selenium嫻嬭瘯鐨勬渶浣寵澆浣?褰撶劧涓涓粡榪囩簿蹇冭璁$殑ruby selenium dsl wrapper榪樻槸鍏鋒湁闈炲嚒鐨勪環(huán)鍊肩殑錛岃繖涓垜浠悗闈細娑夊強鍒?銆?/p>
2. Using the name user, system, page instead of selenium
瑙傚療涓婇潰鎻愬埌鐨勪唬鐮侊紝鍏朵腑浣跨敤selenium鏉ユ搷綰祑eb搴旂敤鐨勮涓猴紝榪欏湪Remote Control閲屾槸甯歌鐨勫仛娉曪紝浣嗘槸浠嶇劧涓嶅濂斤紝鎴戜滑鍙互鍋氫竴浜涘皬鐨勫彉鍖栦互寰楀埌鏇村ソ鐨勬祴璇?
聽1
protected
聽
void
聽setup()聽
{
聽2
聽聽聽聽selenium聽
=
聽 聽
//
聽intialize聽selenium聽instance
聽3
聽聽聽聽user聽
=
聽selenium;
聽4
聽聽聽聽currentPage聽
=
聽selenium;
聽5
}
聽6
聽7
public
聽
void
聽login(String聽username,聽String聽password)聽
{
聽8
聽聽聽聽user.open(
"
http://localhost:8080/login
"
);
聽9
聽聽聽聽user.type(
"
id=username
"
,username);
10
聽聽聽聽user.type(
"
id=password
"
,聽password);
11
聽聽聽聽user.click(
"
id=login_button
"
);聽
12
}
13
14
public
聽
void
聽testShouldShowAWeclomeMessageAfterUserLoggedIn()聽
{
15
聽聽聽聽login(
"
some聽guy
"
,聽
"
password
"
);
16
聽聽聽聽assertTrue(currentPage.isTextPresent(
"
Welcome聽to聽xxxx
"
));
17
}
鍩烘湰涓婅繖鍙笉榪囨槸"鍙︿竴縐嶅啓娉?鑰屽凡錛屼絾鏄畠鏇村ソ鐨勮〃杈句簡"鐢ㄦ埛鐨勮涓?錛屽login浠g爜鎵紺恒備互鍙?緋葷粺鐨勬紜浉搴?錛屽嵆currentPage.isTextPresent()銆傝繖縐嶆槸鍏稿瀷鐨勫緙栬瘧鍣ㄦ棤鎰忎箟瀵逛漢鏈夋剰涔夌殑浠g爜錛屼篃灝辨槸鏅亶鎰忎箟涓婂ソ鐨勪唬鐮併?/p>
3. Creating a DSL base on your test codes
鎳傚緱HTML鐨凲A鍙互鍦ㄦ病鏈塂EV鐨勫府鍔╀笅浣跨敤Selenium FIT mode錛岀劧鑰屽嵈涓嶈兘鍦ㄦ病鏈塂EV鐨勫府鍔╀笅浣跨敤Driven Mode銆備簬鏄渶鑷劧涔熸槸鏈fashion鐨勫仛娉曪紝灝辨槸鍦ㄥ凡鏈夌殑test codes涔嬩笂鎻愪緵Testing DSL鎴栬匰cripting Language錛岃FIT mode鍙樺緱鏇村姞FIT銆傝繖鏂歸潰鍐呭鏄竴涓洿澶х殑涓婚錛屼互鍚庡啀璇︾粏灞曞紑鍚с?/p>
4. Hacking Selenium Object to support FIT command
Selenium FIT mode鍜孯C mode涓嬬殑鍛戒護鏈変簺璁稿樊寮傦紝姣斿FIT涓殑assertTextPresent錛屽湪RC涓彉鎴愪簡isTextPresent銆傚悓鏍瘋繕鏈塅IT涓渶瀹炵敤鐨勫懡浠lickAndWait錛屽湪RC涓彉鎴愪簡click鍜寃aitForPageToLoad銆傚湪RC涓嬌鐢‵IT mode涓殑鍛戒護涔熼潪闅句簨錛屾壘鍒癱om.thoughtworks.selenium.Selenium錛屾坊鍔犳柟娉?
public
聽
void
聽doCommand(String聽commmand,聽String 聽parameters);
鐒跺悗鍦╟om.thoughtworks.selenium.DefaultSelenium涓坊鍔犲疄鐜?
1
public
聽
void
聽doCommand(String聽commmand,聽String 聽parameters)聽
{
2
聽聽聽String[]聽paras聽
=
聽
new
聽String[]
{
""
,
""
,
""
}
3
聽聽聽
for
聽(
int
聽i聽
=
聽
0
;聽i聽
<
聽parameters.length聽
&&
聽i聽
<
聽
3
;聽i
++
)
4
聽聽聽聽聽聽paras[i]聽
=
聽parameters[i];
5
聽聽聽commandProcessor.doCommand(command,聽paras);
6
}
鐒跺悗璇曢獙涓涓?
selenium.doCommand(
"
clickAndWait
"
);
鍦ㄦ垜浠嬌鐢ㄧ函RC mode涔嬪墠鏇劇粡鐢ㄨ繃涓孌典腑闂存柟妗堬紝灝唕c code杞寲涓篺it code鏉ヨ窇(鍥犱負rc涓嶆敮鎸乭ttps)錛岀敱浜庝笉鏄湡姝g殑rc mode錛屽儚isTextPresent涔嬬被鐨勬柟娉曢兘娌℃湁鍔炴硶浣跨敤錛屽彧鑳戒嬌鐢‵IT mode command銆傚洜姝ゅ鏋滃洜涓轟竴浜涚壒孌婄殑鍘熷洜(https, chrome璧蜂笉鏉ワ紝hta bug澶氱瓑絳?錛屼綘娌℃湁鍔炴硶浣跨敤RC mode錛屼絾鏄湁甯屾湜寰楀埌RC鍙噸鏋勭殑濂藉錛岄偅涔堣繖涓猼ricky鐨勬妧宸у掓槸涓嶉敊鐨勯夋嫨銆?/p>
5. Using chrome and IE hta lanucher to support https 6. Run test using different browser lanucher to test browser compatibility
榪欎袱涓兘鏄拰browser lanucher鐩稿叧鐨勶紝Selenium鍜孞WebUnit鏈澶х殑涓嶅悓鍦ㄤ簬瀹冧嬌鐢ㄧ湡瀹炵殑嫻忚鍣ㄦ潵璺戞祴璇曪紝浠庤屽彲浠ユ洿鍔犵湡瀹炲湴鑰冨療緋葷粺鍦ㄤ笉鍚屾祻瑙堝櫒涓殑琛ㄧ幇銆傚洜姝や嬌鐢ㄤ笉鍚岀殑嫻忚鍣╨anucher鏉ヨ繍琛屾祴璇曪紝鍙互鏇村ソ嫻嬭瘯搴旂敤鐨勬祻瑙堝櫒鍏煎鎬э紝榪欏浜巜eb 2.0搴旂敤鑰岃█鏄緢鏈夊府鍔╃殑銆傛澶栵紝浣跨敤rc鎻愪緵鐨勮瘯楠屾anucher錛宑hrome鍜宧ta鍙互瑙e喅璺╠omain嫻嬭瘯鍜宧ttps鐨勯棶棰樸備笉榪囩洰鍓峢ta榪樻槸鏈夊緢澶歜ug鐨勶紝鎺ㄨ崘浣跨敤chrome銆傚綋鐒訛紝鏈甯屾湜鐨勮繕鏄境媧茬殑鍚屼簨鍙互鏃╂棩鍦╯elenium閲屾彁渚沨ttps鏀寔銆?br />
]]>ANTLR Lexer Tips http://www.tkk7.com/raimundox/archive/2006/03/27/37605.htmlRaimundox Raimundox Mon, 27 Mar 2006 06:44:00 GMT http://www.tkk7.com/raimundox/archive/2006/03/27/37605.html http://www.tkk7.com/raimundox/comments/37605.html http://www.tkk7.com/raimundox/archive/2006/03/27/37605.html#Feedback 4 http://www.tkk7.com/raimundox/comments/commentRss/37605.html http://www.tkk7.com/raimundox/services/trackbacks/37605.html 闃呰鍏ㄦ枃 ]]> A Patch for Ruby Watir Test Framework http://www.tkk7.com/raimundox/archive/2006/01/11/27549.htmlRaimundox Raimundox Wed, 11 Jan 2006 03:30:00 GMT http://www.tkk7.com/raimundox/archive/2006/01/11/27549.html http://www.tkk7.com/raimundox/comments/27549.html http://www.tkk7.com/raimundox/archive/2006/01/11/27549.html#Feedback 2 http://www.tkk7.com/raimundox/comments/commentRss/27549.html http://www.tkk7.com/raimundox/services/trackbacks/27549.html Beauty is the first
test: there is no permanent place in this world for ugly mathematics. 鎰熷姩浜嗘垜濂戒箙銆傜幇鍦ㄦ崲涓娉曪細 Beauty is the first
test: there is no permanent place in this world for ugly hack code. 榪欎釜闂涔熶笉澶毦鍑虹悊錛宺uby浣滀負C鐨刦ront interface鍦ㄥ瓧絎︿覆澶勭悊涓婃湁寰堟繁鐨凜鐨勭棔榪癸紝鍡紝10騫村墠鎴戣繕鏄釜C紼嬪簭鍛樺槢錛屾寜鐓т粠鍓嶇殑鍋氭硶鍖哄垎ASCII鐮併?br>1 def characters_in(value) 2 index = 0 3 while index < value.length 4 len = value[index] > 128 ? 2 : 1 5 yield value[index, len] 6 index += len 7 end 8 end
鎶奣extField閲岀殑doKeyPress鏀逛竴涓嬶細1 characters_in(value) { | c | 2 sleep @ieController.typingspeed 3 @o.value = @o.value.to_s + c 4 fire_key_events}
鎼炲畾錛佷絾鏄繕鏄緢涓戯紝鐩存帴鎶婂埆浜虹殑code鏀逛簡錛宑ontributing to eclipse閲岃瑕乧ontribute涓嶈闅忎究change鍒漢鐨勪唬鐮併傚ソ鍚э紝濂藉湪ruby鎵╁睍璧鋒潵涔熶笉闅撅細 1 require ' Watir ' 2 3 module Watir 4 module Cn 5 class IE < Watir::IE 6 def text_field(how , what = nil) 7 return TextField. new (self, how, what) 8 end 9 end 10 11 class TextField < Watir::TextField 12 def doKeyPress( value ) 13 begin 14 maxLength = @o.maxLength 15 if value.length > maxLength 16 value = suppliedValue[ 0 .. maxLength ] 17 @ieController.log " Supplied string is #{suppliedValue.length} chars, which exceeds the max length (#{maxLength}) of the field. Using value: #{value} " 18 end 19 rescue 20 # probably a text area - so it doesnt have a max Length 21 maxLength = - 1 22 end 23 24 Cn.characters_in(value) { | c | 25 sleep @ieController.typingspeed 26 @o.value = @o.value.to_s + c 27 fire_key_events} 28 end 29 end 30 31 def Cn.characters_in(value) 32 index = 0 33 while index < value.length 34 len = value[index] > 128 ? 2 : 1 35 yield value[index, len] 36 index += len 37 end 38 end 39 end 40 end
嫻嬭瘯涓涓嬶細require ' watir-cn ' ie = Watir::Cn::IE.start( ' http://www.google.com ' ) ie.text_field(:name, ' q ' ).set( ' Ruby Watir 鍔熻兘嫻嬭瘯 '
鎴愬姛銆傛渶鍚庝竴姝ユ槸璐$尞紺懼尯錛岀洿鎺ョ櫥鍒皉ubyforge錛屾壘鍒癢atir鐒跺悗submit浜嗕袱涓猵atch錛氫竴涓洿鎺ヤ慨鏀箇atir搴撶殑涓涓槸鐙珛鐨剋atir-cn鐨勩傛帹鑽愬ぇ瀹朵嬌鐢ㄧ浜屼釜鐨刾atch銆傚湴鍧鍦細http://rubyforge.org/tracker/index.php?func=detail&aid=3232&group_id=104&atid=489 ]]>A Day of Two Pragmatic Programmers' Life http://www.tkk7.com/raimundox/archive/2006/01/10/27469.htmlRaimundox Raimundox Tue, 10 Jan 2006 13:30:00 GMT http://www.tkk7.com/raimundox/archive/2006/01/10/27469.html http://www.tkk7.com/raimundox/comments/27469.html http://www.tkk7.com/raimundox/archive/2006/01/10/27469.html#Feedback 9 http://www.tkk7.com/raimundox/comments/commentRss/27469.html http://www.tkk7.com/raimundox/services/trackbacks/27469.html 瑙e喅榪欎釜闂鏈鐩存帴鐨勫仛娉曪紝灝辨槸login鍒癝SO騫沖彴涓婏紝鐒跺悗涓涓敤鎴蜂竴涓敤鎴風殑search錛宻earch瀹屼簡鍐嶇敤OA Admin鐧婚檰鏌A甯愭埛銆傛垜浠槸pragmatic programmer鍢涳紝榪欎箞綣佺悙鐨勬椿鍔ㄨ嚜鐒跺啓紼嬪簭鎼炲畾瀹冦傝嚜鐒舵誕鐜頒袱涓夋嫨錛歊uby Watri錛岃繕鏈夊氨鏄駭鑷亢浠叕鍙哥殑Selenium Script銆?BR>涓婃潵鍏堢敤Ruby Watri錛岃繖涓笢瑗垮ソ鍟婏紝綆鍗曞晩銆俉PC鎵句簡涓涓互鍓嶅啓鐨別xample, 鎴戠収鐫鏀逛簡涓涓敤鎴風殑search錛岀劧鍚庢墿灞曪細
1 # login in as sso admin 2 ie = Watir::IE.start(sso_login_url) 3 ie.text_field(:name, " username " ).set(sso_admin_user) 4 ie.text_field(:name, " password " ).set(sso_admin_pass) 5 ie.button(:value, " 鐧誨綍 " ).click 6 7 # search user 8 ie = Watir::IE.start(sso_search_url) 9 ie.text_field(:name, " userName).set('寮犱笁') 10 ie.button(:value, " 鏌ユ壘 " ).click
璺戝埌command line run涓鎶婏紝ruby login.rb錛岀劧鍚庝竴涓彜鎬殑浜嬫儏鍑虹幇浜?BR>
ie.text_field(:name, " userName).set('寮犱笁')
userName杈撳叆妗唄ighlight浜嗕竴涓嬶紝鐒跺悗娌℃湁瀛?..闅鵑亾鏄紪鐮侀棶棰橈紵鎹簡encoding閲嶆柊save浜嗕竴鎶婏紝緇撴灉涓鏍楓傞儊闂?..浜庢槸鎴戝拰WPC鎯蟲硶鏄?..Ruby涓枃鏈夐棶棰橈紝涓嶇浜嗘椂闂寸揣榪紝鎹elenium Test錛岃嚜瀹剁殑涓滆タ鍢涖備絾鏄疭elenium鐨凷cript鏄疕TML-based鐨勶紝鍐欒搗鏉ュお楹葷儲銆傛垜浠槸pragmatic programmer鍢涳紝榪欎箞綣佺悙鐨勬椿鍔ㄨ嚜鐒跺啓紼嬪簭鎼炲畾瀹冦備簬鏄垜鏉ユ悶涓涓猄criptGenerator錛學PC鍚屽織鎼瀞cript template銆備竴鎼瀟emplate WPC鍚屽織灝辨瘮杈冨叴濂嬶紝澶у枈:velocity錛?velocity錛佸搸錛屾垜鏈哄櫒涓婃病鏈塿elocity鐨刲ibrary錛屼簬鏄垜鍐沖畾pragmatic涓鎶婏紝鐩存帴writer output銆傛壘浜嗕竴涓猄elenume Script Demo錛屽湪姣忚鍓嶉潰鍔犱笂aaaa,姣忚鏈熬鍔犱笂bbb錛岀劧鍚巆trl + f,aaa->writer.write(" bbb->"); 鏀瑰嚑涓?錛宨ntroduce parameter, extract method, compose method椋炲揩鍦伴噸鏋勪箣錛屼竴涓猦ard code鐨刧enerator寮曟搸璇炵敓浜嗐俉PC榪樺湪璋僼emplate錛屾垜鐪嬩簡涓涓嬩唬鐮侊紝铔畊gly鐨勶紝refactory涔嬶細
1 private static String scriptTemplate; 2 3 public static void readScriptTemplate(String templateName) { 4 BufferedReader reader = null ; 5 try { 6 reader = new BufferedReader( new FileReader(templateName)); 7 String line = null ; 8 StringBuffer template = new StringBuffer(); 9 while ((line = reader.readLine()) != null ) 10 template.append(line).append( " \n " ); 11 scriptTemplate = template.toString(); 12 } catch (IOException e) { 13 14 } finally { 15 if (reader != null ) 16 try { 17 reader.close(); 18 } catch (IOException e) { 19 } 20 } 21 } 22 23 public static void generatedScriptForUser(String path, String name) { 24 Writer writer = null ; 25 try { 26 writer = new BufferedWriter( new FileWriter(path + " / " + name 27 + " .html " )); 28 writer.write(scriptTemplate 29 .replaceAll( " \\$\\$userName\\$\\$ " , name)); 30 } catch (IOException e) { 31 e.printStackTrace(); 32 } finally { 33 if (writer != null ) 34 try { 35 writer.close(); 36 } catch (IOException e) { 37 } 38 } 39 40 }
涓涓嬪瓙灝戜簡鏃犳暟浠g爜錛岀埥澶氫簡銆傜劧鍚巜pc涔熸悶濂戒簡template錛屾寜妯$増鏂囦歡涓generating錛屽嚑鍗佷釜selenium test script灝卞嚭鐜頒簡銆傚棷錛寃rite program that write program錛屾湁澶焢ragmatic銆?BR> 鍐欎簡涓涓猅est Suite錛屾斁鍒版敼涓涓婼elenium Runner涓嬭窇涓涓嬪張鍌?cè)潨间簡銆係elenium鍋氱殑Functional Test錛屼竴鑸亣瀹氬拰琚祴鐨勫簲鐢ㄥ湪涓涓猆RL base閲岋紝鍥犳榪欐牱local鈥滄祴鈥漴emoting灝變笉澶ソ錛岃屼笖鎴戜滑鍙堟槸涓涓畨鍏ㄥ鉤鍙幫紝URL base鍋氬畨鍏ㄥ熀鍑嗙殑銆備竴涓嬪氨鎵鏈夋祴璇曞氨crackdown鍦ㄨ繖閲屼簡銆傞儊闂峰晩... Selenium鏂囨。錛屽彂鐜板彲浠ョ敤driver鏉dpater local鍜宺emoting鐨勭幆澧冿紝闂鏄繖涓猟rvier瑕佽嚜宸卞啓...閮侀椃... WPC鍦╢irefox涓婅浜嗕竴涓猄elenium Recorder鐨刾lug in鍙互璁板綍web page actions錛岀劧鍚巖eplay銆備粬鍙戠幇榪欎釜涓滆タ鑳界粫榪嘢elenium鐨勯檺鍒訛紝浜庢槸鍐沖畾鐪嬬湅浠栨庝箞瀹炵幇鐨勶紝鎵懼埌code涓鐪?..鍘熸潵鏄妸selenium runner hack浜?..鐢╦avascript鎶妘rl base鐢熺敓鐨勭粰鏀逛簡...WPC璇村ソ鍟婏紝鎴戜滑鍐欎竴涓狥irefox Selenium Recorder Plugin鐨刾lug in鍚э紝璁╀粬浠庝竴涓洰褰曢噷鑷姩load script...鐒跺悗WPC寮濮嬬帺firefox plugin. 鎴戝喅寰楁垜榪樻槸鐪嬬湅Ruby鐨勪腑鏂囨敮鎸佸惂錛屾壘鏉ユ壘鍘婚兘娌℃湁璇碦uby鐨勪腑鏂囨湁闂鐨勶紝鍚庢潵鍙戠幇涓涓佸ぇ嫻嬩簡涓涓婻uby鐨勪腑鏂囧瓧絎︿覆錛岃娌¢棶棰樸傛垜蹇樹簡榪欎釜鑰佸ぇ鐨刄RL浜嗘壘鍒板啀琛ヤ笂銆備唬鐮佷笂鐪嬭搗鏉ヤ技涔庝篃娌′粈涔堥棶棰樸備簬鏄垜鎬鐤戞槸Watri鐨勯棶棰橈紝鐪媁atri鐨勪唬鐮侊紝鍙戠幇Watri鐨勮璁℃濊礬灝辨槸涓轟簡妯℃嫙浜虹殑褰曞叆錛岀劧鍚庢壘鍒拌繖鏍風殑浠g爜錛?BR>
def doKeyPress(value) for i in 0 .. value.length - 1 sleep @ieController.typingspeed # typing speed c = value[i, 1 ] #@ieController.log " adding c.chr " + c #.chr.to_s @o.value = @o.value.to_s + c #c.chr fire_key_events end end 鏍規(guī)嵁璁懼畾鐨勫歡鏃舵ā鎷熶漢鏁插嚮閿洏銆傛瘡涓涓棿闅旂敤String slice鏉ヨ緭鍏ャ備簬鏄垜璇曢獙浜嗕竴涓媟uby鐨勪腑鏂囧瓧絎︿覆鍒囩墖錛?BR>
1 value = " 鍝堝搱 " 2 for i in 0 ..value.length - 1 3 puts value[i, 1 ] 4 end
Ruby鏋滅劧鐬庤彍浜?..value.length鏄?錛屾瘡涓涓垏鐗囬兘鏄┖...鍟妦~~~澶╁晩錛?bit char...C鐨勬椂浠e晩銆傛壘鍒頒簡闂灝卞ソ鍔炰簡錛屾垜鏉冭 浜唂ix watri unicode鍜岀洿鎺ack瀹冿紝鏈鍚庢垜閫夋嫨鐩存帴hack瀹冿紝鏂規(guī)硶綆鍗曪細
1 if @ieController.typingspeed != - 1 2 for i in 0 .. value.length - 1 3 sleep @ieController.typingspeed # typing speed 4 c = value[i, 1 ] 5 #@ieController.log " adding c.chr " + c #.chr.to_s 6 @o.value = @o.value.to_s + c #c.chr 7 fire_key_events 8 end 9 else 10 @o.value = value 11 fire_key_events 12 end
鐒跺悗嫻嬭瘯涓涓嬶細
1 require ' Watir ' 2 3 ie = Watir::IE.start( " http://www.google.com " ) 4 ie.typingspeed = - 1 5 ie.text_field(:name, " q " ).set( " 鍝堝搱 " )
鎼炲畾銆備簬鏄噯澶囨敼Ruby鑴氭湰錛岃繖涓椂鍊欏鎴蜂笅鐝簡錛屾垜浠喅瀹氭槑澶╃戶緇紝涓鍏辯敤鏃?灝忔椂... 鏈鍚庤涓涓嬮渶姹傦紝涓鍏辨湁澶氬皯鏁版嵁鍛紵70鏉?..濡傛灉pair褰曞叆鐨勮瘽錛屽ぇ綰?0-50鍒嗛挓鍚?BR> 緇撹: 1.Pragmatic Programmer閮芥槸寰堟噿鐨勶紝閲嶅5嬈$殑宸ヤ綔閮藉洖鐢ㄤ唬鐮佹潵鍐欍?BR>2.Pragmatic Programmer閮芥槸寰堟湁濂藉蹇冪殑錛屽お澶氱殑閲嶅鎬у姵鍔ㄥ彧鑳藉垎鏁d粬浠殑娉ㄦ剰鍔涳紝涓嶇煡閬撲細鎼炲嚭浠涔堜簡錛屾垜浼拌鎴戣娌℃湁hack Watri錛學PC宸茬粡寮濮嬪啓Firefox plugin浜嗐?BR>3.Pragmatic Programmer閮芥槸鈥滃彜紼嬪簭鍛樷濓紝鍐欑▼搴忔搷綰佃綆楁満鏄緢鏈変箰瓚g殑銆?BR>4.姣斾竴涓狿ragmatic Programmer鏇磋兘鎶樿吘鐨勬槸涓や釜Pragmatic Programmer... ]]> 涓ч挓涓鴻皝楦?(4) http://www.tkk7.com/raimundox/archive/2005/12/21/24957.htmlRaimundox Raimundox Wed, 21 Dec 2005 07:51:00 GMT http://www.tkk7.com/raimundox/archive/2005/12/21/24957.html http://www.tkk7.com/raimundox/comments/24957.html http://www.tkk7.com/raimundox/archive/2005/12/21/24957.html#Feedback 2 http://www.tkk7.com/raimundox/comments/commentRss/24957.html http://www.tkk7.com/raimundox/services/trackbacks/24957.html 絎?. 涓鍒囩殕瀵硅薄鍜岄潰鍚戝璞$殑鐞嗚鍩虹
鑰佸簞鏄弽瀵逛竴鍒囩殕瀵硅薄鐨勶紝鑰孴rustNo1鍦╦avaeye鐨勪竴綃囧笘瀛愪笂璇?
絎竴錛屾垜鍙互寰堣礋璐g殑璇?OO鐨勶紝70騫翠唬鎴愬瀷錛?0騫翠唬鍦ㄧ悊璁哄熀紜涓婂氨緇欎漢姣欐帀銆備粠榪欑鎰忎箟涓婅涓嶆槸OO姝諱笉姝葷殑闂錛岃屾槸OO榪樻椿鐫涔堬紵褰撶劧鐞嗚鍩虹緇欎漢姣欐帀錛屼笉鏄娌℃湁鐢ㄣ?/SPAN>
鎴戝厛璇撮潰鍚戝璞$殑鐞嗚鍩虹鐨勯棶棰橈紝鑷充簬涓鍒囩殕瀵硅薄紼嶅悗鍐嶈〃銆?BR> 鎵璋撻潰鍚戝璞$殑鐞嗚鍩虹鍏跺疄鏄病鏈夌殑錛屽師鍥犲緢綆鍗曪紝闈㈠悜瀵硅薄鏍規(guī)湰灝變笉鏄竴縐嶈綆楁ā鍨嬨傚湪絎竴嬈¤蔣浠跺嵄鏈虹殑閭d釜鏃朵唬錛屽涓庤綆楁満鐨勯潪鏁板艱綆楀簲鐢ㄧ殑璁ㄨ浠ュ強瀵逛簬鍙綆楁ч棶棰樼殑鐮旂┒鍜屽彂灞曪紝澶ф姷紜珛浜嗗嚑縐嶄富嫻佺殑璁$畻妯″瀷錛氶掑綊鍑芥暟綾伙紝鍥劇伒鏈猴紝Lambda婕旂畻錛孒orn瀛愬彞錛孭ost緋葷粺絳夌瓑銆?BR> 鍏朵腑閫掑綊鍑芥暟綾繪槸鍙綆楁ч棶棰樼殑鏁板瑙i噴;鍥劇伒鏈烘槸鍥劇伒瑙e喅鍙綆楅棶棰樼殑鏃跺欐墍璁捐鐨勮緗紝鍏跺悗鎴愪負璁$畻鏈虹殑瑁呯疆妯″瀷錛屼笌鍥劇伒鏈虹浉鍏崇殑褰㈠紡璇█鍜岃嚜鍔ㄦ満鎴愪負浜嗗懡浠ゅ紡璇█鐨勭悊璁哄熀紜;lambda婕旂畻鎴愪負浜嗗嚱鏁板紡璇█鐨勭悊璁哄熀紜;Horn瀛愬彞鏄痯rolog榪欑被閫昏緫璇█鐨勭悊璁哄熀紜銆備絾鏄垜浠儕璁剁殑鍙戠幇錛岄潰鍚戝璞℃病鏈夎綆楁ā鍨嬬殑鐞嗚鍩虹錛屾崲鑰岃█涔嬶紝闈㈠悜瀵硅薄鏍規(guī)湰灝變笉鏄粠鍙綆楁х殑鐮旂┒涓婂彂灞曡繃鏉ョ殑錛岄偅涔堥潰鍚戝璞$殑鐞嗚鍩虹鐨勪環(huán)鍊兼湰韜氨涓嶅ぇ銆?/P>
鎵浠ユ垜寰堝鎬殑涓涓棶棰樺氨鏄疶rustNo1鎵璋撶殑闈㈠悜瀵硅薄鍦?0騫翠唬鐞嗚鍩虹涓婄粰浜烘瘷鎺夌殑璇存硶鏄粠浣曡屾潵鐨勶紵鏃㈢劧闈㈠悜瀵硅薄鏈川涓婁笉鏄竴縐嶈綆楁ā鍨嬶紝閭d箞瀹冨ぇ鎶典笂鍙兘褰掔粨涓轟竴縐嶅簲鐢ㄦ妧鏈紝搴旂敤鎶鏈嚜鐒跺彲浠ヤ粠鍚勭涓嶅悓鐨勯鍩熼噷寰楀埌鐩鎬技鐨勫簲鐢紝閭d箞姣欐帀鐨勭悊璁哄熀紜鎵鎸囩殑鍙堟槸浠涔堝憿錛熺敋鎬箣銆?/P>
鏃㈢劧闈㈠悜瀵硅薄涓嶆槸涓涓綆楁ā鍨嬶紝閭d箞鎴戜滑鍙互浠庝笉鍚岀殑瑙掑害鎺ㄦ柇鍑篛O鐨勫悇縐嶅艦鎬侊紝鑰佸簞宸茬粡鍑虹粰浜嗕粠ADT寮曞嚭OO鐨勯棶棰樹互鍙婁緥瀛愶紝鎴戝氨涓嶇綏鍡︿簡錛屾垜緇欎竴涓粠Functional Programming鍑烘潵鐨勪緥瀛愶紝鍏跺疄灝辨槸SICP閲岀殑Data as Procedure銆?/P>
(define (make - user name age sex) (define (dispatch message) (cond ((eq ? message ' getName) name) ((eq ? message ' getAge) age) ((eq ? message ' getSex) sex)) ( else (error ' messageNotUnderstand)))) dispatch)
鐒跺悗鎴戜滑灝卞彲浠?/P>
(define vincent (make - user ' Vincent 24 ' Male)) (vincent ' getName)
鑷劧鐨勶紝濡傛灉鎴戣皟鐢?/P>
(vincent ' sayHi)
浼氬緱鍒頒竴涓猰essageNotUnderstand鐨剅untime閿欒錛岃繖灝辨槸涓涓緢鑷劧dyanmic type鐨勫璞″皝瑁咃紝鏈鏃╃殑闈㈠悜瀵硅薄緋葷粺Smalltalk鍜孋LOS鍩烘湰涓婇兘鏄繖涓礬瀛愶紝浜庢槸鏈変竴涓棶棰橈紝涓轟粈涔堟渶鏃╃殑闈㈠悜瀵硅薄緋葷粺閮芥槸dyanmic type錛熻繖閲屽氨璺焞ambda婕旂畻鏈夊叧浜嗐?/P>
lambda婕旂畻榪欎釜璁$畻妯″瀷鏍規(guī)湰鐨勪竴涓亣璁懼氨鏄紝瀵逛簬浠諱綍涓涓畾涔夎壇濂界殑鏁板鍑芥暟錛屾垜閮藉彲浠ヤ嬌鐢╨ambda鎶借薄鏉ヨ〃榪頒粬鐨勬眰鍊鹼紝鍥犳鏃犺鏄粈涔堜笢瑗夸綘鑳藉鏋勯爈ambda鎶借薄鐨勮瘽錛屾垜灝辮兘璁$畻銆傝繖涓湴鏂逛笢瑗垮緢澶氾紝澶у鍙互鎵炬壘lambda婕旂畻鐩稿叧鐨勮祫鏂欙紝榪欓噷鎴戣涓変歡浜?鐢變簬lambda澶毦杈撳叆錛屾垜鐢╯cheme紼嬪簭浠f浛錛岀劧鍚庣敱浜巃lpha鍙樺寲錛宐eta瑙勭害鍜宔ta瑙勭害鎴戜篃鐢╯cheme浼爜鏉ユā鎷熴?
絎竴涓槸鏁板肩殑琛ㄨ堪錛屽叾瀹炶繖涓緢綆鍗曪紝涓嶈冭檻涓樺浠f暟鐨勭郴緇熺殑璇濓紝鎴戜滑鍙互鎶婃暟鍊艱〃紺烘垚鍗曞煎嚱鏁?
(define one (lambda (x) 1 ))
榪欎釜涓滆タ鏃犺緇欎粈涔坸閮借繑鍥?錛岀劧鍚庢牴鎹甽ambda婕旂畻閲岀殑alpha鍙樻崲錛岃繖涓猯ambda鎶借薄絳変環(huán)浜庢暟鍊?銆傚洜姝わ紝瀵逛簬鎵鏈夌殑鏁板鹼紝鎴戜滑鍙互鎸塴ambda婕旂畻澶勭悊銆?/P>
絎簩涓槸bool鐨勮〃杈撅紝涔熷氨鏄浣曢昏緫榪涜lambda鎶借薄錛屼笅闈㈡垜鐩存帴緇欏嚭浜嗭紝緙虹渷璁や負澶у閮界湅浜哠ICP錛屽Scheme涔熼鏈夊績寰椼?/P>
(define true - new (lambda (x y) x)) ;;;榪欎釜鍑芥暟涔熷彨select - first (define false - new (lambda (x y) x));;;榪欎釜鍑芥暟涔熷彨select - second (define if - new (lambda (conditon if - true if - false ) (condition if - true if - false )))
鐒跺悗鎴戝氨鍙互鍋氫竴涓祴璇?/P>
( if - new true - new 3 4 ) 3 (if - new false - new 3 4 ) 4
鍥犳錛屽浜庢墍鏈塨ool鎴戜滑鍙互鎸塴ambda婕旂畻鏉ュ鐞?/P>
絎笁涓槸鑷畾涔夌被鍨嬶紝榪欓噷鎴戜滑榪樻槸鍏堢湅涓涓狶isp閲岀殑渚嬪瓙錛屽簭瀵廣?/P>
(define (cons a b) (lambda (dispath) (dispatch a b))) (define (car list) (list select - first)) (define (cdr list) (list select - second))
榪欓噷渚濇棫鏄痟igh-order錛屾垜浠潵嫻嬭瘯
(define list1 (cons 1 2 )) (car list1) 1 (cdr list1)2
榪欓噷澶у鑷繁鐢╞eta瑙勭害綆椾竴涓嬶紝灝卞彂鐜扮殑紜槸榪欐牱鐨勩傝繖閲屾垜浠張鍙互鐪嬪埌錛屽湪lambda婕旂畻閲岋紝鏍規(guī)湰娌℃湁鏁版嵁鎴栬呯被鍨嬨傛湁鐨勬案榪滃悇縐嶅悇鏍風殑lambda鎶借薄鑰屽凡(鐩墠宸茬粡鏈変簡甯︾被鍨嬬殑lambda婕旂畻)銆傝繖閲岃涓鍙ラ澶栬瘽錛孲ICP閲岀殑Data as Procedure鍏跺疄灝辨槸鍦ㄨ榪欎釜闂錛屼笉榪囦粬娌℃槑璇達紝鑰屾槸鐢ㄤ簡涓縐嶇壒孌婄殑鐢ㄦ硶鑰屽紩鍑轟簡娑堟伅浼犻掗鏍鹼紝鎴戣寰楄繖閲孲ICP鏈変簺欏炬澶卞郊錛屽浜巇ata as procedure鎴戞葷粨鐨勪竴鑸艦寮忔槸
(define (construct - function value1 value2 value3 value4 valuen) (lambda (dispatch) (dispatch value1 value2 value3 value4 valuen))) (define (select - function1 data) (data select - first)) (define (select - function2 data) (data select - second)) . (define (select - functionn data) (data select - last))
緇間笂鎵榪幫紝鎴戜滑鐪嬪埌鍦╨ambda婕旂畻閲岋紝涓鍒囬兘鏄痩ambda鎶借薄錛岀劧鍚庡浜庝笉鍚岀殑lambda鎶借薄浣跨敤alpha鍙樻崲錛宐eta瑙勭害鍜宔ta瑙勭害錛岃〃榪板悇縐嶄笉鍚岃綆椼傜湅錛屽湪闈㈠悜瀵硅薄涔嬪墠灝卞凡緇忔湁浜嗕竴鍒囩殕鏌愭煇鐨勫畬緹庣殑璁$畻鐞嗚瀛樺湪浜嗐傝屼笖鍥為【涓涓嬶細
(define (make - user name age sex) (define (dispatch message) (cond ((eq ? message ' getName) name) ((eq ? message ' getAge) age) ((eq ? message ' getSex) sex)) ( else (error ' messageNotUnderstand)))) dispatch) (define vincent (make - user ' Vincent 24 ' Male)) (vincent ' getName)
鎴戜滑鏈夌悊鐢辮錛屽璞″叾瀹炲氨鏄竴涓猯ambda鎶借薄錛屾墍浠ヤ竴鍒囩殕瀵硅薄涓嶈繃鏄竴鍒囩殕lambda鎶借薄鐨勬紨鍖栵紝榪欎篃鏄負浠涔圫ICP閲屾妸闈㈠悜瀵硅薄縐頒綔涓縐嶁滄柟渚跨殑鐣岄潰鈥濊屼笉鏄竴縐嶆娊璞$殑鏂規(guī)硶鐨勫師鍥犱簡銆傞偅涔堝璞″拰lambda鎶借薄鍙堜粈涔堝尯鍒憿錛?BR> 鍢垮樋錛岀啛鎮(zhèn)塅P鐨勪漢閮藉簲璇ョ煡閬撲簡錛屽氨鏄疭ide-Effect錛屽壇浣滅敤銆傚璞″厑璁稿鍏跺唴閮ㄧ姸鎬佽繘琛屼慨鏀癸紝閭d箞榪欎釜涓滆タ灝辯牬鍖栦簡eta瑙勭害鐨勫墠鎻愭潯浠訛紝涔熷氨鏄鍏佽淇敼鍐呴儴鐘舵佺殑涓滆タ錛屽凡緇忎笉鏄竴涓彲浠ヨ繘琛宭ambda璁$畻鐨刲ambda鎶借薄浜嗐傚洜姝ゆ殏涓旂粰涓涓埆鐨勫悕瀛楀惂錛屽氨鍙璞″惂.....鍥犳鎴戣涓猴紝瀵硅薄寰堝ぇ紼嬪害涓婃槸涓縐嶅甫鏈夊壇浣滅敤鐨刲ambda鎶借薄銆?/P>
鎴戝湪鏈変竴綃嘼log涓婂啓浜哠ay sorry to object-oriented錛岄噷闈㈢粰浜嗕竴鍙敤瀵硅薄浣滃垎鏀殑渚嬪瓙錛岃繖閲屽氨涓嶉噸澶嶄簡錛屾湁鍏磋叮澶у鍙互鍘葷湅涓涓嬶紙鍒氭墠濂藉儚鍦↗avaEye涓婄湅鍒頒竴涓娉曪紝璇碋verything is Object鏄疭malltalk鐨勫箍鍛婅錛屽攭錛孲malltalk閲岀殑鐨勭殑紜‘everything is object鍟娿傦級 榪欓噷鎴戜滑鏉ユ葷粨涓涓嬶紝闈㈠悜瀵硅薄浣滀負涓縐嶁滄柟渚跨殑鐣岄潰鈥濅富瑕佽В鍐充簡涓涓眬閮ㄥ寲鍜屾ā鍧楀寲鐨勯棶棰橈紝榪欐槸浠巐ambda婕旂畻鍜屽嚱鏁扮紪紼嬬殑瑙掑害鏉ョ湅闈㈠悜瀵硅薄鎶鏈傦紙taowen鍦ㄤ粬鐨勪竴綃嘼log涓婅錛岄潰鍚戝璞″眬閮ㄥ寲浜哠ide-Effect錛屾垜娣變互涓虹劧錛夛紝榪欎釜涓滆タ鎴戜釜浜鴻涓烘洿鍔犳帴榪戦潰鍚戝璞℃湰鏉ョ殑鎰忔濓紝鑰屼笉鏄敱ADT閲屽彂灞曞嚭鏉ョ殑甯︾被鍨嬬殑瀵硅薄緋葷粺鐨勯偅涓剰鎬濄傚洜姝よ佸簞涓嶄互涓虹劧鐨勯潰鍚戝璞$被鍨嬬郴緇燂紝鎴戜篃涓嶄互涓虹劧銆備絾鏄潰鍚戝璞′綔涓簂ambda鎶借薄鐨勭晫闈紝鎴戣寰楄繕鏄緢涓嶉敊鐨勩傝繖涓鐐瑰湪Smalltalk鍜孯uby閲岄兘鏈変笉閿欑殑浣撶幇銆?/P>
]]> 涓ч挓涓鴻皝楦o紵(3) http://www.tkk7.com/raimundox/archive/2005/12/21/24891.htmlRaimundox Raimundox Tue, 20 Dec 2005 16:44:00 GMT http://www.tkk7.com/raimundox/archive/2005/12/21/24891.html http://www.tkk7.com/raimundox/comments/24891.html http://www.tkk7.com/raimundox/archive/2005/12/21/24891.html#Feedback 1 http://www.tkk7.com/raimundox/comments/commentRss/24891.html http://www.tkk7.com/raimundox/services/trackbacks/24891.html 絎? 緇ф壙
鍓嶉潰宸茬粡璇磋繃浜嗭紝緇ф壙鑷沖皯鏈?涓涔? 瀹炵幇緇ф壙鍜岀被鍨嬬戶鎵匡紝鍦ㄨ鏄庤繖涓や釜涓滆タ涔嬪墠錛屾垜浠戶緇潵鐪嬩笂闈㈢殑渚嬪瓙
Person >> playSoloOnInstrument:instrument instrument playNote: Note C; playNote: Note D; playNote: Note E. Person >> playBackgroundOnInstrument:instrument instrument playChord: Chord C1; playChord: Chord C1; playChord: Chord C1; Person >> playBWV996OnInstrument:instrument instrument playNote: Note C; playChord: Chord C; playNote: Note D.
鐜板湪鎴戜滑鐪媝layBWV996榪欎釜娑堟伅錛孊WV996鏄疊ach鎵鍐欎竴涓瞾鐗圭惔緇勬洸錛岄瞾鐗圭惔鏄脊鎷ㄤ箰鍣紝鍚屾椂涔熸槸鍜屽0涔愬櫒(鎵璋撳拰澹頒箰鍣ㄥ氨鏄彲浠ユ紨濂忓拰澹?銆傚湪寰堝涔愬櫒涓婇兘鏈夋敼緙栫殑鐗堟湰錛屾瘮濡傞瞾鐗圭惔鐨勮繎浜插悏浠栫瓑絳夛紝榪欎釜鏃跺欙紝鎴戜滑鍙互瀹炵幇榪欐牱鍑犱釜綾?/P>
Lute >> playNote:note Lute >> playChord:note Guitar >> playNote:note Guitar >> playChord:note Bass >> playNote:note
鐒跺悗鎴戜滑鍙互灝濊瘯浠ユ璋冪敤
vincent.playBWV996OnInstrument: Guitar new . vincent.playBWV996OnInstrument: Lute new . vincent.playBWV996OnInstrument: Bass new .
鏈鍚庝竴涓細寰楀埌涓涓猰essageNotUnderstand鐨勯敊璇備篃灝辨槸璇達紝瀵逛簬Bass鑰岃█鐢變簬涓嶈兘婕斿鍜屽0浠庤屼笉鑳芥紨濂廈MV996(涓嶈繃榪欎釜涓栫晫涓婅兘浜哄お澶氫簡...鍝?錛屾垜浠崲鍒伴潤鎬佺被鍨嬮潰鍚戝璞$郴緇熸潵鐪嬨?BR>瀵逛簬絎竴涓柟娉曪紝playSolo鐨勬椂鍊欐垜浠姹傜殑綾誨瀷鏄兘澶熸紨濂忓崟闊崇殑銆傛垜浠彲浠ュ啓鍑烘潵
1 interface SoloInstrument { 2 SoloInstrument playNote(Note note); 3 }
瀵逛簬絎簩涓柟娉曪紝playChord鐨勬椂鍊欐垜浠姹傜殑綾誨瀷鏄兘澶熸紨濂忓拰寮︾殑錛屾垜浠彲浠ュ啓鍑烘潵
1 interface ChordInstrument { 2 ChordInstrument playChord(Chord note); 3 }
鑰屽浜庣涓変釜鏂規(guī)硶錛宲layBWV996鐨勬椂鍊欐垜浠姹傛棦鑳芥紨濂忓拰寮︿篃鑳芥紨濂忓崟闊籌紝榪欎釜鏃跺欏嚭鐜頒竴涓棶棰橈紝鎴戜滑鎬庝箞澶勭悊Instrument鐨勭戶鎵垮叧緋?涓涓兘婕斿鍜屽雞鐨勪箰鍣ㄦ槸鍚﹀彲浠ユ紨濂忓崟闊?絳旀鏄竴鑸岃█鏄殑錛屼絾鏄篃涓嶆帓闄ゆ湁涓浜涗笉鏄繖鏍風殑)?榪樻槸鎴戜滑綆鍗曠殑鍐?
1 interface SoloAndChordInstrument extends SoloInstrument, ChordInstrument { 2 }
鎴栬?/P>
1 interface BWV996Playable { 2 3 BWV996Playable playNote(Note note); 4 BWV996Playable playChord(Chord note); 5 }
瀵逛簬鍔ㄦ佺被鍨嬬畝鍗曠殑闅愭х被鍨嬬害瀹氾紝鏄劇ず鐨勭被鍨嬬郴緇熷甫鏉ョ殑涓涓壇浣滅敤灝辨槸鎴戜滑蹇呴』澶勭悊綾誨瀷涔嬮棿鐨勫叧緋匯?STRONG>娉ㄦ剰榪欓噷鏄被鍨嬩箣闂寸殑鍏崇郴錛岃屼笉鏄璞′箣闂寸殑鍏崇郴銆傝佸簞鍚屽織鎵逛簡寰堝綃囩殑闈㈠悜瀵硅薄鐨勬娊璞★紝闈㈠悜瀵硅薄鐨勭被鍨嬬郴緇熶互鍙婇潰鍚戝璞$殑鏈綋璁猴紝鍏跺疄閮藉湪鏄湪綾誨瀷鍏崇郴涓婃姌鑵撅紝鑰屼笉鏄湪瀵硅薄鍏崇郴涓婃姌鑵?/STRONG>銆傝屼簨瀹炰笂闈㈠悜瀵硅薄鐨?STRONG>綾誨瀷緋葷粺騫墮潪蹇呯劧灝辨槸闈欐佺被鍨嬬郴緇燂紝鑰屾垜浠殑綾諱箣闂寸殑鍏崇郴涓嶄竴瀹氬氨鍜岀被鍨嬬殑鍏崇郴鐩鎬竴鑷淬?/STRONG>灝卞儚涓婁緥鎵紺猴紝鍦⊿malltalk閲岋紝Lute錛孏uitar鍜孊ass涔嬮棿娌℃湁浠諱綍鐨勭戶鎵垮叧緋伙紝浣嗘槸瀵逛簬person鐨?涓秷鎭岃█錛屽畠浠嵈鏄湁綾誨瀷鐨勩?BR> 鍥犳鑰佸簞鎵鎵圭殑錛屾槸瀵硅薄綾誨瀷緋葷粺鐨勬娊璞¤兘鍔涳紝鑰岄潪闈㈠悜瀵硅薄鐨勬娊璞¤兘鍔涖傛濡備粬鍦ㄧ被鍨嬬郴緇熼噷鎵緇欑殑渚嬪瓙錛岄偅寮犱粬璁や負寰堝け璐ョ殑闈㈠悜瀵硅薄鐨勫浘錛屽叾瀹炲彲浠ュ畬鍏ㄤ笉渚濊禆緇ф壙鏉ュ疄鐜幫紝鑰屽榪欎釜綾誨瀷緋葷粺鐨勬秷璐硅呰岃█錛屼粬浠兘澶熶互涓瀹氱殑綾誨瀷鐨勮鐐癸紝鏉ュ鐞嗚繖涓郴緇熺殑瀵硅薄銆?/P>
鑰岃佸簞鏈鍚庝竴涓粨璁?
鎴戠殑緇撹鏄細鈥滀竴涓被鍨嬶紝鏄敱鍏舵湰璐ㄥ喅瀹氫簡鎵鑳借〃鐜板嚭鐨勫彲鎿嶄綔鎬э紝鑰屼笉鏄湁鍏舵墍鑳芥帴鍙楃殑鎿嶄綔鍐沖畾浜嗗叾鏈川銆傜劧鑰岋紝OO姝eソ鎶婅繖涓棶棰樻悶鍙嶄簡錛佲?/SPAN>
鎴戠殑鐪嬫硶鏄紝榪欏彞璇濇牴鏈氨鏄杈╋紝鍓嶉潰鍗婂彞鐨勪富璇槸鈥滀竴涓被鍨嬧濓紝鍚庨潰鍗婂彞鐨勪富璇槸"OO"... 铏界劧鍓嶅崐鍙ユ槸瀵圭殑錛屼絾鏄崲涓鏍瘋娉曞彲鑳芥洿濂?"鎵鑳芥帴鍙楃殑鎿嶄綔鍙嶆槧浜嗗叾鏈川 "錛岄潰鍚戝璞℃湰韜氨娌℃湁璇存垜瑕佸仛涓涓湰璐ㄦ娊璞★紝榪欎竴鐐瑰湪Smalltalk鐨勭被鍨嬪垽鏂搷浣滀笂鐨勫彲鑳芥槸涓涓綈璇侊紝Smalltalk鐢╥sKindOf鏉ュ垽鏂戶鎵垮叧緋伙紝鎴戜滑鏉ョ帺涓涓枃瀛楁父鎴忥紝鏀規(guī)垚淇氳灝辨槸kinda錛屼篃灝辨槸"鏈変竴鐐癸紝鏈夊嚑鍒?鐨勬剰鎬濓紝鑰屼笉鏄錛屸滃氨鏄濓紝鎴栬呪滀粠鍒嗙被瀛︿笂鍙瘉鏄庝箣綾葷殑鍚箟鈥濄傛垜鍐嶄婦涓涓緦榫婄殑渚嬪瓙銆?/P>
vincent ballon: AirBallon new . vincent ballon: Condom new .
姘旂悆鍜屼繚闄╁錛屽浜巄allon榪欎釜鏂規(guī)硶鑰岃█鏄竴涓被鍨嬶紝閮芥槸"鏈夊嚑鍒?鍙互鍚硅搗鏉ャ備絾鏄垜鎬庝箞瀹氫箟涓涓簿紜殑鏈川錛烞allonable錛熻繕鏄疢akeFromLatexAndVeryThin?鎴栬呯畝鍗曡FlexableAndThin錛?/P>
鍦ㄧ戶鎵胯繖涓鐐逛笂錛屾垜鎯寵佸簞寮曟枃涓?Elminster鐨勮瘽鏄粠浜嬬墿鐨勭壒寰佷笌灞炴у綊綰沖嚭瀹冪殑鈥滅被鍨嬧濄傛伆鎭板浜庨潤鎬佺被鍨嬮潰鍚戝璞$郴緇熸槸鍙鐨勩傚鎴戝墠鏂囨墍榪幫紝鎴戞妸涓涓猳bject鍜屾墍鏈塻ender鐨勭害瀹氾紙涔熷氨鏄痠nterface錛夛紝緇ф壙鍦ㄤ竴璧鳳紝鎭版伆灝辨槸涓涓涓烘伆褰撶殑綾誨瀷瀹氫箟銆?BR> 鑰屽浜庡姩鎬佺被鍨嬬郴緇熼噷鐨勯潰鍚戝璞¤璦錛岀戶鎵跨殑涔熸湁綾誨瀷緇ф壙鐨勫惈涔夛紝浣嗘槸騫朵笉鏄敮涓鐨勯斿緞銆傜敤涓鍙ユ垜浠父璇寸殑璇濓紝鍦ㄩ潤鎬佺被鍨嬬郴緇熼噷錛岀被鍨嬪拰綾繪槸绱ц﹀悎鐨勶紝鍔ㄦ佺被鍨嬬郴緇熶腑浠栦滑鐨勮﹀悎姣旇緝鏉俱?BR> 浠庢鑰岃錛屾墍鏈夊浜庨潰鍚戝璞$殑鍝插鑰冭檻浠ュ強鏈綋鐨勬濊冿紝瀵逛簬鍔ㄦ侀潰鍚戝璞$郴緇熷凡緇忎笉鏄偅涔堣揩鍒囦簡銆傝屾妸瀵硅薄綾誨瀷緋葷粺鐨勪笉瓚沖綊鍜庝簬闈㈠悜瀵硅薄鐨勪笉瓚籌紝涔熶技涔庤鎹笉瓚熾?/P>
]]>
涓ч挓涓鴻皝楦o紵(2) http://www.tkk7.com/raimundox/archive/2005/12/21/24889.htmlRaimundox Raimundox Tue, 20 Dec 2005 16:22:00 GMT http://www.tkk7.com/raimundox/archive/2005/12/21/24889.html http://www.tkk7.com/raimundox/comments/24889.html http://www.tkk7.com/raimundox/archive/2005/12/21/24889.html#Feedback 2 http://www.tkk7.com/raimundox/comments/commentRss/24889.html http://www.tkk7.com/raimundox/services/trackbacks/24889.html 絎? 鍏充簬"鎺ュ彛"
鍏充簬鎺ュ彛鐨勯棶棰樿佸簞璇村浜嗭紝榪欎釜涓滆タ騫朵笉灞炰簬闈㈠悜瀵硅薄鐨勬蹇碉紝鑰屼笖鍦ㄥ姩鎬佺被鍨嬮潰鍚戝璞¤璦(姣斿Ruby, Smalltalk閲?錛屾牴鏈病鏈夎繖涓笢瑗褲傝繖鏄竴涓函綺圭殑闈欐佺被鍨嬮潰鍚戝璞¤璦鐨勭壒鎬э紝鎴栬呯洿鎺ヨ錛屾帴鍙e氨鏄竴涓函綾誨瀷(Type)銆傝繕鏄笂嬈$殑渚嬪瓙錛?/P>
1 interface Instrument { 2 void playNote(Note note); 3 void playChord(Chord chord); 4 } 5 6 in Person Class 7 8 void playSolo(Instrument instrument) { 9 10 }
鍦ㄦ垜鎺ヨЕSmalltalk鐨勬渶寮濮嬬殑涓孌墊椂闂撮噷錛岃繖縐嶅湴鏂規(guī)槸璁╂垜鏈闅懼彈錛屾垜宸茬粡涔犳儻浜嗙敤綾誨瀷杈呭姪鎴戠殑鎬濈淮錛屼絾鏄垜鍙戠幇鎴戝湪Smalltalk閲屽仛涓嶅埌錛岃櫧鐒舵垜鍙互鍐欏嚭
Instrument >> playNote:note ^ self subclassResponsibility. Instrument >> playChord:chord ^ self subclassResponsibility.
浣嗘槸浠栧嵈涓嶆槸涓涓帴鍙o紝鎴戝彲浠ュ緢鐢?/P>
instrument = Instrument new . instrument playNote: Note C.
鏉ユ瀯閫犱竴涓狪nstrument涔嬪悗鍦ㄥ畠涔嬩笂璋冪敤playNote鏂規(guī)硶錛岀劧鑰屾垜浼氬緱鍒頒竴涓猰essageNotUnderstand鐨勯敊璇紝Smalltalk鍜孯uby閲屾病鏈堿bstract鐨勬蹇點備篃灝辨槸璇碼bstract method錛宎bstract class浠ュ強interface錛岄兘涓嶆槸闈㈠悜瀵硅薄鐨勬蹇碉紙鎴栬呬弗鏍間竴浜涜錛岄兘涓嶆槸闈㈠悜瀵硅薄鐨勫繀欏葷殑姒傚康錛夛紝鑰屾槸闈㈠悜瀵硅薄綾誨瀷緋葷粺鐨勬蹇點傞偅涔堝湪Smalltalk閲屾垜浠細鎬庝箞鍋氬憿錛?/P>
Person >> playSoloOnInstrument:instrument instrument playNote: Note C; playNote: Note D; playNote: Note E. Person >> playBackgroundOnInstrument:instrument instrument playChord: Chord C1; playChord: Chord C1; playChord: Chord C1;
瀵逛簬playSoloOnInstrument:instrument錛屾垜浠浜巌nstrument鐨勭被鍨嬫槸鏈夎姹傜殑錛屽氨鏄畠蹇呴』鑳藉鎺ュ彈playNote榪欎釜娑堟伅銆傚綋鐒惰繖涓被鍨嬮渶瑕佹槸闅愭э紝鎴戜篃鍙互瀵圭瓑鐨勫啓鍑洪潤鎬侀潰鍚戝璞$殑浠g爜鎶婅繖涓殣鎬х殑綾誨瀷鏄劇ず鐨勮〃紺哄嚭鏉?
1 interface Instrument { 2 Instrument playNote(Note note); 3 }
鍚屾牱瀵逛簬絎簩涓柟娉曟垜浠篃鍙互鍐欏嚭鏉?
1 interface Instrument { 2 Instrument playChord(Note note); 3 }
濡傛灉鎴戜滑闇瑕佸浜庝竴涓殑娑堟伅涔熸槸涓鏍風殑錛屾瘮濡?/P>
Person >> playBWV996OnInstrument:instrument instrument playNote: Note C; playChord: Chord C; playNote: Note D.
鍚屾牱榪欎釜鏃跺欓殣鎬х殑綾誨瀷闇瑕佸氨鏄?/P>
1 interface Instrument { 2 Instrument playNote(Note note); 3 Instrument playChord(Note note); 4 }
閭d箞鎺ュ彛鏄粈涔堝憿錛熸垜緇欏嚭涓涓笉紜垏鐨勮娉曪紝interface鏄竴涓秷鎭殑鍙戦佽?sender)鍜屼竴涓秷鎭殑鎺ュ彈鑰?reciver)闂寸殑涓縐嶇被鍨嬬殑綰﹀畾 錛屼篃灝辨槸璇村湪鎴戠湅鏉nterface鐨勭敤澶勪富瑕佸湪緇嗙矑搴︾殑鏄懼紡綾誨瀷綰﹀畾銆傛垜鏈変竴涓悓浜嬶紝姣忔鍐欎唬鐮侀兘涓轟竴涓猅est Case鎵瑕佹祴璇曠殑瀵硅薄瀹氫箟涓涓猧nterface錛屾瘡涓猧nterface閮藉彧鏈?-3涓柟娉曪紙lx鍚屽澶鎬綘鍛?D錛夛紝榪欐槸寰堝緱interface涔嬩笁鍛崇殑鐢ㄦ硶銆傝繖縐嶇殑鍋氭硶瀵逛簬鍦ㄩ潤鎬佺殑闈㈠悜瀵硅薄緋葷粺鐨勫ソ澶勬垜浠湪緇ф壙閲屽啀璁鴻堪銆?/P>
鑷充簬鑰佸簞鎵璇寸殑鎺ュ彛鏄緇ф壙鐨勪竴縐嶄唬鏇垮搧錛岃繖鍙笉榪囨槸涓栦織鐨勭湅娉曪紝鍦ㄩ潤鎬佺被鍨嬬殑闈㈠悜瀵硅薄閲岋紝緇ф壙鑷沖皯鏈?涓涔?
1.瀹炵幇緇ф壙錛岃繖涓湪Smalltalk錛孯uby錛孋++閲屾湁錛岃屽湪java閲屾病鏈夛紝C++閲屾槸閫氳繃private extends鏉ュ疄鐜扮殑
1 class SubClassA: private ImplementationParent { 2 }
榪欎篃鏄疌++閲屼負鏁頒笉澶氱殑subclass涓嶆槸subtype鐨勪緥瀛愩?/P>
2.綾誨瀷緇ф壙錛岃繖涓湪C++鍜宩ava閲屾湁錛岃屽湪smalltalk,ruby鏈夊嵈涓嶆槑鏄俱?/P>
綾誨瀷緇ф壙鐨勬瀬鑷村氨鏄疌++閲岀殑綰櫄鐖剁被
1 abstract class Parent { 2 3 public asbtract void method1() = 0 ; 4 public asbtract void method2() = 0 ; 5 }
涔熷氨鏄痡ava閲岀殑interface
1 interface Parent { 2 void method1(); 3 void method2(); 4 }
鍥犳錛屼篃灝辨槑浜嗕簡錛屾墍璋撯滈潰鍚戞帴鍙g紪紼嬧濇槸浠ョ被鍨嬩綔涓虹害瀹氱殑緙栫▼銆傛垜瑙夊緱榪欑偣澶у涓瀹氫笉闄岀敓錛岄潰鍚戞帴鍙g殑緙栫▼閲宨nterface閮藉緢灝忚屼笖綰﹀畾鏄庣‘銆備絾鏄璇存槑涓鐐圭殑鏄紝榪欎釜涓滆タ鍜?闈㈠悜鎶借薄鑰屼笉瑕侀潰鍚戝叿浣撶紪紼?鍏跺疄榪樹笉涓鏍鳳紝鎵浠ヨ繖涓笢瑗夸篃灝變粎浠呰兘綆楁槸闈欐佺被鍨嬮潰鍚戝璞$殑涓涓儻鐢ㄦ硶錛岃繕鍒頒笉浜嗗師鍒欒繖涔堥珮銆?/P>
]]> 涓ч挓涓鴻皝楦o紵(1) http://www.tkk7.com/raimundox/archive/2005/12/20/24851.htmlRaimundox Raimundox Tue, 20 Dec 2005 11:58:00 GMT http://www.tkk7.com/raimundox/archive/2005/12/20/24851.html http://www.tkk7.com/raimundox/comments/24851.html http://www.tkk7.com/raimundox/archive/2005/12/20/24851.html#Feedback 10 http://www.tkk7.com/raimundox/comments/commentRss/24851.html http://www.tkk7.com/raimundox/services/trackbacks/24851.html 寮綃囦箣鍓嶅厛璇存槑涓涓嬶紝鎴戝拰鑰佸簞鏈夌潃涓嶉敊鐨勭浜わ紝浠栨渶鍒濆啓涓ч挓緋誨垪鐨勬椂鍊欙紝鎴戞槸蹇犲疄鐨勬嫢瓚鎬箣涓錛屽簞鍏勮鎴戝皻鏈夊灝烘墍闀匡紝榪樺湪涓ч挓緋誨垪閲屽紩鐢ㄤ簡鎴戠殑鍑犱釜瑙傜偣銆傜劧鑰屾渶榪戜竴孌墊椂闂撮噷錛屾垜浣滀簡榪欐牱鍑犱歡浜嬫儏錛?/P>
1 .閲嶆柊瀛︿範浜唋ambda婕旂畻銆傛垜鐨勬暟瀛﹀熀紜涓嶅強taowen絳夛紝璐逛簡涓浜涙椂鏃ヤ粛涓嶅畬鍏ㄤ簡鐒訛紝鐩墠澶ф姷鑳藉鐫R5RS鍚庨潰鐨勮涔夊畾涔夊涓浜涚畝鍗曠殑scheme紼嬪簭榪涜lambda婕旂畻銆?BR> 2 .鍙嶅鐮旂┒浜嗗嚑閬峉ICP銆傚悓鏃剁湅浜嗗綍鍍忓拰涔︼紙鎰熻阿鏇硅佸笀涓嬬殑Video錛夛紝鑷俊瀵瑰墠浜岀珷鍗婃湁浜涜璁よ瘑涔︿腑鏈強錛屽悗浜岀珷鍗婄矖鐭ュぇ瑙堝皻涓嶈兘鍙戝墠浜烘墍鏈彂涔嬭█銆?BR> 3 .瀛︿範浜哠malltalk鍜孯uby錛孌uck Typing浠ュ強鍏朵粬涓浜涙湁鍏崇被鍨嬬郴緇熺殑涓滆タ銆?BR> 4 .鍥為【浜嗕竴涓嬮潰鍚戝璞¤璦鐨勪竴浜涘彂灞曞彶錛屼互鍙蹭負閴寸矖鐭ヤ竴浜涘叴鏇褲?BR> 5 .緇忔棩鍜宼aowen錛岃佸簞璁ㄨ璇█銆佽璁$瓑絳変箣綾伙紝姣忎負涓杈ㄥ繀絀鋒垜鎵鐭ヤ簤鍙戜竴璦錛屾墍浠ョ煡璇嗗彲浠ヨ繀閫熸潅緋?D
緇忚繃縐嶇涔嬪悗錛屽彂鐜板綋鍒濇墍璋撻福OO涔嬩撫閽燂紝瀹炲湪鏄█榪囧叾瀹炪?BR>-------------------------------------------------------------------------------------------------------------------------------------------------------------- 絎? 鍏充簬"闈㈠悜瀵硅薄"
鏃㈢劧瑕佷負浜哄鏁蹭撫閽燂紝鍏堣鎵懼浜嗚嫤涓伙紝涓嶇劧宀備笉鏄櫧蹇欐椿浜嗕竴鍦恒備粈涔堟槸闈㈠悜瀵硅薄錛熻繖涓棶棰樺お澶э紝鎴戜滑涓句竴涓緢甯歌鐨勪緥瀛愶細
interface Instrument { void playNote(Note note); void playChord(Chord chord); } abstrat class Keyboard implement Instrument { .. } class ClassicGuitar implements Instrument { . } class Piano extends Keyboard { .. } in person class void playSolo(Instrument instrument) { instrument.playNote(AbsoluteNote.C1).playNote(AbsoluteNote.C2); } void playBackground(Instrument instrument) { instrument.playChord(Chord.C5).playChord(Chord.C9); } in some case ClassicGuitar perez711= . Piano pianoHere = . vincent.playSolo(stenzel); may.playBackground(pianoHere); etc .
榪欎釜渚嬪瓙鑷劧寰堜笉鍏呭垎錛屼笉榪囩戶鎵垮晩錛屾帴鍙e晩錛屽鎬佸晩錛岀暐涓懼ぇ姒傦紝灝氬彲浠ヤ綔涓轟竴涓璁虹殑渚嬪瓙銆備粠榪欎釜渚嬪瓙閲岋紝鎴戜滑鍙戠幇鏈夎繖鏍蜂竴涓簨瀹烇紝灝辨槸Person綾繪湁涓や釜鏂規(guī)硶
void playSolo(Instrument instrument); void playBackground(Instrument instrument);
鍒嗗埆琛ㄧず錛岄渶瑕佷竴涓被鍨嬩負Instrument鐨勫璞nstrument錛岀劧鍚庡浠栬繘琛岀浉搴旂殑鎿嶄綔錛岃屼笖錛屼粠姒傚康涓婃潵璁詫紝絎竴涓柟娉曪紝浣挎紨濂忔棆寰嬬殑錛屼篃灝辨槸鍗曢煶錛岃岀浜屼釜鏂規(guī)硶鏄紨濂忓拰澹扮殑銆傞偅涔堬紝濡傛灉鎴戞湁涓涓被
class GlassBottle { void playNote(Note note) { .. } }
鎴戜滑鐭ラ亾錛岀幓鐠冪摱瑁呬簡姘翠篃鏄彲浠ュ彂鍑哄0闊籌紝Mozart鍙槸涓虹幓鐠冪摱鍐欒繃鏇插瓙鐨勶紝鑰岃繖閲屾垜浠嵈涓嶈兘
GlassBottle beerBottle = . vincent.playSolo(beerBottle);
鍥犱負鎴戜滑鍦ㄦ瀯閫燩erson綾葷殑鏃跺欙紝鎴戜滑鐨刾lay鏂規(guī)硶鏄緷璧栦竴涓被鍨嬩負Instrument鐨凮bject錛屾崲鑰岃█涔嬶紝鎴戜滑榪欓噷鎵璋撶殑Object-Oriented鍏跺疄縐頒綔Object-with-Type-Oriented鐨勬洿鍚堥傦紝鍏跺疄榪欑被璇█鏈変竴涓笓鏈夊悕璇嶏紝鍙仛static type object oriented銆傞偅Object-Oriented鏄笉鏄氨涓瀹氭槸Static Type Object Oriented鐨勫憿錛熶笉鐒訛紝姣斿鍦≧uby閲岋紝鎴戜滑鍙互鍐欐垚錛?/P>
class Person def playSolo(thing) thing.playNote(Note.C1).playNot(Note.c2) end def playBackground(thing) thing.playChord(Chord.C5).playChord(Chord.C9) end end class Guitar def playNote(note) end def playChord(chord) end end class GlassBottle def playNote(note) end end
鐒跺悗灝卞彲浠?/P>
perez711 = Guitar. new vincent = Person. new vincent.playSolo(perez711)
鍚屾牱涔熷彲浠?/P>
vincent.playSolo(GlassBottle. new )
鍦ㄨ繖閲岋紝綾誨瀷鍙互鎺ㄦ紨涔熷彲浠ョ暀鍒皉untime媯鏌ワ紝濡傛灉鏄帹婕旂殑璇濓紝鍦╬layNote閲岋紝鐢變簬thing璋冪敤浜唒layNote鏂規(guī)硶錛屾墍浠ヤ紶榪涙潵鐨勫璞″繀欏昏鍒繪剰鎺ュ彈playNote榪欎釜娑堟伅錛屼簬鏄疓uitar鍜孏lassBottle閮芥槸鍙互閫氳繃錛屽洜姝ゆ垜鍗沖彲浠ユ紨濂忔垜鐨凱erez 711錛屼篃鍙互鏁茬幓鐠冪摱銆傝繖縐嶆柟寮忓彨鍋歞ynamic type銆?/P>
閭d箞static type鍜宒ynamic type鍖哄埆鍦ㄩ偅鍛紵static type璁や負錛宑lass灝辨槸type錛宼ype灝辨槸class; subclass灝辨槸subtyping錛宻ubtyping灝辨槸subclass(鍏跺疄榪欏彞涓嶄弗璋紝鍦╟++閲屽彲浠ヤ嬌寰梥ubclass涓嶆槸subtyping錛屼絾鏄痡ava閲屽氨娌″姙娉曚簡);鑰宒ynamic type鍒欒涓虹被鍨嬪拰class娌℃湁鍏崇郴錛岀被鍨嬪彇鍐充簬涓涓璞¤兘澶熸帴鍙楃殑娑堟伅銆?/P>
閭d箞鍝釜鎵嶆槸闈㈠悜瀵硅薄涔嬬湡璨屽憿錛熼仐鎲劇殑璇達紝static type騫朵笉鏄渶鍒濈殑闈㈠悜瀵硅薄銆備互瀵硅薄浣滀負妯″潡鍖栫殑鍗曚綅錛屽鑷猄imula 67銆備絾鏄疭imula 67騫朵笉鏄竴涓潰鍚戝璞$郴緇燂紝浠ョ洰鍓嶇殑瑙傜偣鏉ョ湅錛屽厖鍏墮噺鏄疧bject-based錛岀涓涓潰鍚戝璞¤璦褰撴帹Smalltalk錛孲malltalk鏄痙ynamic type鐨勩備笉榪嘢malltalk涓嶅お嫻佽錛岀涓涓ぇ闈㈢Н嫻佽鐨勯潰鍚戝璞¤璦鏄疌++錛孋++鏄痵tatic type鐨勶紝姝eLisp鏄涓涓嚱鏁板紡緙栫▼璇█錛屽緢澶歀isp鐨勭壒鎬ц褰撲綔鍑芥暟寮忚璦鐨勫叡鏈夌壒鎬?姣斿琛ㄦ槸鏈閲嶈鐨勬暟鎹粨鏋勶紝杞昏娉?涓鏍鳳紝鎵浠ュ緢澶氫漢浠ヤ負闈㈠悜瀵硅薄灝卞繀鐒舵槸static type錛堟瘮濡傝佸簞鍜屾垜錛夈傚浜庨潰鍚戝璞$殑璇В錛?0%鏉ヨ嚜C++銆備篃灝辨槸璇達紝80%鏉ヨ嚜浜巗tatic type鐨勯潰鍚戝璞$郴緇熴傚皢static type闈㈠悜瀵硅薄褰掑拵浜庢暣涓潰鍚戝璞★紝鎴戣緢瀹炲湪鏄ぇ鑰屾棤褰撹█榪囧叾瀹炪?/P>
鍚庨潰鎴戝啀涓涓灝嗚佸簞鎵璦涔婳O涓嶅綋涔嬪鍔犱互璇存槑
]]> A Walk on JSR220 http://www.tkk7.com/raimundox/archive/2005/12/12/23427.htmlRaimundox Raimundox Mon, 12 Dec 2005 03:08:00 GMT http://www.tkk7.com/raimundox/archive/2005/12/12/23427.html http://www.tkk7.com/raimundox/comments/23427.html http://www.tkk7.com/raimundox/archive/2005/12/12/23427.html#Feedback 1 http://www.tkk7.com/raimundox/comments/commentRss/23427.html http://www.tkk7.com/raimundox/services/trackbacks/23427.html 浠嶣JUG鐨刴aillist閲屽彂鎺樹竴涓垜浠ュ墠鐨勬棫甯栧嚭鏉ワ紝鍢垮樋 浠ュ墠鎴戝拰limo鍚屽織鍋氳繃涓涓狧ibernate鎶宸ф儏鑹茬増....鍢垮樋錛岃繖嬈″彂鍔ㄥぇ瀹舵敹闆嗕竴涓婮2SE 5鍜孞SR 220閲岀殑鏀硅繘design鐨則ips.鎴戜笅鍗堣瘯楠?SPAN class=st0 id=st name="st">JSR220鐨勬椂鍊欙紝鎵懼埌鍑犱釜 1. Implement Moment-Interval and Moment-Interval-Details Using Iterable<T> 渚嬪瓙錛?姣斿Order鍜孫rderItem錛屽吀鍨嬬殑涓瀵瑰錛屼竴鑸垜浠繖涔堝仛
1 class Order { 2 3 private List < OrderItem > items; 4 5 public List < OrderItem > getItems() { 6 7 }8 }
鍦↗2SE5閲岄潰錛?/P>
1 class Order implements Iterable < OrderItem > { 2 3 private List < OrderItem > items; 4 5 public Iterator < OrderItem > iterator() { 6 return items.iterator; 7 } 8 9 public int getItemCount() { 10 11 }12 // and addItem removeItem and others 13 }
灝卞彲浠ョ洿鎺ユ潵澶勭悊錛?/P>
1 for (OrderItem item : order) { 2 }
浠庢煇縐嶇▼搴︿笂鍒╃敤enhanced for鐨勮娉曪紝鏉ョ畝鍖栬娉曘?BR> trade-off: 涓嶉傚悎澶氫釜details 鑱氬悎錛岄傚悎浜庣畝鍗曠殑moment-interval鍜宮oment-interval-details銆?BR> 2. Annotate Description with @Embeddable, and the Thing it describe with @Entity 渚嬪瓙錛孭roduct鍜孭roductDescription
1 @Embeddable 2 class ProductDescription { 3 private String name; 4 private String description; 5 . and getters and setters 6 } 7 8 @Entity(access = AccessType.FIELD) 9 class Product { 10 private ProdcutDescription description; 11 }
鍦?SPAN class=st0 id=st name="st">JSR220閲岋紝濡傛灉涓涓猣ield鏄痚mbeddable錛岃屼笖瀵硅field娌℃湁鏍囨敞涓篅Transite,浠ュ強浣跨敤keyword transite,鑷姩鎸塃mbedded澶勭悊錛岃繖涓鐐規(guī)槸寰堟柟渚?WBR>鐨勩?BR> 榪欎釜鍩烘湰娌″彂鐜皌rade-off 3. Avoid Database Primary Key in Domain Model Using @EmbeddableSuperclass 渚嬪瓙錛屽湪hibernate閲岋紝鎬繪槸瑕佺粰Domain鍔犱竴涓猵rimary key錛岄潪甯哥殑涓嶇埥. 铏界劧涔熷彲浠ラ氳繃緇ф壙緇撴瀯鏉ラ伩鍏嶏紝浣嗘槸閰嶇疆鏂囦歡澶錛?JSR220 閲岋紝閫氳繃鑷姩澶勭悊鐨刟nnotation
錛屽彲浠ヨ妭綰﹀緢澶х殑宸ヤ綔閲忋?BR>
1 @EmbeddableSuperclass 2 class DomainModel { 3 // modeling your model here 4 } 5 6 @Entity 7 class PersistentDomainModel extends DomainModel { 8 9 private long primaryKey; 10 }
榪欎釜澶у灝變竴鐩簡鐒朵簡 4. Avoid Database Field in Domain Model Using @AttributeOverride Annotation铏界劧綆鍖栦簡寮鍙戯紝浣嗘槸浠嶇劧鏈変竴涓棶棰?WBR>錛屽氨鏄慨鏀筸apping鐨勬椂鍊欓渶瑕佷慨鏀逛唬鐮侊紝榪欎釜寰堜笉濂?WBR>錛岃屼笖褰卞皠鐨勬椂鍊欓渶瑕佸湪domain閲岀‖緙栫爜field name錛岃繖涓畝鐩村氨鏄伓蹇冿紝浣嗘槸榪樻槸鐢卞姙娉曢伩鍏嶇殑銆?/P>
1 @EmbeddableSuperclass 2 class DomainModel { 3 // modeling your model here 4 } 5 6 7 @Entity 8 @AttributeOverride(name= " property " , column = @Column(name = " fieldName " )) 9 class PersistentDomainModel extends DomainModel { 10 11 private long primaryKey; 12 }
鍚屾牱錛岄氳繃緇ф壙鏉ラ殧紱繪妧鏈拰Domain錛岀劧鍚庡湪瀛愮被閲屼綔閮ㄧ講鐩?WBR>鍏崇殑鍔ㄤ綔銆傜劧鍚庢妸DomainModel鍜孭ersistentDomainModel 鍒嗗寘錛岄拡瀵笵omainModel緙栫▼錛屽氨O(jiān)k浜?WBR>銆傝繖涓椂鍊橠omain浼氬紓甯哥殑騫插噣..... 5. Model Place as Factory 鍏跺疄榪欎釜鏄竴涓氬垯錛屼互鍓嶅ソ鍍忎篃璁ㄨ榪囥?/P>
1 public interface Store { 2 Order newOrder();3 // and others; 4 }
鍩烘湰涓婁笅鍗?涓皬鏃剁殑鎴愭灉灝辮繖涔堝錛屾垜鏄湪灝濊瘯鐢?SPAN class=st0 id=st name="st">JSR220 API浠f浛浠ュ墠鎴戝拰limo鍐欑殑閭d釜鐝嶇彔鍟嗗煄璁㈠崟閮ㄥ垎寰楀埌鐨勪竴浜?WBR>tips銆傛諱綋鑰岃█錛?SPAN class=st0 id=st name="st">JSR220榪樻槸鎸哄ソ鐨勶紝鎴戜滑鍙互寰堣嚜鐒剁殑榪愮敤涓浜涙ā寮忓拰OO鐨勬墜孌佃繕閬垮厤瀹冪殑涓嶈凍銆傚悓鏃朵笂榪板仛娉曞湪hibernate閲屼篃鍙互鍋氾紝浣嗘槸鐢變簬姣旇緝楹葷儲錛屽ぇ瀹朵竴鑸繕鏄仛涓嶅埌銆?SPAN class=st0 id=st name="st">JSR220閲岋紝姝f槸閫氳繃瀹冪殑姣涚梾寮鴻揩鎴戜滑榪欎箞鍋?....錛堟睏錛夛紝涔熺畻浣撶幇鍑虹害瀹氫簡銆?/P> ]]>
Why Inconsistent Concepts Considered Harmful http://www.tkk7.com/raimundox/archive/2005/12/10/23238.htmlRaimundox Raimundox Fri, 09 Dec 2005 18:17:00 GMT http://www.tkk7.com/raimundox/archive/2005/12/10/23238.html http://www.tkk7.com/raimundox/comments/23238.html http://www.tkk7.com/raimundox/archive/2005/12/10/23238.html#Feedback 2 http://www.tkk7.com/raimundox/comments/commentRss/23238.html http://www.tkk7.com/raimundox/services/trackbacks/23238.html 灝弔ao緇欐垜鎵句簡涓涓潪甯稿ソ鐨勯鐩?
so, you think the consistent thing means a lot ? But how do you think the gracious or elegant feeling mean to the real expressiveness of business requirements ? We can see lisp is very successful in researching area because of the simplicity nature inside which is also true to Smalltalk. But why they aren ' t successful in biz world? I think that is the problem you should further study, "how can the consistent feeling mean something to our everyday programming life?".
鎴戞壙璁や互鍓嶆病鏈夎冭檻鍒拌繖涓棶棰橈紝鍥犱負鎴戜互涓鴻拷姹傛蹇典竴鑷存ф槸涓縐嶄笉璦鑷槑鐨勫ぉ鎬с傞偅涔堜負浠涔堣涓鑷存у緢閲嶈鍛紵鎴戞湁榪欐牱涓浜涙兂娉曘?/p>
1. 澶嶆潅鎬?/p>
姒傚康涓嶄竴鑷翠駭鐢熼鍏堜駭鐢熺殑涓涓伓鏋滃氨鏄鏉傛э紝榪欓噷鎴戝皢涓句袱涓緥瀛愩?br> 絎竴涓叧浜嶭isp鐨勩侺isp鏈韓鍏鋒湁涓涓緢涓鑷村緢綆鍗曠殑璁$畻妯″瀷鈥斺斘?婕旂畻銆傚湪榪欎釜璁$畻妯″瀷涓紝鍩烘湰鍏冪礌鏄嚱鏁幫紝位榪愮畻絎︼紝路榪愮畻絎︺傝涔変篃鏄畝鍗曟槑紜殑錛宭ambda榪愮畻絎︽彁鍙栧嚭鍑芥暟涓殑鑷敱鍙橀噺錛岀劧鍚庡啀鐢盿pply瀵硅嚜鐢卞彉閲忚祴鍊箋傛暣涓綆楄繃紼嬪氨鏄嚱鏁幫紙絎﹀彿錛夋眰鍊肩殑榪囩▼銆備緥濡傚浜庡嚱鏁皒 + y錛屾垜浠彲浠ヨ繖鏍鋒潵姹傚箋?/p>
((位x (位y . x + y)路 3 )路 4 ) = ((位x. x + 3 )路 4 ) = 4 + 3 = 7
鐢變簬Lisp澶氬皯鍙互璁や負鏄?婕旂畻鐨勪竴縐嶅疄鐜幫紝鎴戜滑鍙互綾諱技鍐欏嚭Lisp浠g爜
(define f (lambda x (lambda y ( + x y)))) (apply (apply f 3 ) 4 )
鎴栬呮洿鍔犵畝鍗曠殑鍐欎負
(define (f x y) ( + x y)) (f 3 4 )
鎵鏈夊湪Lisp涓殑紼嬪簭錛屾垜浠兘鍙互鐢ㄤ竴縐嶄竴鑷寸殑姒傚康鏉ヨ〃杈撅紝灝辨槸絎﹀彿姹傚鹼紝鎴戜滑瀵逛竴涓鍙峰簲鐢ㄤ竴浜涘鹼紝鐒跺悗榪欎釜絎﹀彿瀹屾垚璁$畻騫舵妸緇撴瀯榪斿洖緇欐垜浠紝鍦ㄨ綆楃殑榪囩▼涓紝絎﹀彿瀵瑰閮ㄧ幆澧冩病鏈変換浣曠牬鍧忓拰渚濊禆銆備絾鏄疞isp涓紩鍏ヤ簡璧嬪鹼紝浜庢槸瀛樺湪涓浜涚鍙鳳紝涓嶄粎浠呮槸鏉ヨ綆楋紝鍚屾椂浠栦滑榪樿兘鏀瑰彉鐜銆?/p>
(define (bad - f x y) (begin (set ! z 5 ) ( + x y)))
榪欎釜鍑芥暟涓嶄粎浠呮眰x + y鐨勫鹼紝鍚屾椂淇敼浜嗙鍙穁鐨勫箋傝祴鍊肩殑寮曞叆鐮村潖浜嗗嚱鏁板彧姹傚艱屼笉褰卞搷鐜榪欎釜姒傚康鐨勪竴鑷存с備簬鏄垜浠笉寰椾笉瀵繪壘涓涓洿鍔犲鏉傜殑涔熸洿鍔犳販涔辯殑璁$畻妯″瀷錛屾潵浠f浛綆鍗曚紭闆呯殑位 婕旂畻銆備簬鏄笉涓鑷寸殑姒傚康甯︽潵浜嗘濈淮涓婄殑澶嶆潅鎬?涓嶈繃Lisp涓殑姒傚康涓嶄竴鑷撮櫎浜嗕駭鐢熶簡澶嶆潅涔嬪錛岃繕?gòu)葊鍙戜簡浜轟滑瀵逛簬綆鍗曡綆楁ā鍨嬬殑鍚戝線浠庤屼駭鐢熶簡鍑芥暟寮忕紪紼嬮鏍鹼紝榪欎篃鏄垜鏈鐖辯殑緙栫▼椋庢牸涔嬩竴)銆?/p>
姒傚康涓嶄竴鑷村甫鏉ョ殑澶嶆潅鎬ц窛紱繪垜浠渶榪戠殑搴旇鏄疛ava涓殑綆鍗曠被鍨嬶紝Java鏈韓鏄竴涓崟鏍圭殑闈㈠悜瀵硅薄璇█錛屼粠姒傚康涓婅涓鍒囬兘搴旇鏄璞★紝鑰屼笖鐢變簬鎬ц兘鑰冭檻鑰屽嚭鐜扮殑綆鍗曠被鍨嬶紝寮曞叆浜嗕唬鏁版х殑涓栫晫瑙傜殑鍚屾椂錛岀牬鍧忎簡闈㈠悜瀵硅薄鐨勪竴鑷存蹇點侸ava涓櫧鐒舵湁鍖呰綾繪潵鍋氳ˉ鍋匡紝浣嗘槸浠嶇劧涓嶈兘寮ヨˉ姒傚康涓婄殑鏂銆傛垜浠彲浠ョ敤
1 new Integer( 3 )
鏉ヤ唬琛ㄥ璞℃蹇典腑鐨?錛屼絾鏄?/p>
3 + 4 * 5
涓嶈兘瀵圭瓑鐨勭炕璇戜負:
1 new Integer( 3 ) + new Integer( 4 ) * new Integer( 5 )
綆鍗曠被鍨嬪叿鏈夌殑榪愮畻絎﹀拰瀵硅薄綾誨瀷鐨勬秷鎭彂閫佹蹇典笂鏄笉涓鑷寸殑銆傝櫧鐒舵垜浠彲浠ュ湪Java 5涓嬌鐢ㄤ笂榪扮殑浠g爜錛屼絾鏄疛ava 5鐨凙uto-Boxing鏇村鐨勬妸瀵硅薄綾誨瀷褰撲綔綆鍗曠被鍨嬭繘琛屾暟鎹繍綆楋紝鑰屼笉鏄儚C++涓殑榪愮畻絎﹂噸杞戒竴鏍鋒妸鏁版嵁榪愮畻褰撲綔涓縐嶇壒孌婃秷鎭紶閫掞紝铏界劧璇硶涓婃湁鐩鎬技鐨勫姛鑳斤紝浣嗘槸姒傚康涓婂ぇ寮傚叾瓚o紝瀵逛簬鎴戣繖涓狾O鍒嗗瓙鑰岃█錛孞ava 5鐨凙uto-Boxing瀹炲湪鏄伓蹇冨埌涓嶈銆傚悓鏃剁畝鍗曠被鍨嬪拰瀵硅薄綾誨瀷鍦ㄨ祴鍊艱涔夊拰瀛樺偍妯″瀷涓婁篃瀛樺湪寰堝ぇ鐨勪笉涓鑷達紝榪欑涓嶄竴鑷存у湪浣跨敤Collection API鐨勬椂鍊欏甫鏉ヤ簡涓浜涘鏉傚害銆傦紙榪樿寰桟ommons Collection閲岄偅浜汸rimitive Collection鍚э紵錛?br> 2.鍓綔鐢?/p>
姒傚康涓嶄竴鑷翠駭鐢熺殑絎簩涓伓鏋滃氨鏄壇浣滅敤錛屾垜澶ф鎯充簡涓涓嬮兘鏈夊摢浜涘彲鑳界殑鍓綔鐢紝緇撴灉璁╂垜寰堝瘨錛屾垜鑳芥兂鍒扮殑鍓綔鐢紝澶у鏁版槸鐢變簬鍦ㄥ彟涓縐嶆ā鍨嬩腑寮曞叆浜嗗啹璇█鐨勫洜绱犱粠鑰岄犳垚浜嗘蹇典笂鐨勪笉涓鑷磋屽紩璧風殑銆傚叾涓渶涓轟漢鐭ョ殑....榪樻槸璧嬪煎湪鍑芥暟寮忕紪紼嬩腑鐨勫壇浣滅敤...榪欎釜鍦ㄥ嚱鏁板紡緙栫▼紺懼尯鏈夊緢騫挎硾鐨勮璁猴紝鎴戝彧璇翠竴鐐癸紝涓轟粈涔堝懡浠よ璦鏄湁瀹崇殑銆?/p>
鍐璦鎴栬呰鍛戒護寮忚璦涓昏鐢ㄤ簬鍒葷敾瀵硅綆楁満鎿嶄綔鐨勫簭鍒楋紝騫朵笉鍏沖績搴忓垪鐨勫唴鍦ㄥ叧緋匯備篃灝辨槸璇達紝鎴戜滑鍙互鎶婁竴浜涘畬鍏ㄦ病鏈夎仈緋葷殑鎸囦護鍐欏湪涓璧楓傚洜姝ゅ啹璇█鍦ㄨ涔変笂姣棤寤烘爲錛屽悓鏃跺湪鎶借薄涓婁篃姝㈡浜庡瓙紼嬪簭錛堜竴鐮f寚浠ゅ拰鍙︿竴鐮f寚浠わ級銆傚啹璇█鍏鋒湁寰堝己鐨勬椂闂磋﹀悎鎬у湪瀛樺偍涓婁篃寮虹儓鐨勫懼悜浜庣嚎鎬у瓨鍌ㄣ傜洰鍓嶅ぇ澶氭暟闅懼鐞嗙殑闂錛屽彲浠ュ綊緇撲負璁$畻妯″瀷鍜屾搷浣滆涔夌殑涓嶄竴鑷達紝鐢氳嚦鏈変簺瀛﹁呰涓烘槸鍐粨鏋勪弗閲嶅埗綰︿簡璁$畻鏈虹殑鍙戝睍銆傚洜姝ゅ啹璇█琚嚱鏁扮ぞ鍖虹湅浣滀竴涓緢鍗遍櫓鐨勫壇浣滅敤錛屾瀬鍔涢伩鍏嶄箣銆?/p>
姒傚康鐨勪笉涓鑷翠駭鐢熺殑鍓綔鐢ㄥ湪娣瘋鐨凮O璇█涓篃寰堟槑鏄撅紝灝ゅ叾鏄湪鍛戒護寮忚璦涓姞鍏ラ潰鍚戝璞℃満鍒訛紝鑰屼笖浣跨敤闈㈠悜瀵硅薄浣滀負綾誨瀷緋葷粺鐨勬墿灞曪紝浣跨敤榪囩▼寮忕殑鏂規(guī)硶鏉ユ帶鍒舵祦紼嬨傝繃紼嬪拰瀵硅薄鐨勪笉涓鑷存湰韜氨緇欎簡紼嬪簭鍛樹竴縐嶆殫紺猴紝浣犲彲浠ヤ嬌鐢ㄥ璞℃妧鏈潵鏋勯犵被鍨嬬郴緇燂紝鐒跺悗浣跨敤榪囩▼鐨勬柟娉曟潵鎿嶄綔浠栥傛槑鏄劇殑鍓綔鐢ㄤ滑寰堝鏄撲嬌鐢ㄨ繃紼嬪寲紼嬪簭錛屼粠鑰屼嬌寰楀璞″甫鏉ョ殑濂藉琚緢澶х殑鍓婂急浜嗭紙褰撶劧鎴戜滑鏈夐噸鏋勬潵寮ヨˉ榪欎釜閿欒錛夛紝姣斿涓嬮潰涓涓緥瀛?鎴戜滑寰堝鏄撲粠鍐欏嚭涓嬮潰鐨勪唬鐮侊細
1 if (order.getState() == Order.CANCEL) 2 do something for cancel; 3 else if (order.getState() == Order.PAID) 4 do something for paid; 5 else if (order.getState() == Order.DELIVERY) 6 do something for delivery
鑰屼笉鏄?br>
1 public abstract OrderState { 2 3 protected Order _order; 4 5 protected OrderState(Order order) { 6 _order = order; 7 } 8 9 public abstract void handler(); 10 }11 12 class CancelState extends OrderState { 13 14 public void handler() { 15 do something for cancel; 16 }17 }18 19 order.getState().handle();鍥犱負瀛樺湪榪囩▼鎬х殑鍏抽敭瀛梚f, while,澶勪簬鏂逛究鐨勮冭檻錛屾垜浠細鍐欏嚭絎竴縐嶉鏍肩殑浠g爜錛岃岃冭檻鍒版槗浜庣淮鎶わ紝鎴戜滑搴旇鍐欑浜岀椋庢牸鐨勪唬鐮併傚瓨鍦ㄤ袱縐嶄笉涓鑷寸殑涔﹀啓浠g爜鐨勯鏍鹼紝榪欎釜鏃跺欙紝鍓綔鐢ㄥ彇鍐充簬浣跨敤鐨勮璦OO鐨勭▼搴︼紝姣斿鍦–++閲屾洿瀹規(guī)槗鍐欏嚭絎竴縐嶉鏍肩殑浠g爜錛岃屽湪Ruby鍜孲malltalk涓紝鏇村鏄撳啓鍑虹浜岀椋庢牸鐨勪唬鐮併?br>
3.閫掑綊鐨勬瀯閫犺蔣浠?/p>
榪欎釜铏界劧璺熸蹇典竴鑷存湁鍏籌紝浣嗘槸涓涓洿澶х殑涓婚錛屽緟緇惂銆?/p>
4.浼橀泤錛岀編鎰熷拰鏃犲悕鍝佽川
姒傚康鐨勪竴鑷存т細浜х敓涓縐嶄紭闆呯殑緹庢劅錛屾垜瑙夊緱鎴戜滑閮芥湁榪欑鎰熻錛屽鏋滄垜浠兘鐢ㄤ竴縐嶄竴鑷寸殑瀹規(guī)槗鐞嗚В涓旂粺涓鐨勬柟寮忔潵澶勭悊澶氱涓嶅悓鐨勫鏉傜殑闂錛岄偅涔堟垜浠氨浼氳寰楄繖縐嶆柟娉曞緢浼橀泤錛屼篃寰堝叿鏈夌編鎰熴傜被姣旂墿鐞嗕腑鐨勭墰欏垮畾寰嬶紝寮鏅嫆瀹氬緥錛岄害鍏嬫柉闊︽柟紼嬶紝閮芥槸榪欑綆鍗曚竴鑷磋岃В鍐沖鏉傞棶棰樼殑瀹岀編紺轟緥銆傛垜浠洿瀹規(guī)槗鎰熻鍒頒竴鑷寸殑鎰熷康浜х敓鐨勭編鎰燂紝鑰屼笉涓鑷寸殑姒傚康寰寰寰堥毦浠ゆ垜嬈h祻銆傛垨璁告棤鍚嶅搧璐ㄦ槸鎴戝涓鑷寸殑姒傚康鐨勪竴縐嶆ā緋婄殑瀹$編鍚с?/p>
鎴戝ぇ鎶佃兘鎯沖埌鐨勫氨榪欎箞澶氾紝涓嶇煡灝弔ao鏄惁婊℃剰鎴戠殑絳斿嵎銆?/p>
]]> Apologize to Object-Oriented Methodology http://www.tkk7.com/raimundox/archive/2005/12/08/22986.htmlRaimundox Raimundox Thu, 08 Dec 2005 07:11:00 GMT http://www.tkk7.com/raimundox/archive/2005/12/08/22986.html http://www.tkk7.com/raimundox/comments/22986.html http://www.tkk7.com/raimundox/archive/2005/12/08/22986.html#Feedback 1 http://www.tkk7.com/raimundox/comments/commentRss/22986.html http://www.tkk7.com/raimundox/services/trackbacks/22986.html 鏈榪戝涔犱簡涓涓婼malltalk錛岀劧鍚庢繁娣辯殑鍠滄涓婁簡榪欎釜鍙よ佺殑璇█銆係malltalk璇█鍙叿鏈変竴涓緢灝忕殑璇█鏍稿績錛岃繖涓牳蹇冪敱澶х害10鍑犱釜鍏抽敭瀛楀拰涓浜涘熀紜鐨勯潰鍚戝璞¤涔夋瀯鎴愩傝屼笖鍏抽敭瀛楅兘鏄薄: . ; ( ) [ ] | := 涔嬬被鐨勭畝鍗曠鍙鳳紝騫舵病鏈夋彁渚涙渶鍩烘湰鎺у埗鐨勬祦紼嬨傛渶寮濮嬬殑鏃跺欒繖璁╂垜寰堣糠鎯戯紝铏界劧寰幆緇撴瀯鍙互鐢ㄩ掑綊琛ㄧず錛屼絾鏄垎鏀庝箞鍔烇紵鐒跺悗鍙戠幇浜嗕竴涓緢閰風殑鐗規(guī)э紝Smalltalk鍙互浠呬粎閫氳繃闈㈠悜瀵硅薄鐨勮涔夋潵瀹炵幇鍒嗘敮緇撴瀯錛堝叾瀹炲氨鏄疭tate Pattern錛夛紝鍏蜂綋鐨勪唬鐮佸涓?/P>
Boolean>>ifTrue: aBlock self subclassResponsibility
Boolean>>ifFalse: aBlock self subclassResponsibility
True>>ifTrue: aBlock ^aBlock value.
True>>ifFalse: aBlock ^nil.
False>>ifTrue: aBlock ^nil.
False>>ifFalse: aBlock ^aBlock value.
鐒跺悗灝卞彲浠ワ紝
4 銆? ifTrue: [Transcript show: 'Hello']
鍥犱負鍦⊿malltalk閲岋紝涓鍒囩殕瀵硅薄涓斾粠宸﹀埌鍙蟲眰鍊鹼紝浜庢槸4 > 3 榪斿洖true錛宼rue鏄被True鐨勫敮涓瀹炰緥錛岀劧鍚庡氨鍙互瀵瑰畠鍙戦佹秷鎭紝ifTrue:錛屼簬鏄皟鐢ㄤ簡^aBlock value.鏉ュ浼犺繘鍘葷殑BlockClosure姹傚箋?/P>
涓嬮潰鏄被浼肩殑java鐨勭被浼間唬鐮併?/P>
1 public class abstract Boolean { 2 public static final TRUE = new True(); 3 public static final FALSE = new False(); 4 5 public abstract Object ifTrue(Block aBlock); 6 public abstract Object ifFalse(Block aBlock); 7 } 8 9 class True extends Boolean { 10 11 public Object ifTrue(Block aBlock) { 12 return aBlock.execute(); 13 }14 15 public Object ifFalse(Block aBlock) { 16 return null ; 17 }18 }19 20 class False extends Boolean { 21 22 public Object ifTrue(Block aBlock) { 23 return null ; 24 }25 26 public Object ifFalse(Block aBlock) { 27 return aBlock.execute(); 28 }29 }30
4 銆? ifTrue: [Transcript show: 'Hello']灝卞彲浠ュ搴旂炕璇戜負:
1 Boolean condition = new Integer( 4 ).isGreaterThan( new Integer( 3 )); 2 condition.ifTrue(new BlockClosure() { 3 public Object execite() { 4 System.out.println(" Hello " ); 5 return null ; 6 }7 }); 8 9
榪欎釜鐪嬩技綆鍗曠殑搴旂敤錛屽嵈甯︽潵浜嗕袱涓湁娣卞埢褰卞搷鐨勬ц川銆?/P>
絎竴錛岀敱浜巌f,else絳夌粨鏋勪笉鍐嶆槸棰勫畾涔夌殑璇硶浜嗭紝鑰屼笌鎴戜滑鑷繁鍐欑殑浠g爜涓鏍鳳紝灞炰簬鑾竴涓被鐨勭壒瀹氭秷鎭紝閭d箞涔熷氨鎰忓懗鐫錛屾垜浠彲浠ュ儚ifTrue涓鏍鳳紝瀹氫箟鑷繁鐨勫垎鏀粨鏋勩?BR>姣斿 aUser ifNotRegistered: [ do redirect to register page ] ifExpired: [ do redirect to active page ]
鍦ㄤ笉鑰冭檻鎬ц兘浼樺寲鐨勫墠鎻愪笅錛孲malltalk璁や負鍜?BR> 4 >3 ifTrue: [do something] ifFalse: [do somthing]
鏄叿鏈変竴鏍風殑璇箟鐨勩傚茍涓嶅洜涓築oolean灞炰簬Kernel灝辨湁浠涔堜笉鍚屻傚洜姝ゆ帶鍒剁粨鏋勪篃灞炰簬涓涓彲緙栫▼鐨勫洜绱狅紝榪欏氨鏄疭malltalk鐨勮交璇硶鐗規(guī)с?/P>
絎簩錛屽湪綆鍗曠殑璇硶鍜屽畬鍏ㄧ殑闈㈠悜瀵硅薄璇箟涓紝鏋勯犱笌鍐渚濇浖寮忚璦瀹屽叏絳変環(huán)鐨勮兘鍔涳紙榪欑鑳藉姏鍦ㄨ娉曚笂琛ㄧ幇涓鴻祴鍊鹼紝鍒嗘敮錛岃凱浠e拰瀛愮▼搴忚皟鐢級錛屼簬鏄垜浠彲浠ュ畬鍏ㄧ敤涓鑷寸殑闈㈠悜瀵硅薄鐨勬柟娉曟潵鏋勯犺蔣浠躲?/P>
寰堥暱涓孌墊椂闂翠互鏉ワ紝鎴戦兘璁や負闈㈠悜瀵硅薄鏂規(guī)硶璁烘槸鍦ㄥ懡浠ゅ紡鐨勫啹璇轟緷鏇煎紡璇█鐨勫熀紜涓婏紝閫氳繃寮曞叆綾誨瀷緋葷粺鐒跺悗淇慨琛ヨˉ鐨勫緱鍒扮殑錛岀敱浜庡啹璇轟緷鏇艱璦寮忕殑璇█鏄潰鍚戞搷浣滃眰闈笂鐨勶紝鍙槸涓轟簡鏇村ソ鐨勫埢鐢繪搷浣滆綆楃殑涓涓懡浠ょ殑搴忓垪錛屽洜姝ゅ啹璇█涓嶅彲閬垮厤鐨勫叿鏈変笉瀹屽鐨勮涔夛紝娣蜂貢鐨勬娊璞¤〃杈句互鍙婄瓑絳変竴緋誨垪鐨勯棶棰樸備綔涓哄啹璇█鐨勪竴涓ぇ琛ヤ竵鐨勯潰鍚戝璞℃柟娉曪紝鎴戜篃鎯沖綋鐒剁殑浠ヤ負浠栬櫧鐒舵湁浜嗕簺榪涙錛屼絾鏄熀紜闂涓婇潰榪樻槸涓嶈兘閬垮厤鐨勶紝鍔犱箣闈㈠悜瀵硅薄緙轟箯涓縐嶄竴鑷寸殑鏋勯犳柟娉曪紝寰堝鏃跺欐垜浠笉寰椾笉鍥炲綊鍒板懡浠ゅ紡鎴栬呰繃紼嬪紡鐨勬柟娉曟潵鏋勯犵郴緇燂紝浠庤岀牬鍧忔帀涓縐嶄竴鑷存竻鏅扮殑鎬濊礬錛屽湪榪囩▼鍜屽璞′箣闂翠笉浣忓湴鏉冭 錛堟瘮濡侱omain Model涔嬩簤錛夛紝榪欎釜璁╀漢闈炲父鐨勪笉鐖姐傚湪灝濊瘯浜嗕竴浜涢潰鍚戝璞¤璦涔嬪悗錛堟垜鏄湪95騫存帴瑙++鐨勬椂鍊欏紑濮嬩簡瑙i潰鍚戝璞$殑錛岃屽悗涓昏浣跨敤Java鍋氫負寮鍙戣璦錛夛紝鎴戝彂鐜拌繖涓棶棰樻槸寰堥毦閬垮厤錛屼簬鏄垜鏂█榪欐槸闈㈠悜瀵硅薄鎶鏈湰韜殑闂錛岀幇鍦ㄧ湅鏉ヤ笉榪囪嚜宸辨墍瀛︽湁闄愶紝娌℃湁鐪熸鐢ㄨ繃綰潰鍚戝璞¤璦鑰屽凡錛屾睏棰滃緱寰堝晩銆傝繖閲屽悜闈㈠悜瀵硅薄鏂規(guī)硶閬撲釜姝夛紝鍢垮樋銆?/P>
]]>
主站蜘蛛池模板:
国产成人精品日本亚洲专区 |
亚洲人成77777在线播放网站不卡 |
亚洲国产日韩a在线播放 |
亚洲美女视频免费 |
亚洲精品中文字幕无码AV |
一级毛片不卡片免费观看 |
久久久久久a亚洲欧洲aⅴ |
97在线视频免费公开视频 |
亚洲色成人中文字幕网站 |
黄网站免费在线观看 |
国产亚洲精品第一综合 |
亚洲乱亚洲乱淫久久 |
香蕉视频在线观看免费国产婷婷 |
暖暖免费在线中文日本 |
精品国产污污免费网站入口 |
福利片免费一区二区三区 |
美女黄网站人色视频免费 |
亚洲Av永久无码精品一区二区 |
亚洲色偷偷综合亚洲AV伊人蜜桃 |
亚洲天堂中文字幕在线观看 |
亚洲va成无码人在线观看 |
亚洲精品人成网在线播放影院 |
99热亚洲色精品国产88 |
亚洲heyzo专区无码综合 |
亚洲av永久无码 |
免费国产在线精品一区 |
黄网站免费在线观看 |
成人免费观看一区二区 |
成年女人看片免费视频播放器 |
日韩免费观看视频 |
国产亚洲一区区二区在线
|
亚洲成av人片在线观看天堂无码
|
国产又黄又爽胸又大免费视频 |
亚洲自偷自偷在线制服 |
久久免费线看线看 |
97se亚洲国产综合自在线 |
波多野结衣视频在线免费观看 |
3344在线看片免费 |
亚洲精品无码日韩国产不卡av |
国产亚洲精品精品国产亚洲综合
|
伊人久久五月丁香综合中文亚洲
|