锘??xml version="1.0" encoding="utf-8" standalone="yes"?>国产成人亚洲毛片,91嫩草亚洲精品,亚洲国产成人a精品不卡在线http://www.tkk7.com/raimundox/category/5762.html鐭ュぉ涔嬫墍涓猴紝鐭ヤ漢涔嬫墍涓鴻咃紝鑷崇煟銆傜煡澶╀箣鎵涓鴻咃紝澶╄岀敓涔燂紱鐭ヤ漢涔嬫墍涓鴻咃紝浠ュ叾鐭ヤ箣鎵鐭ヤ互鍏誨叾鐭ヤ箣鎵涓嶇煡錛岀粓鍏跺ぉ騫磋屼笉涓亾澶咃細(xì)鏄煡涔嬬洓涔熴?/description>zh-cnTue, 20 Apr 2010 10:10:13 GMTTue, 20 Apr 2010 10:10:13 GMT60Misquotationhttp://www.tkk7.com/raimundox/archive/2007/11/28/163761.htmlRaimundoxRaimundoxWed, 28 Nov 2007 10:08:00 GMThttp://www.tkk7.com/raimundox/archive/2007/11/28/163761.htmlhttp://www.tkk7.com/raimundox/comments/163761.htmlhttp://www.tkk7.com/raimundox/archive/2007/11/28/163761.html#Feedback1http://www.tkk7.com/raimundox/comments/commentRss/163761.htmlhttp://www.tkk7.com/raimundox/services/trackbacks/163761.html琚腑鍥戒漢璇紶浜?jiǎn)鏁板崈骞寸殑涓冨彞璇?/a>銆嬶紝棰囨湁浜涘摥絎戜笉寰楃殑鎰熸叏錛?br />
1. 榪欎簺璇濈殑紜槸琚浼犱簡(jiǎn)涓嶅亣錛屼絾鏄渶澶氫篃灝變竴鐧懼勾鍚с備腑鍥界煡璇嗗垎瀛愪笉璇誨洓涔︿簲緇忓彶瀛愰泦鐨勫潖椋庢皵澶ф姷鏄紑濮嬩簬鎵璋撶殑鏂版枃鍖栬繍鍔ㄥ惂銆傚啀寰鍓嶇殑浜猴紝瀵逛簬榪欎簺鍏哥睄瀛楀瓧鐖⒊錛屾彁浜?jiǎn)涓婂彞椹笂鑳屼笅鍙ュQ屽氨綆楁槸浠ョ珷鍙ュ紡瑙h涓轟富鐨勫畫(huà)鍏冿紝涔熶笉搴旇闅忛殢渚夸究灝辮蹇芥?zhèn)犱簡(jiǎn)锛屾洿涓嶇敤璇村弽瀵瑰畫(huà)鍎掔悊瀛﹁绌舵鏈竻婧愮殑鏄庢竻浜?jiǎn)銆?br />
2. 鍙や漢鏂珷鍙栦箟鏄竴縐嶉闆呯殑璦璋堜範(fàn)鎯紝鎵璋?#8220;闆呰█”鏄瀛楀瓧鍑哄吀鐨勶紝鏈夌偣鍍忓鏆楀彿銆傛瘮濡傛垜浠鐚窇浜?jiǎn)锛屾悂鍙や唬鎴戣偗瀹氶?#8220;璋佷箣榪囨錛?#8221;錛屽崄鏈夊叓涔?jié)浼?xì)鍥炵瓟璇達(dá)紝“璦鏄吀瀹堣呬箣榪囦篃”錛岃繖鍙ュ皠鐨勬槸“铏庡厱鍑轟簬鏌?#8221;錛屾濂藉簲鏅傜敋鑷充負(fù)浜?jiǎn)璇欒皭搴旀櫙锛屾晠鎰忔洸瑙f枃涔夌殑鎯呭喌涔熸槸寰堝父瑙佺殑銆傚鏋滀互姝や負(fù)璇佽璇紶鐨勮瘽錛屾亹鎬曞彧鑳界畻鏄墰鍤肩墶涓逛簡(jiǎn)銆傞『渚垮璇翠竴鍙ワ紝鍏跺疄榪欎釜姣涚梾鐜頒唬浜轟篃鏈夛紝涓嶈繃涓嶅啀鏄彜鏂囦簡(jiǎn)錛屽ぇ澶氭暟鏄數(shù)褰辯數(shù)瑙嗗彴璇嶏細(xì)“絀烘皵鍦ㄩⅳ鎶栦豢浣?jīng)澶┙I哄湪鐕冪儳銆傛槸鍟婏紝鏆撮闆ㄥ氨瑕佹潵浜?#8221;錛?#8220;閬撳摜錛岀墝瀛愬晩”錛?#8220;浣犵湅鎴戠殑鑻辮錛屾湁娌℃湁闀胯繘”涔嬬被鐨勶紝铏戒笉澶嶅彜闊碉紝浣嗕篃榪樼畻鏈夎叮銆?br />

P.S. : 浠婂ぉteam閲屾湁浜烘妸David Wheeler鐨勫悕璦錛岃創(chuàng)鍦ㄤ簡(jiǎn)Quote Wall涓婏細(xì)“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.


Raimundox 2007-11-28 18:08 鍙戣〃璇勮
]]>
Feng Shui for Standard ML Programmershttp://www.tkk7.com/raimundox/archive/2007/07/10/129436.htmlRaimundoxRaimundoxTue, 10 Jul 2007 13:53:00 GMThttp://www.tkk7.com/raimundox/archive/2007/07/10/129436.htmlhttp://www.tkk7.com/raimundox/comments/129436.htmlhttp://www.tkk7.com/raimundox/archive/2007/07/10/129436.html#Feedback4http://www.tkk7.com/raimundox/comments/commentRss/129436.htmlhttp://www.tkk7.com/raimundox/services/trackbacks/129436.htmlhttp://www.dcs.ed.ac.uk/home/stg/fengshui.ps.gz

浠婂ぉ鏃╀笂鎵撳紑Google Reader灝辯湅瑙佽繖涔堜竴綃囷紝鍐呭鍊掍篃緗簡(jiǎn)錛屼笉榪囨槸bad smell鐨勫彟涓涓悕瀛楄屽凡錛岀‖瑕佹壇涓婂垎姘翠篃鍙兘綆楁槸鍕夊媺寮哄己銆備笉榪囬儊闂風(fēng)殑鏄紝绔熺劧鏄釜媧嬩漢鐨勬墜絎旓紝鍥藉涓嶆槍瀹炰笉鑳戒笉浠ゆ垜杈堝績(jī)蹇у晩銆?br>
p.s. 棰勮鏈潵6涓湀鍙eご紱咃細(xì)"浣犺繖鍐欏綋蹇?jī)鍧忎簡(jiǎn)椤圭洰鐨勯姘?


Raimundox 2007-07-10 21:53 鍙戣〃璇勮
]]>
The Keyword 'end' Drives Me Crazyhttp://www.tkk7.com/raimundox/archive/2007/05/11/116864.htmlRaimundoxRaimundoxFri, 11 May 2007 12:32:00 GMThttp://www.tkk7.com/raimundox/archive/2007/05/11/116864.htmlhttp://www.tkk7.com/raimundox/comments/116864.htmlhttp://www.tkk7.com/raimundox/archive/2007/05/11/116864.html#Feedback1http://www.tkk7.com/raimundox/comments/commentRss/116864.htmlhttp://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淇濇姢妯″紡浜?..鍒氭墠榪芥眰鐭皬榪囦簡(jiǎn)澶寸殑鍚屾椂錛屽彂鐜頒簡(jiǎn)ruby bulid-in object鐨勪竴涓櫡闃?..
a = Array.new 5, []
[[],[],[],[],[]]
a[0] << 1
[[1],[1],[1],[1],[1]]

鎯充笉鍒板崕涓界殑Array鐩存帴鍋囪浼犺繘鍘葷殑閮芥槸鍊煎璞′簡(jiǎn)錛屽ソ姝規(guī)偍涔熻皟涓猟up鍟?..




Raimundox 2007-05-11 20:32 鍙戣〃璇勮
]]>
Church Numberhttp://www.tkk7.com/raimundox/archive/2006/10/09/73931.htmlRaimundoxRaimundoxSun, 08 Oct 2006 18:32:00 GMThttp://www.tkk7.com/raimundox/archive/2006/10/09/73931.htmlhttp://www.tkk7.com/raimundox/comments/73931.htmlhttp://www.tkk7.com/raimundox/archive/2006/10/09/73931.html#Feedback2http://www.tkk7.com/raimundox/comments/commentRss/73931.htmlhttp://www.tkk7.com/raimundox/services/trackbacks/73931.html
姣忎釜Church number閮芥槸涓涓帴鍙椾袱涓弬鏁扮殑鍑芥暟錛岃繖涓や釜鍙傛暟鍙堥兘鏄嚱鏁幫紝絎竴涓弬鏁扮О涓哄悗緇у嚱鏁幫紝絎簩涓弬鏁板垯鍙仛闆剁偣鍑芥暟銆備緷鎹繖涓や釜鍑芥暟錛屾垜浠彲浠ュ畾涔塁hurch number zero, one, two錛?br />
(define zero聽(tīng) (lambda (successor聽(tīng)zero)聽(tīng)zero))
(define one 錛坙ambda (successor聽(tīng)zero)聽(tīng)(successor聽(tīng)zero)))
(define two聽(tīng)聽(tīng) (lambda (successor聽(tīng)zero)聽(tīng)(successor聽(tīng)(successor聽(tīng)zero))))

鍙互鐪嬪嚭錛屾墍璋搊ne灝辨槸瀵歸浂鐐瑰嚱鏁板簲鐢ㄤ竴嬈″悗緇у嚱鏁幫紝鑰宼wo鍒欐槸瀵歸浂鐐瑰嚱鏁板簲鐢ㄥ悗緇у嚱鏁扮殑緇撴灉鍐嶆搴旂敤鍚庣戶鍑芥暟錛屼緷嬈$被鎺ㄥ彲浠ュ緱鍒癈hurch Number n銆備笅闈㈡垜浠彲浠ラ氳繃鍚庣戶鍑芥暟increase鍜岄浂鐐瑰嚱鏁癴(x) = 0鏉ョ湅鐪嬭繖浜汣hurch Number鐨勮綆楃粨鏋滐細(xì)

(define聽(tīng)(increase聽(tīng)x)聽(tīng)(+聽(tīng)x聽(tīng)1))

(zero increase 0)
> 0
(one increase 0)
>1
(two increase 0)
>2

an approximate Java version:

public interface Function<T> {
聽(tīng)聽(tīng)聽(tīng) T apply(Object... parameters);
}

public interface ChurchNumber {
聽(tīng)聽(tīng)聽(tīng) Integer apply(Function<Integer> successor, Function<Integer> zero);
}

ChurchNumber zero = new ChurchNumber() {
聽(tīng)聽(tīng) public Integer apply(Function<Integer> successor,聽(tīng) Function<Integer> zero) {
聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng) return zero.apply();
聽(tīng)聽(tīng) }
};

ChurchNumber one = new ChurchNumber() {
聽(tīng)聽(tīng) public Integer apply(Function<Integer> successor, Function<Integer> zero) {
聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng) return successor.apply(zero);
聽(tīng)聽(tīng) }
};

ChurchNumber two = new ChurchNumber() {
聽(tīng)聽(tīng) public Integer apply(Function<Integer> successor, Function<Integer> zero) {
聽(tīng) 聽(tīng) 聽(tīng) return successor.apply(successor.apply(zero));
聽(tīng)聽(tīng) }
};

Function increase = new Function<Integer>() {
聽(tīng)public Integer apply(Object... parameters) {
聽(tīng)聽(tīng) if (parameters[0] instanceof Function) {
聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng) return ((Function<Integer>) parameters[0]).apply() + 1;
聽(tīng)聽(tīng) }
聽(tīng)聽(tīng) return (Integer) parameters[0] + 1;
聽(tīng)}
};

Function numberZero = new Function<Integer>() {
聽(tīng)聽(tīng) 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

瀹氫箟浜?jiǎn)Church number鍚庯紝鎴戜滑緇х畫(huà)瀹氫箟Church number涓婄殑榪愮畻錛岄鍏堟槸澧炲姞1錛?br />
(define聽(tīng)(inc聽(tīng)x)聽(tīng)(lambda (successor聽(tīng)zero) (successor (x successor zero))))

(define three (inc two))
(three increase 0)
>3

an approximate Java version:

static ChurchNumber inc(final ChurchNumber churchNumber) {
聽(tīng)聽(tīng) return new ChurchNumber() {
聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng) public Integer apply(Function<Integer> successor, Function<Integer> zero) {
聽(tīng)聽(tīng)聽(tīng) 聽(tīng)聽(tīng)聽(tīng)聽(tīng) return successor.apply(churchNumber.apply(successor, zero));
聽(tīng)聽(tīng)聽(tīng) 聽(tīng)聽(tīng) }
聽(tīng)聽(tīng) };
}

ChurchNumber three = inc(two);
System.out.println(three.apply(increase, numberZero));
>3

鐒跺悗鏄姞娉曪細(xì)

(define聽(tīng)(add聽(tīng)x y)聽(tīng)(lambda (successor聽(tīng)zero)聽(tīng) (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) {
聽(tīng)聽(tīng)聽(tīng) 聽(tīng)聽(tīng)聽(tīng) return new ChurchNumber() {
聽(tīng)聽(tīng)聽(tīng) 聽(tīng)聽(tīng)聽(tīng) 聽(tīng)聽(tīng)聽(tīng) public Integer apply(final Function<Integer> successor,
聽(tīng)聽(tīng)聽(tīng) 聽(tīng)聽(tīng)聽(tīng) 聽(tīng)聽(tīng)聽(tīng) 聽(tīng)聽(tīng)聽(tīng) 聽(tīng)聽(tīng)聽(tīng) final Function<Integer> zero) {
聽(tīng)聽(tīng)聽(tīng) 聽(tīng)聽(tīng)聽(tīng) 聽(tīng)聽(tīng)聽(tīng) 聽(tīng)聽(tīng)聽(tīng) return x.apply(successor, new Function<Integer>() {
聽(tīng)聽(tīng)聽(tīng) 聽(tīng)聽(tīng)聽(tīng) 聽(tīng)聽(tīng)聽(tīng) 聽(tīng)聽(tīng)聽(tīng) 聽(tīng)聽(tīng)聽(tīng) public Integer apply(Object... parameters) {
聽(tīng)聽(tīng)聽(tīng) 聽(tīng)聽(tīng)聽(tīng) 聽(tīng)聽(tīng)聽(tīng) 聽(tīng)聽(tīng)聽(tīng) 聽(tīng)聽(tīng)聽(tīng) 聽(tīng)聽(tīng)聽(tīng) return y.apply(successor, zero);
聽(tīng)聽(tīng)聽(tīng) 聽(tīng)聽(tīng)聽(tīng) 聽(tīng)聽(tīng)聽(tīng) 聽(tīng)聽(tīng)聽(tīng) 聽(tīng)聽(tīng)聽(tīng) }
聽(tīng)聽(tīng)聽(tīng) 聽(tīng)聽(tīng)聽(tīng) 聽(tīng)聽(tīng)聽(tīng) 聽(tīng)聽(tīng)聽(tīng) });
聽(tīng)聽(tīng)聽(tīng) 聽(tīng)聽(tīng)聽(tīng) 聽(tīng)聽(tīng)聽(tīng) }
聽(tīng)聽(tīng)聽(tīng) 聽(tīng)聽(tīng)聽(tīng) };
}

ChurchNumber five = add(two, three);
System.out.println(five.apply(increase, numberZero));
>5

鏈鍚庢槸涔樻硶錛?br />
(define聽(tīng)(multiply聽(tīng)x聽(tīng)y) (lambda (successor聽(tīng)zero)聽(tīng) (x聽(tīng) (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) {
聽(tīng)聽(tīng)聽(tīng) 聽(tīng)聽(tīng)聽(tīng) return new ChurchNumber() {
聽(tīng)聽(tīng)聽(tīng) 聽(tīng)聽(tīng)聽(tīng) 聽(tīng)聽(tīng)聽(tīng) public Integer apply(final Function<Integer> successor,
聽(tīng)聽(tīng)聽(tīng) 聽(tīng)聽(tīng)聽(tīng) 聽(tīng)聽(tīng)聽(tīng) 聽(tīng)聽(tīng)聽(tīng) 聽(tīng)聽(tīng)聽(tīng) Function<Integer> zero) {
聽(tīng)聽(tīng)聽(tīng) 聽(tīng)聽(tīng)聽(tīng) 聽(tīng)聽(tīng)聽(tīng) 聽(tīng)聽(tīng)聽(tīng) return x.apply(new Function<Integer>() {
聽(tīng)聽(tīng)聽(tīng) 聽(tīng)聽(tīng)聽(tīng) 聽(tīng)聽(tīng)聽(tīng) 聽(tīng)聽(tīng)聽(tīng) 聽(tīng)聽(tīng)聽(tīng) public Integer apply(final Object... parameters) {
聽(tīng)聽(tīng)聽(tīng) 聽(tīng)聽(tīng)聽(tīng) 聽(tīng)聽(tīng)聽(tīng) 聽(tīng)聽(tīng)聽(tīng) 聽(tīng)聽(tīng)聽(tīng) 聽(tīng)聽(tīng)聽(tīng) return y.apply(successor, new Function<Integer>() {
聽(tīng)聽(tīng)聽(tīng) 聽(tīng)聽(tīng)聽(tīng) 聽(tīng)聽(tīng)聽(tīng) 聽(tīng)聽(tīng)聽(tīng) 聽(tīng)聽(tīng)聽(tīng) 聽(tīng)聽(tīng)聽(tīng) 聽(tīng)聽(tīng)聽(tīng) public Integer apply(Object... ignoredParameters) {
聽(tīng)聽(tīng)聽(tīng) 聽(tīng)聽(tīng)聽(tīng) 聽(tīng)聽(tīng)聽(tīng) 聽(tīng)聽(tīng)聽(tīng) 聽(tīng)聽(tīng)聽(tīng) 聽(tīng)聽(tīng)聽(tīng) 聽(tīng)聽(tīng)聽(tīng) 聽(tīng)聽(tīng)聽(tīng) if (parameters[0] instanceof Function) {
聽(tīng)聽(tīng)聽(tīng) 聽(tīng)聽(tīng)聽(tīng) 聽(tīng)聽(tīng)聽(tīng) 聽(tīng)聽(tīng)聽(tīng) 聽(tīng)聽(tīng)聽(tīng) 聽(tīng)聽(tīng)聽(tīng) 聽(tīng)聽(tīng)聽(tīng) 聽(tīng)聽(tīng)聽(tīng) 聽(tīng)聽(tīng)聽(tīng) return ((Function<Integer>) parameters[0]).apply();
聽(tīng)聽(tīng)聽(tīng) 聽(tīng)聽(tīng)聽(tīng) 聽(tīng)聽(tīng)聽(tīng) 聽(tīng)聽(tīng)聽(tīng) 聽(tīng)聽(tīng)聽(tīng) 聽(tīng)聽(tīng)聽(tīng) 聽(tīng)聽(tīng)聽(tīng) 聽(tīng)聽(tīng)聽(tīng) }
聽(tīng)聽(tīng)聽(tīng) 聽(tīng)聽(tīng)聽(tīng) 聽(tīng)聽(tīng)聽(tīng) 聽(tīng)聽(tīng)聽(tīng) 聽(tīng)聽(tīng)聽(tīng) 聽(tīng)聽(tīng)聽(tīng) 聽(tīng)聽(tīng)聽(tīng) 聽(tīng)聽(tīng)聽(tīng) return (Integer) parameters[0];
聽(tīng)聽(tīng)聽(tīng) 聽(tīng)聽(tīng)聽(tīng) 聽(tīng)聽(tīng)聽(tīng) 聽(tīng)聽(tīng)聽(tīng) 聽(tīng)聽(tīng)聽(tīng) 聽(tīng)聽(tīng)聽(tīng) 聽(tīng)聽(tīng)聽(tīng) }
聽(tīng)聽(tīng)聽(tīng) 聽(tīng)聽(tīng)聽(tīng) 聽(tīng)聽(tīng)聽(tīng) 聽(tīng)聽(tīng)聽(tīng) 聽(tīng)聽(tīng)聽(tīng) 聽(tīng)聽(tīng)聽(tīng) });
聽(tīng)聽(tīng)聽(tīng) 聽(tīng)聽(tīng)聽(tīng) 聽(tīng)聽(tīng)聽(tīng) 聽(tīng)聽(tīng)聽(tīng) 聽(tīng)聽(tīng)聽(tīng) }
聽(tīng)聽(tīng)聽(tīng) 聽(tīng)聽(tīng)聽(tīng) 聽(tīng)聽(tīng)聽(tīng) 聽(tīng)聽(tīng)聽(tīng) }, zero);
聽(tīng)聽(tīng)聽(tīng) 聽(tīng)聽(tīng)聽(tīng) 聽(tīng)聽(tīng)聽(tīng) }
聽(tīng)聽(tīng)聽(tīng) 聽(tīng)聽(tīng)聽(tīng) };
}

ChurchNumber four = multiply(two, two);
System.out.println(four.apply(increase, numberZero));

娌℃湁鍑忔硶鍜岄櫎娉曪紝Church褰撳勾鍙戞槑榪欏涓滆タ鐨勬椂鍊欏氨娌℃湁銆傚師鍥犳槸闈炲父鏄庢樉鐨?..鍥犳Church number鍙湁鍚庣戶鍑芥暟錛岃屾病鏈夊墠椹卞嚱鏁般備篃灝辨槸璇碈hurch number鍙兘寰鍓嶆暟...涓嶈兘鏈涘悗鏁?..鑷劧涓嶅彲鑳戒綔鍑哄噺娉曞拰闄ゆ硶浜?jiǎn)銆傚綋鐒舵墿灞曚竴涓嬩篃鏄潪甯稿鏄撶殑錛?br />
(define聽(tīng)negative-one聽(tīng)(lambda聽(tīng)(successor聽(tīng)precursor聽(tīng)zero)聽(tīng)(precursor聽(tīng)zero)))
(define聽(tīng)one聽(tīng)(lambda聽(tīng)(successor聽(tīng)precursor聽(tīng)zero)聽(tīng)(successor聽(tīng)zero)))

(define聽(tīng)(add聽(tīng)x聽(tīng)y)聽(tīng)(lambda聽(tīng)(successor聽(tīng)precursor聽(tīng)zero)聽(tīng)(x聽(tīng)successor聽(tīng)precursor聽(tīng)(聽(tīng)y聽(tīng)successor聽(tīng)precursor聽(tīng)zero)聽(tīng))))

(define聽(tīng)(inc聽(tīng)x)聽(tīng)(
+聽(tīng)x聽(tīng)1))
(define聽(tīng)(dec聽(tīng)x)聽(tīng)(
-聽(tīng)x聽(tīng)1))

(define聽(tīng)zero聽(tīng)(add聽(tīng)one聽(tīng)negative
-one))

(zero聽(tīng)inc聽(tīng)dec聽(tīng)
0)
>0


whl鍚屽闂繖鏍瘋兘涓嶈兘瀹炵幇嫻偣錛岀瓟妗堟槸鍙互瀹炵幇鏈夐檺綺懼害鐨勬誕鐐規(guī)暟....鍥犱負(fù)鎸夌収榪欎釜鎬濊礬鍙戝睍涓嬪幓錛屾垜浠畾涔夋誕鐐圭殑successor鍜宲recursor鍑芥暟鍙兘鍦ㄦ湁闄愮殑浣嶆暟涔嬪唴...褰撶劧鏈変簡(jiǎn)one,zero鍐嶇粨鍚坧air錛屾ā鎷?/1瀛樺偍瀹炵幇嫻偣涔熶笉鏄笉鍙兘鐨勪簨鎯?..

Raimundox 2006-10-09 02:32 鍙戣〃璇勮
]]>
Selenium Better Praticehttp://www.tkk7.com/raimundox/archive/2006/08/04/61860.htmlRaimundoxRaimundoxFri, 04 Aug 2006 13:59:00 GMThttp://www.tkk7.com/raimundox/archive/2006/08/04/61860.htmlhttp://www.tkk7.com/raimundox/comments/61860.htmlhttp://www.tkk7.com/raimundox/archive/2006/08/04/61860.html#Feedback11http://www.tkk7.com/raimundox/comments/commentRss/61860.htmlhttp://www.tkk7.com/raimundox/services/trackbacks/61860.html1. Never use Selenium FIT mode

Selenium鍒嗕負(fù)涓ょ榪愯妯″紡錛孌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>

聽(tīng)1 < table >
聽(tīng)2 < tr >
聽(tīng)3 聽(tīng) < td > open </ td >
聽(tīng)4 聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng) < td > http://localhost:8080/login </ td >
聽(tīng)5 聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng) < td ></ td >
聽(tīng)6 </ tr >
聽(tīng)7 < tr >
聽(tīng)8 聽(tīng) < td > type </ td >
聽(tīng)9 聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng) < td > id=username </ td >
10 聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng) < td > someuser </ td >
11 </ tr >
12 < tr >
13 聽(tīng) < td > type </ td >
14 聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng) < td > id=password </ td >
15 聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng) < td > password </ td >
16 </ tr >
17 < tr >
18 聽(tīng) < td > click </ td >
19 聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng) < td > id=login_button </ td >
20 聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng) < td ></ td >
21 </ tr >
22 < tr >
23 聽(tīng) < td > assertTextPresent </ td >
24 聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng) < td > Welcome聽(tīng)to聽(tīng)xxxx </ td >
25 聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng) < td ></ td >
26 </ tr >
27 </ table >

涓嶅悓浜嶧IT錛孲elenium鍐呯疆浜?jiǎn)涓緋誨垪鐨勫懡浠わ紝濡備笂渚嬩腑鐨刼pen, type, click浠ュ強(qiáng)assertTextPresent錛屽洜姝A鍙互瀹屽叏鎶涘紑DEV鐙珛鍦扮紪鍐欐祴璇?FIT闇瑕丏EV鎻愪緵Behavior Fixture)銆傚洜姝IT Mode鏄浉褰撳鏄撲嬌鐢ㄧ殑錛屽摢鎬曚笉浼?xì)鋴社敤HTML鐨凲A錛屼篃鍙互浣跨敤FrontPage鐢誨嚭涓夊垪琛ㄦ牸錛屼緷嬈″~鍏ユ暟鎹?/p>

鐒惰屽浜庡ぇ澶氭暟team鑰岃█鈥斺斿挨鍏舵槸鏁忔嵎team錛孎IT Mode騫蟲(chóng)槗鐨勫琛ㄤ笅鏄護(hù)浜烘亹鎯х殑娉ユ布銆傚ぇ澶氭暟鍥㈤槦寰寰閫夋嫨浣跨敤Selenium浣滀負(fù)鍔熻兘嫻嬭瘯鍜岄泦鎴愭祴璇曞伐鍏瘋(gè)屼笉浠呬粎鏄疩A嫻嬭瘯宸ュ叿錛屽湪涓嶅悓鐨勮凱浠i棿閬囧埌鍔熻兘嫻佺▼鎴朥I鍙樺寲鏃訛紝蹇呴』瑕侀噸鏋凷elenium嫻嬭瘯錛屾垨鑰呰錛孎unctional Test Migration銆備護(hù)浜洪仐鎲劇殑鏄紝HTML based鐨凷elenium FIT Testing鐨勯噸鏋勭珶鐒朵護(hù)浜洪毦浠ョ疆淇$殑鍥伴毦銆傛垜浠彲浠ヤ嬌鐢╥nclude絳塖elenium FIT鎵╁睍錛屼嬌寰楀畠鍙互閲嶇敤璇︾粏鐨勫姛鑳斤紙Log in錛?Log out璇稿姝ょ被錛夈傚嵆渚垮姝わ紝鍦ㄤ竴涓湡瀹炵殑欏圭洰涓紝Selenium Test鐨勬暟閲忓線寰鍦?00-500涔嬮棿(鎴戠洰鍓嶆墍澶勭殑欏圭洰鍦ㄦ敼鐢―riven Mode鍓嶅凡杈?50+)錛屽浜庤繖涔堝ぇ鍩烘暟鐨凷elenium嫻嬭瘯錛屾墜宸ラ噸鏋勫嚑涔庢槸涓嶅彲鎯寵薄鐨勶紝鑰岀洰鍓嶅皻娌℃湁HTML浠g爜閲嶆瀯宸ュ叿銆傚嵆渚垮瓨鍦ㄦ硾娉涙剰涔変笂鐨凥TML閲嶆瀯宸ュ叿錛屽浜嶴elenium嫻嬭瘯閲嶆瀯鐨勬湁鏁堟у皻寰呭晢姒楓傝屼嬌鐢―riven Mode涓婅堪浠g爜鍙互鍐欎負(fù):

1 public 聽(tīng) void 聽(tīng)testShouldShowAWeclomeMessageAfterUserLoggedIn()聽(tīng) {
2 聽(tīng)聽(tīng)聽(tīng)聽(tīng)selenium.open( " http://localhost:8080/login " );
3 聽(tīng)聽(tīng)聽(tīng)聽(tīng)selenium.type( " id=username " , " someuser " );
4 聽(tīng)聽(tīng)聽(tīng)聽(tīng)selenium.type( " id=password " ,聽(tīng) " password " );
5 聽(tīng)聽(tīng)聽(tīng)聽(tīng)selenium.click( " id=login_button " );
6 聽(tīng)聽(tīng)聽(tīng)聽(tīng)assertTrue(selenium.isTextPresent( " Welcome聽(tīng)to聽(tīng)xxxx " ));
7 }


寰堣嚜鐒?dòng)灱屼竴涓緇冩湁绱犵殑紼嬪簭鍛樹(shù)細(xì)閲嶆瀯鍑哄涓嬩唬鐮?

聽(tīng)1 public 聽(tīng) void 聽(tīng)login(String聽(tīng)username,聽(tīng)String聽(tīng)password)聽(tīng) {
聽(tīng)2 聽(tīng)聽(tīng)聽(tīng)聽(tīng)selenium.open( " http://localhost:8080/login " );
聽(tīng)3 聽(tīng)聽(tīng)聽(tīng)聽(tīng)selenium.type( " id=username " ,username);
聽(tīng)4 聽(tīng)聽(tīng)聽(tīng)聽(tīng)selenium.type( " id=password " ,聽(tīng)password);
聽(tīng)5 聽(tīng)聽(tīng)聽(tīng)聽(tīng)selenium.click( " id=login_button " );聽(tīng)
聽(tīng)6 }

聽(tīng)7
聽(tīng)8 public 聽(tīng) void 聽(tīng)testShouldShowAWeclomeMessageAfterUserLoggedIn()聽(tīng) {
聽(tīng)9 聽(tīng)聽(tīng)聽(tīng)聽(tīng)login( " someuser " ,聽(tīng) " password " );
10 聽(tīng)聽(tīng)聽(tīng)聽(tīng)assertTrue(selenium.isTextPresent( " Welcome聽(tīng)to聽(tīng)xxxx " ));
11 }

涔嬪悗鏃犺鏄痯ull up鍒板叕鍏卞熀綾昏繕鏄痚xtact鍒癠tils class閮芥槸寰堝鏄撶殑浜嬫儏銆傜敱浜嶫ava鍦ㄤ唬鐮侀噸鏋勪笂渚垮埄錛孞ava Selenium Remote Control鎴愪負(fù)浣跨敤Selenium鐨勬渶浣蟲(chóng)柟寮忋傚湪榪欎竴鐐逛笂錛岀旱浣縍uby璇硶涓婃瘮Java綆鍗曠伒媧誨緱澶氾紝瀹冧粛涓嶆槸緙栧啓Selenium嫻嬭瘯鐨勬渶浣寵澆浣?褰撶劧涓涓粡榪囩簿蹇?jī)璁捐鐨剅uby selenium dsl wrapper榪樻槸鍏鋒湁闈炲嚒鐨勪環(huán)鍊肩殑錛岃繖涓垜浠悗闈細(xì)娑夊強(qiáng)鍒?銆?/p>

2. Using the name user, system, page instead of selenium

瑙傚療涓婇潰鎻愬埌鐨勪唬鐮侊紝鍏朵腑浣跨敤selenium鏉ユ搷綰祑eb搴旂敤鐨勮涓猴紝榪欏湪Remote Control閲屾槸甯歌鐨勫仛娉曪紝浣嗘槸浠嶇劧涓嶅濂斤紝鎴戜滑鍙互鍋氫竴浜涘皬鐨勫彉鍖栦互寰楀埌鏇村ソ鐨勬祴璇?

聽(tīng)1 protected 聽(tīng) void 聽(tīng)setup()聽(tīng) {
聽(tīng)2 聽(tīng)聽(tīng)聽(tīng)聽(tīng)selenium聽(tīng) = 聽(tīng)聽(tīng) // 聽(tīng)intialize聽(tīng)selenium聽(tīng)instance
聽(tīng)3 聽(tīng)聽(tīng)聽(tīng)聽(tīng)user聽(tīng) = 聽(tīng)selenium;
聽(tīng)4 聽(tīng)聽(tīng)聽(tīng)聽(tīng)currentPage聽(tīng) = 聽(tīng)selenium;
聽(tīng)5 }

聽(tīng)6
聽(tīng)7 public 聽(tīng) void 聽(tīng)login(String聽(tīng)username,聽(tīng)String聽(tīng)password)聽(tīng) {
聽(tīng)8 聽(tīng)聽(tīng)聽(tīng)聽(tīng)user.open( " http://localhost:8080/login " );
聽(tīng)9 聽(tīng)聽(tīng)聽(tīng)聽(tīng)user.type( " id=username " ,username);
10 聽(tīng)聽(tīng)聽(tīng)聽(tīng)user.type( " id=password " ,聽(tīng)password);
11 聽(tīng)聽(tīng)聽(tīng)聽(tīng)user.click( " id=login_button " );聽(tīng)
12 }

13
14 public 聽(tīng) void 聽(tīng)testShouldShowAWeclomeMessageAfterUserLoggedIn()聽(tīng) {
15 聽(tīng)聽(tīng)聽(tīng)聽(tīng)login( " some聽(tīng)guy " ,聽(tīng) " password " );
16 聽(tīng)聽(tīng)聽(tīng)聽(tīng)assertTrue(currentPage.isTextPresent( " Welcome聽(tīng)to聽(tīng)xxxx " ));
17 }

鍩烘湰涓婅繖鍙笉榪囨槸"鍙︿竴縐嶅啓娉?鑰屽凡錛屼絾鏄畠鏇村ソ鐨勮〃杈句簡(jiǎn)"鐢ㄦ埛鐨勮涓?錛屽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涓嬬殑鍛戒護(hù)鏈変簺璁稿樊寮傦紝姣斿FIT涓殑assertTextPresent錛屽湪RC涓彉鎴愪簡(jiǎn)isTextPresent銆傚悓鏍瘋繕鏈塅IT涓渶瀹炵敤鐨勫懡浠lickAndWait錛屽湪RC涓彉鎴愪簡(jiǎn)click鍜寃aitForPageToLoad銆傚湪RC涓嬌鐢‵IT mode涓殑鍛戒護(hù)涔熼潪闅句簨錛屾壘鍒癱om.thoughtworks.selenium.Selenium錛屾坊鍔犳柟娉?

public 聽(tīng) void 聽(tīng)doCommand(String聽(tīng)commmand,聽(tīng)String聽(tīng)parameters);

鐒跺悗鍦╟om.thoughtworks.selenium.DefaultSelenium涓坊鍔犲疄鐜?

1 public 聽(tīng) void 聽(tīng)doCommand(String聽(tīng)commmand,聽(tīng)String聽(tīng)parameters)聽(tīng) {
2 聽(tīng)聽(tīng)聽(tīng)String[]聽(tīng)paras聽(tīng) = 聽(tīng) new 聽(tīng)String[] { "" , "" , "" }
3 聽(tīng)聽(tīng)聽(tīng) for 聽(tīng)( int 聽(tīng)i聽(tīng) = 聽(tīng) 0 ;聽(tīng)i聽(tīng) < 聽(tīng)parameters.length聽(tīng) && 聽(tīng)i聽(tīng) < 聽(tīng) 3 ;聽(tīng)i ++ )
4 聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)聽(tīng)paras[i]聽(tīng) = 聽(tīng)parameters[i];
5 聽(tīng)聽(tīng)聽(tīng)commandProcessor.doCommand(command,聽(tīng)paras);
6 }

鐒跺悗璇曢獙涓涓?

selenium.doCommand( " clickAndWait " );

鍦ㄦ垜浠嬌鐢ㄧ函RC mode涔嬪墠鏇劇粡鐢ㄨ繃涓孌典腑闂存柟妗堬紝灝唕c code杞寲涓篺it code鏉ヨ窇(鍥犱負(fù)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銆傚綋鐒?dòng)灱屾渶甯屾湜鐨勮繕鏄境媧茬殑鍚屼簨鍙互鏃╂棩鍦╯elenium閲屾彁渚沨ttps鏀寔銆?br />



Raimundox 2006-08-04 21:59 鍙戣〃璇勮
]]>
ANTLR Lexer Tipshttp://www.tkk7.com/raimundox/archive/2006/03/27/37605.htmlRaimundoxRaimundoxMon, 27 Mar 2006 06:44:00 GMThttp://www.tkk7.com/raimundox/archive/2006/03/27/37605.htmlhttp://www.tkk7.com/raimundox/comments/37605.htmlhttp://www.tkk7.com/raimundox/archive/2006/03/27/37605.html#Feedback4http://www.tkk7.com/raimundox/comments/commentRss/37605.htmlhttp://www.tkk7.com/raimundox/services/trackbacks/37605.html闃呰鍏ㄦ枃

Raimundox 2006-03-27 14:44 鍙戣〃璇勮
]]>
A Patch for Ruby Watir Test Frameworkhttp://www.tkk7.com/raimundox/archive/2006/01/11/27549.htmlRaimundoxRaimundoxWed, 11 Jan 2006 03:30:00 GMThttp://www.tkk7.com/raimundox/archive/2006/01/11/27549.htmlhttp://www.tkk7.com/raimundox/comments/27549.htmlhttp://www.tkk7.com/raimundox/archive/2006/01/11/27549.html#Feedback2http://www.tkk7.com/raimundox/comments/commentRss/27549.htmlhttp://www.tkk7.com/raimundox/services/trackbacks/27549.html
Beauty is the first test: there is no permanent place in this world for ugly mathematics.

鎰熷姩浜?jiǎn)鎴戝ソ涔呫傜幇鍦ㄦ崲涓娉曪細(xì)

Beauty is the first test: there is no permanent place in this world for ugly hack code.

榪欎釜闂?shù)篃涓嶅お闅惧嚭鐞嗗Q宺uby浣滀負(fù)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鏀逛竴涓嬶細(xì)

1 characters_in(value) {|c| 
2   sleep @ieController.typingspeed
3   @o.value = @o.value.to_s + c
4   fire_key_events}

鎼炲畾錛佷絾鏄繕鏄緢涓戯紝鐩存帴鎶婂埆浜虹殑code鏀逛簡(jiǎn)錛宑ontributing to eclipse閲岃瑕乧ontribute涓嶈闅忎究change鍒漢鐨勪唬鐮併傚ソ鍚э紝濂藉湪ruby鎵╁睍璧鋒潵涔熶笉闅撅細(xì)

 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

嫻嬭瘯涓涓嬶細(xì)

require 'watir-cn'

ie 
= Watir::Cn::IE.start('http://www.google.com')
ie.text_field(:name, 
'q').set('Ruby Watir 鍔熻兘嫻嬭瘯'

鎴愬姛銆傛渶鍚庝竴姝ユ槸璐$尞紺懼尯錛岀洿鎺ョ櫥鍒皉ubyforge錛屾壘鍒癢atir鐒跺悗submit浜?jiǎn)涓や釜patch錛氫竴涓洿鎺ヤ慨鏀箇atir搴撶殑涓涓槸鐙珛鐨剋atir-cn鐨勩傛帹鑽愬ぇ瀹朵嬌鐢ㄧ浜屼釜鐨刾atch銆傚湴鍧鍦細(xì)http://rubyforge.org/tracker/index.php?func=detail&aid=3232&group_id=104&atid=489


Raimundox 2006-01-11 11:30 鍙戣〃璇勮
]]>
A Day of Two Pragmatic Programmers' Lifehttp://www.tkk7.com/raimundox/archive/2006/01/10/27469.htmlRaimundoxRaimundoxTue, 10 Jan 2006 13:30:00 GMThttp://www.tkk7.com/raimundox/archive/2006/01/10/27469.htmlhttp://www.tkk7.com/raimundox/comments/27469.htmlhttp://www.tkk7.com/raimundox/archive/2006/01/10/27469.html#Feedback9http://www.tkk7.com/raimundox/comments/commentRss/27469.htmlhttp://www.tkk7.com/raimundox/services/trackbacks/27469.html瑙e喅榪欎釜闂鏈鐩存帴鐨勫仛娉曪紝灝辨槸login鍒癝SO騫沖彴涓婏紝鐒跺悗涓涓敤鎴蜂竴涓敤鎴風(fēng)殑search錛宻earch瀹屼簡(jiǎn)鍐嶇敤OA Admin鐧婚檰鏌A甯愭埛銆傛垜浠槸pragmatic programmer鍢涳紝榪欎箞綣佺悙鐨勬椿鍔ㄨ嚜鐒跺啓紼嬪簭鎼炲畾瀹冦傝嚜鐒舵誕鐜頒袱涓夋嫨錛歊uby Watri錛岃繕鏈夊氨鏄駭鑷亢浠叕鍙哥殑Selenium Script銆?BR>涓婃潵鍏堢敤Ruby Watri錛岃繖涓笢瑗垮ソ鍟婏紝綆鍗曞晩銆俉PC鎵句簡(jiǎn)涓涓互鍓嶅啓鐨別xample, 鎴戠収鐫鏀逛簡(jiǎn)涓涓敤鎴風(fēng)殑search錛岀劧鍚庢墿灞曪細(xì)
 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浜?jiǎn)涓涓嬶紝鐒跺悗娌℃湁瀛?..闅鵑亾鏄紪鐮侀棶棰橈紵鎹簡(jiǎn)encoding閲嶆柊save浜?jiǎn)涓鎶婏紝緇撴灉涓鏍楓傞儊闂?..浜庢槸鎴戝拰W(xué)PC鎯蟲(chóng)硶鏄?..Ruby涓枃鏈夐棶棰橈紝涓嶇浜?jiǎn)鏃堕棿绱q紝鎹elenium Test錛岃嚜瀹剁殑涓滆タ鍢涖備絾鏄疭elenium鐨凷cript鏄疕TML-based鐨勶紝鍐欒搗鏉ュお楹葷儲(chǔ)銆傛垜浠槸pragmatic programmer鍢涳紝榪欎箞綣佺悙鐨勬椿鍔ㄨ嚜鐒跺啓紼嬪簭鎼炲畾瀹冦備簬鏄垜鏉ユ悶涓涓猄criptGenerator錛學(xué)PC鍚屽織鎼瀞cript template銆備竴鎼瀟emplate WPC鍚屽織灝辨瘮杈冨叴濂嬶紝澶у枈:velocity錛?velocity錛佸搸錛屾垜鏈哄櫒涓婃病鏈塿elocity鐨刲ibrary錛屼簬鏄垜鍐沖畾pragmatic涓鎶婏紝鐩存帴writer output銆傛壘浜?jiǎn)涓涓猄elenume Script Demo錛屽湪姣忚鍓嶉潰鍔犱笂aaaa,姣忚鏈熬鍔犱笂bbb錛岀劧鍚巆trl + f,aaa->writer.write(" bbb->"); 鏀瑰嚑涓?錛宨ntroduce parameter, extract method, compose method椋炲揩鍦伴噸鏋勪箣錛屼竴涓猦ard code鐨刧enerator寮曟搸璇炵敓浜?jiǎn)銆俉PC榪樺湪璋僼emplate錛屾垜鐪嬩簡(jiǎn)涓涓嬩唬鐮侊紝铔畊gly鐨勶紝refactory涔嬶細(xì)
 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     }

涓涓嬪瓙灝戜簡(jiǎn)鏃犳暟浠g爜錛岀埥澶氫簡(jiǎn)銆傜劧鍚巜pc涔熸悶濂戒簡(jiǎn)template錛屾寜妯$増鏂囦歡涓generating錛屽嚑鍗佷釜selenium test script灝卞嚭鐜頒簡(jiǎn)銆傚棷錛寃rite program that write program錛屾湁澶焢ragmatic銆?BR>
鍐欎簡(jiǎn)涓涓猅est Suite錛屾斁鍒版敼涓涓婼elenium Runner涓嬭窇涓涓嬪張鍌?cè)潨间簡(jiǎn)銆係elenium鍋氱殑Functional Test錛屼竴鑸亣瀹氬拰琚祴鐨勫簲鐢ㄥ湪涓涓猆RL base閲岋紝鍥犳榪欐牱local鈥滄祴鈥漴emoting灝變笉澶ソ錛岃屼笖鎴戜滑鍙堟槸涓涓畨鍏ㄥ鉤鍙幫紝URL base鍋氬畨鍏ㄥ熀鍑嗙殑銆備竴涓嬪氨鎵鏈夋祴璇曞氨crackdown鍦ㄨ繖閲屼簡(jiǎn)銆傞儊闂峰晩...
Selenium鏂囨。錛屽彂鐜板彲浠ョ敤driver鏉dpater local鍜宺emoting鐨勭幆澧冿紝闂鏄繖涓猟rvier瑕佽嚜宸卞啓...閮侀椃...
WPC鍦╢irefox涓婅浜?jiǎn)涓涓猄elenium Recorder鐨刾lug in鍙互璁板綍web page actions錛岀劧鍚巖eplay銆備粬鍙戠幇榪欎釜涓滆タ鑳界粫榪嘢elenium鐨勯檺鍒訛紝浜庢槸鍐沖畾鐪嬬湅浠栨庝箞瀹炵幇鐨勶紝鎵懼埌code涓鐪?..鍘熸潵鏄妸selenium runner hack浜?..鐢╦avascript鎶妘rl base鐢熺敓鐨勭粰鏀逛簡(jiǎn)...WPC璇村ソ鍟婏紝鎴戜滑鍐欎竴涓狥irefox Selenium Recorder Plugin鐨刾lug in鍚э紝璁╀粬浠庝竴涓洰褰曢噷鑷姩load script...鐒跺悗WPC寮濮嬬帺firefox plugin.

鎴戝喅寰楁垜榪樻槸鐪嬬湅Ruby鐨勪腑鏂囨敮鎸佸惂錛屾壘鏉ユ壘鍘婚兘娌℃湁璇碦uby鐨勪腑鏂囨湁闂鐨勶紝鍚庢潵鍙戠幇涓涓佸ぇ嫻嬩簡(jiǎn)涓涓婻uby鐨勪腑鏂囧瓧絎︿覆錛岃娌¢棶棰樸傛垜蹇樹(shù)簡(jiǎn)榪欎釜鑰佸ぇ鐨刄RL浜?jiǎn)鎵惧埌鍐嶈ˉ涓娿備唬鐮佷笂鐪嬭搗鏉ヤ技涔庝篃娌′粈涔堥棶棰樸備簬鏄垜鎬鐤戞槸Watri鐨勯棶棰橈紝鐪媁atri鐨勪唬鐮侊紝鍙戠幇Watri鐨勮璁℃濊礬灝辨槸涓轟簡(jiǎn)妯℃嫙浜虹殑褰曞叆錛岀劧鍚庢壘鍒拌繖鏍風(fēng)殑浠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鏉ヨ緭鍏ャ備簬鏄垜璇曢獙浜?jiǎn)涓涓媟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晩銆傛壘鍒頒簡(jiǎn)闂灝卞ソ鍔炰簡(jiǎn)錛屾垜鏉冭 浜?jiǎn)fix watri unicode鍜岀洿鎺ack瀹冿紝鏈鍚庢垜閫夋嫨鐩存帴hack瀹冿紝鏂規(guī)硶綆鍗曪細(xì)

 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

鐒跺悗嫻嬭瘯涓涓嬶細(xì)
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鑴氭湰錛岃繖涓椂鍊欏鎴蜂笅鐝簡(jiǎn)錛屾垜浠喅瀹氭槑澶╃戶緇紝涓鍏辯敤鏃?灝忔椂...

鏈鍚庤涓涓嬮渶姹傦紝涓鍏辨湁澶氬皯鏁版嵁鍛紵70鏉?..濡傛灉pair褰曞叆鐨勮瘽錛屽ぇ綰?0-50鍒嗛挓鍚?BR>
緇撹:

1.Pragmatic Programmer閮芥槸寰堟噿鐨勶紝閲嶅5嬈$殑宸ヤ綔閮藉洖鐢ㄤ唬鐮佹潵鍐欍?BR>2.Pragmatic Programmer閮芥槸寰堟湁濂藉蹇?jī)鐨勫Q屽お澶氱殑閲嶅鎬у姵鍔ㄥ彧鑳藉垎鏁d粬浠殑娉ㄦ剰鍔涳紝涓嶇煡閬撲細(xì)鎼炲嚭浠涔堜簡(jiǎn)錛屾垜浼拌鎴戣娌℃湁hack Watri錛學(xué)PC宸茬粡寮濮嬪啓Firefox plugin浜?jiǎn)銆?BR>3.Pragmatic Programmer閮芥槸鈥滃彜紼嬪簭鍛樷濓紝鍐欑▼搴忔搷綰佃綆楁満鏄緢鏈変箰瓚g殑銆?BR>4.姣斾竴涓狿ragmatic Programmer鏇磋兘鎶樿吘鐨勬槸涓や釜Pragmatic Programmer...




Raimundox 2006-01-10 21:30 鍙戣〃璇勮
]]>
涓ч挓涓鴻皝楦?(4)http://www.tkk7.com/raimundox/archive/2005/12/21/24957.htmlRaimundoxRaimundoxWed, 21 Dec 2005 07:51:00 GMThttp://www.tkk7.com/raimundox/archive/2005/12/21/24957.htmlhttp://www.tkk7.com/raimundox/comments/24957.htmlhttp://www.tkk7.com/raimundox/archive/2005/12/21/24957.html#Feedback2http://www.tkk7.com/raimundox/comments/commentRss/24957.htmlhttp://www.tkk7.com/raimundox/services/trackbacks/24957.html絎?. 涓鍒囩殕瀵硅薄鍜岄潰鍚戝璞$殑鐞嗚鍩虹

鑰佸簞鏄弽瀵逛竴鍒囩殕瀵硅薄鐨勶紝鑰孴rustNo1鍦╦avaeye鐨勪竴綃囧笘瀛愪笂璇?

絎竴錛屾垜鍙互寰堣礋璐g殑璇?OO鐨勶紝70騫翠唬鎴愬瀷錛?0騫翠唬鍦ㄧ悊璁哄熀紜涓婂氨緇欎漢姣欐帀銆備粠榪欑鎰忎箟涓婅涓嶆槸OO姝諱笉姝葷殑闂錛岃屾槸OO榪樻椿鐫涔堬紵褰撶劧鐞嗚鍩虹緇欎漢姣欐帀錛屼笉鏄娌℃湁鐢ㄣ?/SPAN>

鎴戝厛璇撮潰鍚戝璞$殑鐞嗚鍩虹鐨勯棶棰橈紝鑷充簬涓鍒囩殕瀵硅薄紼嶅悗鍐嶈〃銆?BR>
鎵璋撻潰鍚戝璞$殑鐞嗚鍩虹鍏跺疄鏄病鏈夌殑錛屽師鍥犲緢綆鍗曪紝闈㈠悜瀵硅薄鏍規(guī)湰灝變笉鏄竴縐嶈綆楁ā鍨嬨傚湪絎竴嬈¤蔣浠跺嵄鏈虹殑閭d釜鏃朵唬錛屽涓庤綆楁満鐨勯潪鏁板艱綆楀簲鐢ㄧ殑璁ㄨ浠ュ強(qiáng)瀵逛簬鍙綆楁ч棶棰樼殑鐮旂┒鍜屽彂灞曪紝澶ф姷紜珛浜?jiǎn)鍑牽U嶄富嫻佺殑璁$畻妯″瀷錛氶掑綊鍑芥暟綾伙紝鍥劇伒鏈猴紝Lambda婕旂畻錛孒orn瀛愬彞錛孭ost緋葷粺絳夌瓑銆?BR>
鍏朵腑閫掑綊鍑芥暟綾繪槸鍙綆楁ч棶棰樼殑鏁板瑙i噴;鍥劇伒鏈烘槸鍥劇伒瑙e喅鍙綆楅棶棰樼殑鏃跺欐墍璁捐鐨勮緗紝鍏跺悗鎴愪負(fù)璁$畻鏈虹殑瑁呯疆妯″瀷錛屼笌鍥劇伒鏈虹浉鍏崇殑褰㈠紡璇█鍜岃嚜鍔ㄦ満鎴愪負(fù)浜?jiǎn)鍛戒护寮忚瑷鐨勭悊璁哄熀紜;lambda婕旂畻鎴愪負(fù)浜?jiǎn)鍑芥暟寮忚瑷鐨勭悊璁哄熀紜;Horn瀛愬彞鏄痯rolog榪欑被閫昏緫璇█鐨勭悊璁哄熀紜銆備絾鏄垜浠儕璁剁殑鍙戠幇錛岄潰鍚戝璞℃病鏈夎綆楁ā鍨嬬殑鐞嗚鍩虹錛屾崲鑰岃█涔嬶紝闈㈠悜瀵硅薄鏍規(guī)湰灝變笉鏄粠鍙綆楁х殑鐮旂┒涓婂彂灞曡繃鏉ョ殑錛岄偅涔堥潰鍚戝璞$殑鐞嗚鍩虹鐨勪環(huán)鍊兼湰韜氨涓嶅ぇ銆?/P>

鎵浠ユ垜寰堝鎬殑涓涓棶棰樺氨鏄疶rustNo1鎵璋撶殑闈㈠悜瀵硅薄鍦?0騫翠唬鐞嗚鍩虹涓婄粰浜烘瘷鎺夌殑璇存硶鏄粠浣曡屾潵鐨勶紵鏃㈢劧闈㈠悜瀵硅薄鏈川涓婁笉鏄竴縐嶈綆楁ā鍨嬶紝閭d箞瀹冨ぇ鎶典笂鍙兘褰掔粨涓轟竴縐嶅簲鐢ㄦ妧鏈紝搴旂敤鎶鏈嚜鐒跺彲浠ヤ粠鍚勭涓嶅悓鐨勯鍩熼噷寰楀埌鐩鎬技鐨勫簲鐢紝閭d箞姣欐帀鐨勭悊璁哄熀紜鎵鎸囩殑鍙堟槸浠涔堝憿錛熺敋鎬箣銆?/P>

鏃㈢劧闈㈠悜瀵硅薄涓嶆槸涓涓綆楁ā鍨嬶紝閭d箞鎴戜滑鍙互浠庝笉鍚岀殑瑙掑害鎺ㄦ柇鍑篛O鐨勫悇縐嶅艦鎬侊紝鑰佸簞宸茬粡鍑虹粰浜?jiǎn)浠嶢DT寮曞嚭OO鐨勯棶棰樹(shù)互鍙?qiáng)渚嬪瓙锛屾垜灏变笉缃楀棪浜?jiǎn)錛屾垜緇欎竴涓粠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)

浼?xì)寰楀堫C竴涓猰essageNotUnderstand鐨剅untime閿欒錛岃繖灝辨槸涓涓緢鑷劧dyanmic type鐨勫璞″皝瑁咃紝鏈鏃╃殑闈㈠悜瀵硅薄緋葷粺Smalltalk鍜孋LOS鍩烘湰涓婇兘鏄繖涓礬瀛愶紝浜庢槸鏈変竴涓棶棰橈紝涓轟粈涔堟渶鏃╃殑闈㈠悜瀵硅薄緋葷粺閮芥槸dyanmic type錛熻繖閲屽氨璺焞ambda婕旂畻鏈夊叧浜?jiǎn)銆?/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鎶借薄錛屼笅闈㈡垜鐩存帴緇欏嚭浜?jiǎn)锛尵~虹渷璁や負(fù)澶у閮界湅浜?jiǎn)SICP錛屽Scheme涔熼鏈夊績(jī)寰椼?/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ī)湰娌℃湁鏁版嵁鎴栬呯被鍨嬨傛湁鐨勬案榪滃悇縐嶅悇鏍風(fēng)殑lambda鎶借薄鑰屽凡(鐩墠宸茬粡鏈変簡(jiǎn)甯︾被鍨嬬殑lambda婕旂畻)銆傝繖閲岃涓鍙ラ澶栬瘽錛孲ICP閲岀殑Data as Procedure鍏跺疄灝辨槸鍦ㄨ榪欎釜闂錛屼笉榪囦粬娌℃槑璇達(dá)紝鑰屾槸鐢ㄤ簡(jiǎn)涓縐嶇壒孌婄殑鐢ㄦ硶鑰屽紩鍑轟簡(jiǎn)娑堟伅浼犻掗鏍鹼紝鎴戣寰楄繖閲孲ICP鏈変簺欏炬澶卞郊錛屽浜巇ata as procedure鎴戞葷粨鐨勪竴鑸艦寮忔槸

(define (construct-function value1 value2 value3 value4valuen) (lambda (dispatch) (dispatch value1 value2 value3 value4valuen)))
(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瑙勭害錛岃〃榪板悇縐嶄笉鍚岃綆椼傜湅錛屽湪闈㈠悜瀵硅薄涔嬪墠灝卞凡緇忔湁浜?jiǎn)涓鍒囩殕鏌愭煇鐨勫畬緹庣殑璁$畻鐞嗚瀛樺湪浜?jiǎn)銆傝屼笖鍥為【涓涓嬶細(xì)

(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鎶借薄鐨勬紨鍖栵紝榪欎篃鏄負(fù)浠涔圫ICP閲屾妸闈㈠悜瀵硅薄縐頒綔涓縐嶁滄柟渚跨殑鐣岄潰鈥濊屼笉鏄竴縐嶆娊璞$殑鏂規(guī)硶鐨勫師鍥犱簡(jiǎn)銆傞偅涔堝璞″拰lambda鎶借薄鍙堜粈涔堝尯鍒憿錛?BR>
鍢垮樋錛岀啛鎮(zhèn)塅P鐨勪漢閮藉簲璇ョ煡閬撲簡(jiǎn)錛屽氨鏄疭ide-Effect錛屽壇浣滅敤銆傚璞″厑璁稿鍏跺唴閮ㄧ姸鎬佽繘琛屼慨鏀癸紝閭d箞榪欎釜涓滆タ灝辯牬鍖栦簡(jiǎn)eta瑙勭害鐨勫墠鎻愭潯浠訛紝涔熷氨鏄鍏佽淇敼鍐呴儴鐘舵佺殑涓滆タ錛屽凡緇忎笉鏄竴涓彲浠ヨ繘琛宭ambda璁$畻鐨刲ambda鎶借薄浜?jiǎn)銆傚洜姝ゆ殏涓旂粰涓涓埆鐨勫悕瀛楀惂錛屽氨鍙璞″惂.....鍥犳鎴戣涓猴紝瀵硅薄寰堝ぇ紼嬪害涓婃槸涓縐嶅甫鏈夊壇浣滅敤鐨刲ambda鎶借薄銆?/P>

鎴戝湪鏈変竴綃嘼log涓婂啓浜?jiǎn)Say sorry to object-oriented錛岄噷闈㈢粰浜?jiǎn)涓鍙敤瀵硅薄浣滃垎鏀殑渚嬪瓙錛岃繖閲屽氨涓嶉噸澶嶄簡(jiǎn)錛屾湁鍏磋叮澶у鍙互鍘葷湅涓涓嬶紙鍒氭墠濂藉儚鍦↗avaEye涓婄湅鍒頒竴涓娉曪紝璇碋verything is Object鏄疭malltalk鐨勫箍鍛婅錛屽攭錛孲malltalk閲岀殑鐨勭殑紜‘everything is object鍟娿傦級(jí)

榪欓噷鎴戜滑鏉ユ葷粨涓涓嬶紝闈㈠悜瀵硅薄浣滀負(fù)涓縐嶁滄柟渚跨殑鐣岄潰鈥濅富瑕佽В鍐充簡(jiǎn)涓涓眬閮ㄥ寲鍜屾ā鍧楀寲鐨勯棶棰橈紝榪欐槸浠巐ambda婕旂畻鍜屽嚱鏁扮紪紼嬬殑瑙掑害鏉ョ湅闈㈠悜瀵硅薄鎶鏈傦紙taowen鍦ㄤ粬鐨勪竴綃嘼log涓婅錛岄潰鍚戝璞″眬閮ㄥ寲浜?jiǎn)Side-Effect錛屾垜娣變互涓虹劧錛夛紝榪欎釜涓滆タ鎴戜釜浜鴻涓烘洿鍔犳帴榪戦潰鍚戝璞℃湰鏉ョ殑鎰忔濓紝鑰屼笉鏄敱ADT閲屽彂灞曞嚭鏉ョ殑甯︾被鍨嬬殑瀵硅薄緋葷粺鐨勯偅涓剰鎬濄傚洜姝よ佸簞涓嶄互涓虹劧鐨勯潰鍚戝璞$被鍨嬬郴緇燂紝鎴戜篃涓嶄互涓虹劧銆備絾鏄潰鍚戝璞′綔涓簂ambda鎶借薄鐨勭晫闈紝鎴戣寰楄繕鏄緢涓嶉敊鐨勩傝繖涓鐐瑰湪Smalltalk鍜孯uby閲岄兘鏈変笉閿欑殑浣撶幇銆?/P>

Raimundox 2005-12-21 15:51 鍙戣〃璇勮
]]>
涓ч挓涓鴻皝楦o紵(3)http://www.tkk7.com/raimundox/archive/2005/12/21/24891.htmlRaimundoxRaimundoxTue, 20 Dec 2005 16:44:00 GMThttp://www.tkk7.com/raimundox/archive/2005/12/21/24891.htmlhttp://www.tkk7.com/raimundox/comments/24891.htmlhttp://www.tkk7.com/raimundox/archive/2005/12/21/24891.html#Feedback1http://www.tkk7.com/raimundox/comments/commentRss/24891.htmlhttp://www.tkk7.com/raimundox/services/trackbacks/24891.html絎? 緇ф壙

鍓嶉潰宸茬粡璇磋繃浜?jiǎn)锛尵lф壙鑷沖皯鏈?涓涔? 瀹炵幇緇ф壙鍜岀被鍨嬬戶鎵匡紝鍦ㄨ鏄庤繖涓や釜涓滆タ涔嬪墠錛屾垜浠戶緇潵鐪嬩笂闈㈢殑渚嬪瓙

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.

鏈鍚庝竴涓細(xì)寰楀埌涓涓猰essageNotUnderstand鐨勯敊璇備篃灝辨槸璇達(dá)紝瀵逛簬Bass鑰岃█鐢變簬涓嶈兘婕斿鍜屽0浠庤屼笉鑳芥紨濂廈MV996(涓嶈繃榪欎釜涓栫晫涓婅兘浜哄お澶氫簡(jiǎn)...鍝?錛屾垜浠崲鍒伴潤(rùn)鎬佺被鍨嬮潰鍚戝璞$郴緇熸潵鐪嬨?BR>瀵逛簬絎竴涓柟娉曪紝playSolo鐨勬椂鍊欐垜浠姹傜殑綾誨瀷鏄兘澶熸紨濂忓崟闊崇殑銆傛垜浠彲浠ュ啓鍑烘潵

1interface SoloInstrument {
2  SoloInstrument playNote(Note note);   
3}

瀵逛簬絎簩涓柟娉曪紝playChord鐨勬椂鍊欐垜浠姹傜殑綾誨瀷鏄兘澶熸紨濂忓拰寮︾殑錛屾垜浠彲浠ュ啓鍑烘潵

1interface ChordInstrument {
2  ChordInstrument playChord(Chord note);   
3}

鑰屽浜庣涓変釜鏂規(guī)硶錛宲layBWV996鐨勬椂鍊欐垜浠姹傛棦鑳芥紨濂忓拰寮︿篃鑳芥紨濂忓崟闊籌紝榪欎釜鏃跺欏嚭鐜頒竴涓棶棰橈紝鎴戜滑鎬庝箞澶勭悊Instrument鐨勭戶鎵垮叧緋?涓涓兘婕斿鍜屽雞鐨勪箰鍣ㄦ槸鍚﹀彲浠ユ紨濂忓崟闊?絳旀鏄竴鑸岃█鏄殑錛屼絾鏄篃涓嶆帓闄ゆ湁涓浜涗笉鏄繖鏍風(fēng)殑)?榪樻槸鎴戜滑綆鍗曠殑鍐?

1interface SoloAndChordInstrument extends SoloInstrument, ChordInstrument{
2}

鎴栬?/P>

1interface BWV996Playable {
2
3  BWV996Playable playNote(Note note); 
4  BWV996Playable playChord(Chord note);  
5}

瀵逛簬鍔ㄦ佺被鍨嬬畝鍗曠殑闅愭х被鍨嬬害瀹氾紝鏄劇ず鐨勭被鍨嬬郴緇熷甫鏉ョ殑涓涓壇浣滅敤灝辨槸鎴戜滑蹇呴』澶勭悊綾誨瀷涔嬮棿鐨勫叧緋匯?STRONG>娉ㄦ剰榪欓噷鏄被鍨嬩箣闂寸殑鍏崇郴錛岃屼笉鏄璞′箣闂寸殑鍏崇郴銆傝佸簞鍚屽織鎵逛簡(jiǎn)寰堝綃囩殑闈㈠悜瀵硅薄鐨勬娊璞★紝闈㈠悜瀵硅薄鐨勭被鍨嬬郴緇熶互鍙?qiáng)闈㈠悜瀵硅薄鐨勬湰浣撹锛?STRONG>鍏跺疄閮藉湪鏄湪綾誨瀷鍏崇郴涓婃姌鑵撅紝鑰屼笉鏄湪瀵硅薄鍏崇郴涓婃姌鑵?/STRONG>銆傝屼簨瀹炰笂闈㈠悜瀵硅薄鐨?STRONG>綾誨瀷緋葷粺騫墮潪蹇呯劧灝辨槸闈?rùn)鎬佺被鍨嬬郴緇燂紝鑰屾垜浠殑綾諱箣闂寸殑鍏崇郴涓嶄竴瀹氬氨鍜岀被鍨嬬殑鍏崇郴鐩鎬竴鑷淬?/STRONG>灝卞儚涓婁緥鎵紺猴紝鍦⊿malltalk閲岋紝Lute錛孏uitar鍜孊ass涔嬮棿娌℃湁浠諱綍鐨勭戶鎵垮叧緋伙紝浣嗘槸瀵逛簬person鐨?涓秷鎭岃█錛屽畠浠嵈鏄湁綾誨瀷鐨勩?BR>
鍥犳鑰佸簞鎵鎵圭殑錛屾槸瀵硅薄綾誨瀷緋葷粺鐨勬娊璞¤兘鍔涳紝鑰岄潪闈㈠悜瀵硅薄鐨勬娊璞¤兘鍔涖傛濡備粬鍦ㄧ被鍨嬬郴緇熼噷鎵緇欑殑渚嬪瓙錛岄偅寮犱粬璁や負(fù)寰堝け璐ョ殑闈㈠悜瀵硅薄鐨勫浘錛屽叾瀹炲彲浠ュ畬鍏ㄤ笉渚濊禆緇ф壙鏉ュ疄鐜幫紝鑰屽榪欎釜綾誨瀷緋葷粺鐨勬秷璐硅呰岃█錛屼粬浠兘澶熶互涓瀹氱殑綾誨瀷鐨勮鐐癸紝鏉ュ鐞嗚繖涓郴緇熺殑瀵硅薄銆?/P>

鑰岃佸簞鏈鍚庝竴涓粨璁?

鎴戠殑緇撹鏄細(xì)鈥滀竴涓被鍨嬶紝鏄敱鍏舵湰璐ㄥ喅瀹氫簡(jiǎn)鎵鑳借〃鐜板嚭鐨勫彲鎿嶄綔鎬э紝鑰屼笉鏄湁鍏舵墍鑳芥帴鍙楃殑鎿嶄綔鍐沖畾浜?jiǎn)鍏舵湰璐ㄣ傜劧鑰岋紝OO姝eソ鎶婅繖涓棶棰樻悶鍙嶄簡(jiǎn)錛佲?/SPAN>

鎴戠殑鐪嬫硶鏄紝榪欏彞璇濇牴鏈氨鏄杈╋紝鍓嶉潰鍗婂彞鐨勪富璇槸鈥滀竴涓被鍨嬧濓紝鍚庨潰鍗婂彞鐨勪富璇槸"OO"...

铏界劧鍓嶅崐鍙ユ槸瀵圭殑錛屼絾鏄崲涓鏍瘋娉曞彲鑳芥洿濂?"鎵鑳芥帴鍙楃殑鎿嶄綔鍙嶆槧浜?jiǎn)鍏舵湰璐?/STRONG>"錛岄潰鍚戝璞℃湰韜氨娌℃湁璇存垜瑕佸仛涓涓湰璐ㄦ娊璞★紝榪欎竴鐐瑰湪Smalltalk鐨勭被鍨嬪垽鏂搷浣滀笂鐨勫彲鑳芥槸涓涓綈璇侊紝Smalltalk鐢╥sKindOf鏉ュ垽鏂戶鎵垮叧緋伙紝鎴戜滑鏉ョ帺涓涓枃瀛楁父鎴忥紝鏀規(guī)垚淇氳灝辨槸kinda錛屼篃灝辨槸"鏈変竴鐐癸紝鏈夊嚑鍒?鐨勬剰鎬濓紝鑰屼笉鏄錛屸滃氨鏄濓紝鎴栬呪滀粠鍒嗙被瀛︿笂鍙瘉鏄庝箣綾葷殑鍚箟鈥濄傛垜鍐嶄婦涓涓緦榫婄殑渚嬪瓙銆?/P>

vincent ballon: AirBallon new.
vincent ballon: Condom 
new.

姘旂悆鍜屼繚闄╁錛屽浜巄allon榪欎釜鏂規(guī)硶鑰岃█鏄竴涓被鍨嬶紝閮芥槸"鏈夊嚑鍒?鍙互鍚硅搗鏉ャ備絾鏄垜鎬庝箞瀹氫箟涓涓簿紜殑鏈川錛烞allonable錛熻繕鏄疢akeFromLatexAndVeryThin?鎴栬呯畝鍗曡FlexableAndThin錛?/P>

鍦ㄧ戶鎵胯繖涓鐐逛笂錛屾垜鎯寵佸簞寮曟枃涓?Elminster鐨勮瘽鏄粠浜嬬墿鐨勭壒寰佷笌灞炴у綊綰沖嚭瀹冪殑鈥滅被鍨嬧濄傛伆鎭板浜庨潤(rùn)鎬佺被鍨嬮潰鍚戝璞$郴緇熸槸鍙鐨勩傚鎴戝墠鏂囨墍榪幫紝鎴戞妸涓涓猳bject鍜屾墍鏈塻ender鐨勭害瀹氾紙涔熷氨鏄痠nterface錛夛紝緇ф壙鍦ㄤ竴璧鳳紝鎭版伆灝辨槸涓涓涓烘伆褰撶殑綾誨瀷瀹氫箟銆?BR>
鑰屽浜庡姩鎬佺被鍨嬬郴緇熼噷鐨勯潰鍚戝璞¤璦錛岀戶鎵跨殑涔熸湁綾誨瀷緇ф壙鐨勫惈涔夛紝浣嗘槸騫朵笉鏄敮涓鐨勯斿緞銆傜敤涓鍙ユ垜浠父璇寸殑璇濓紝鍦ㄩ潤(rùn)鎬佺被鍨嬬郴緇熼噷錛岀被鍨嬪拰綾繪槸绱ц﹀悎鐨勶紝鍔ㄦ佺被鍨嬬郴緇熶腑浠栦滑鐨勮﹀悎姣旇緝鏉俱?BR>
浠庢鑰岃錛屾墍鏈夊浜庨潰鍚戝璞$殑鍝插鑰冭檻浠ュ強(qiáng)鏈綋鐨勬濊冿紝瀵逛簬鍔ㄦ侀潰鍚戝璞$郴緇熷凡緇忎笉鏄偅涔堣揩鍒囦簡(jiǎn)銆傝屾妸瀵硅薄綾誨瀷緋葷粺鐨勪笉瓚沖綊鍜庝簬闈㈠悜瀵硅薄鐨勪笉瓚籌紝涔熶技涔庤鎹笉瓚熾?/P>

Raimundox 2005-12-21 00:44 鍙戣〃璇勮
]]>
涓ч挓涓鴻皝楦o紵(2)http://www.tkk7.com/raimundox/archive/2005/12/21/24889.htmlRaimundoxRaimundoxTue, 20 Dec 2005 16:22:00 GMThttp://www.tkk7.com/raimundox/archive/2005/12/21/24889.htmlhttp://www.tkk7.com/raimundox/comments/24889.htmlhttp://www.tkk7.com/raimundox/archive/2005/12/21/24889.html#Feedback2http://www.tkk7.com/raimundox/comments/commentRss/24889.htmlhttp://www.tkk7.com/raimundox/services/trackbacks/24889.html絎? 鍏充簬"鎺ュ彛"

鍏充簬鎺ュ彛鐨勯棶棰樿佸簞璇村浜?jiǎn)锛寴q欎釜涓滆タ騫朵笉灞炰簬闈㈠悜瀵硅薄鐨勬蹇碉紝鑰屼笖鍦ㄥ姩鎬佺被鍨嬮潰鍚戝璞¤璦(姣斿Ruby, Smalltalk閲?錛屾牴鏈病鏈夎繖涓笢瑗褲傝繖鏄竴涓函綺圭殑闈?rùn)鎬佺被鍨嬮潰鍚戝璞¤璦鐨勭壒鎬э紝鎴栬呯洿鎺ヨ錛屾帴鍙e氨鏄竴涓函綾誨瀷(Type)銆傝繕鏄笂嬈$殑渚嬪瓙錛?/P>

 1interface Instrument {
 2   void playNote(Note note);
 3   void playChord(Chord chord);
 4}

 5
 6in Person Class
 7
 8void playSolo(Instrument instrument) {
 9 
10}

鍦ㄦ垜鎺ヨЕSmalltalk鐨勬渶寮濮嬬殑涓孌墊椂闂撮噷錛岃繖縐嶅湴鏂規(guī)槸璁╂垜鏈闅懼彈錛屾垜宸茬粡涔?fàn)鎯簡(jiǎn)鐢ňc誨瀷杈呭姪鎴戠殑鎬濈淮錛屼絾鏄垜鍙戠幇鎴戝湪Smalltalk閲屽仛涓嶅埌錛岃櫧鐒舵垜鍙互鍐欏嚭

Instrument>>playNote:note
  
^self subclassResponsibility.

Instrument
>>playChord:chord
  
^self subclassResponsibility.

浣嗘槸浠栧嵈涓嶆槸涓涓帴鍙o紝鎴戝彲浠ュ緢鐢?/P>

instrument = Instrument new.
instrument playNote: Note C.

鏉ユ瀯閫犱竴涓狪nstrument涔嬪悗鍦ㄥ畠涔嬩笂璋冪敤playNote鏂規(guī)硶錛岀劧鑰屾垜浼?xì)寰楀堫C竴涓猰essageNotUnderstand鐨勯敊璇紝Smalltalk鍜孯uby閲屾病鏈堿bstract鐨勬蹇點(diǎn)備篃灝辨槸璇碼bstract method錛宎bstract class浠ュ強(qiáng)interface錛岄兘涓嶆槸闈㈠悜瀵硅薄鐨勬蹇碉紙鎴栬呬弗鏍間竴浜涜錛岄兘涓嶆槸闈㈠悜瀵硅薄鐨勫繀欏葷殑姒傚康錛夛紝鑰屾槸闈㈠悜瀵硅薄綾誨瀷緋葷粺鐨勬蹇點(diǎn)傞偅涔堝湪Smalltalk閲屾垜浠細(xì)鎬庝箞鍋氬憿錛?/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榪欎釜娑堟伅銆傚綋鐒惰繖涓被鍨嬮渶瑕佹槸闅愭э紝鎴戜篃鍙互瀵圭瓑鐨勫啓鍑洪潤(rùn)鎬侀潰鍚戝璞$殑浠g爜鎶婅繖涓殣鎬х殑綾誨瀷鏄劇ず鐨勮〃紺哄嚭鏉?

1interface Instrument {
2   Instrument playNote(Note note);  
3}

鍚屾牱瀵逛簬絎簩涓柟娉曟垜浠篃鍙互鍐欏嚭鏉?

1interface Instrument {
2   Instrument playChord(Note note);  
3}

濡傛灉鎴戜滑闇瑕佸浜庝竴涓殑娑堟伅涔熸槸涓鏍風(fēng)殑錛屾瘮濡?/P>

Person>>playBWV996OnInstrument:instrument
   instrument playNote: Note C;
              playChord: Chord C;
              playNote: Note D.

鍚屾牱榪欎釜鏃跺欓殣鎬х殑綾誨瀷闇瑕佸氨鏄?/P>

1interface 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涔嬩笁鍛崇殑鐢ㄦ硶銆傝繖縐嶇殑鍋氭硶瀵逛簬鍦ㄩ潤(rùn)鎬佺殑闈㈠悜瀵硅薄緋葷粺鐨勫ソ澶勬垜浠湪緇ф壙閲屽啀璁鴻堪銆?/P>

鑷充簬鑰佸簞鎵璇寸殑鎺ュ彛鏄緇ф壙鐨勪竴縐嶄唬鏇垮搧錛岃繖鍙笉榪囨槸涓栦織鐨勭湅娉曪紝鍦ㄩ潤(rùn)鎬佺被鍨嬬殑闈㈠悜瀵硅薄閲岋紝緇ф壙鑷沖皯鏈?涓涔?

1.瀹炵幇緇ф壙錛岃繖涓湪Smalltalk錛孯uby錛孋++閲屾湁錛岃屽湪java閲屾病鏈夛紝C++閲屾槸閫氳繃private extends鏉ュ疄鐜扮殑

1class SubClassA: private ImplementationParent {
2}

榪欎篃鏄疌++閲屼負(fù)鏁頒笉澶氱殑subclass涓嶆槸subtype鐨勪緥瀛愩?/P>

2.綾誨瀷緇ф壙錛岃繖涓湪C++鍜宩ava閲屾湁錛岃屽湪smalltalk,ruby鏈夊嵈涓嶆槑鏄俱?/P>

綾誨瀷緇ф壙鐨勬瀬鑷村氨鏄疌++閲岀殑綰櫄鐖剁被

1abstract class Parent {
2
3  public asbtract void method1() = 0;
4  public asbtract void method2() = 0;
5}

涔熷氨鏄痡ava閲岀殑interface

1interface Parent {
2   void method1();
3   void method2();
4}

鍥犳錛屼篃灝辨槑浜?jiǎn)浜?jiǎn)錛屾墍璋撯滈潰鍚戞帴鍙g紪紼嬧濇槸浠ョ被鍨嬩綔涓虹害瀹氱殑緙栫▼銆傛垜瑙夊緱榪欑偣澶у涓瀹氫笉闄岀敓錛岄潰鍚戞帴鍙g殑緙栫▼閲宨nterface閮藉緢灝忚屼笖綰﹀畾鏄庣‘銆備絾鏄璇存槑涓鐐圭殑鏄紝榪欎釜涓滆タ鍜?闈㈠悜鎶借薄鑰屼笉瑕侀潰鍚戝叿浣撶紪紼?鍏跺疄榪樹(shù)笉涓鏍鳳紝鎵浠ヨ繖涓笢瑗夸篃灝變粎浠呰兘綆楁槸闈?rùn)鎬佺被鍨嬮潰鍚戝璞$殑涓涓儻鐢ㄦ硶錛岃繕鍒頒笉浜?jiǎn)鍘熷垯杩欎箞楂樸?/P>

Raimundox 2005-12-21 00:22 鍙戣〃璇勮
]]>
涓ч挓涓鴻皝楦o紵(1)http://www.tkk7.com/raimundox/archive/2005/12/20/24851.htmlRaimundoxRaimundoxTue, 20 Dec 2005 11:58:00 GMThttp://www.tkk7.com/raimundox/archive/2005/12/20/24851.htmlhttp://www.tkk7.com/raimundox/comments/24851.htmlhttp://www.tkk7.com/raimundox/archive/2005/12/20/24851.html#Feedback10http://www.tkk7.com/raimundox/comments/commentRss/24851.htmlhttp://www.tkk7.com/raimundox/services/trackbacks/24851.html寮綃囦箣鍓嶅厛璇存槑涓涓嬶紝鎴戝拰鑰佸簞鏈夌潃涓嶉敊鐨勭浜わ紝浠栨渶鍒濆啓涓ч挓緋誨垪鐨勬椂鍊欙紝鎴戞槸蹇犲疄鐨勬嫢瓚鎬箣涓錛屽簞鍏勮鎴戝皻鏈夊灝烘墍闀匡紝榪樺湪涓ч挓緋誨垪閲屽紩鐢ㄤ簡(jiǎn)鎴戠殑鍑犱釜瑙傜偣銆傜劧鑰屾渶榪戜竴孌墊椂闂撮噷錛屾垜浣滀簡(jiǎn)榪欐牱鍑犱歡浜嬫儏錛?/P>
1.閲嶆柊瀛︿範(fàn)浜?jiǎn)lambda婕旂畻銆傛垜鐨勬暟瀛﹀熀紜涓嶅強(qiáng)taowen絳夛紝璐逛簡(jiǎn)涓浜涙椂鏃ヤ粛涓嶅畬鍏ㄤ簡(jiǎn)鐒?dòng)灱岀洰鍓嶅ぇ鎶佃兘瀵圭潃R5RS鍚庨潰鐨勮涔夊畾涔夊涓浜涚畝鍗曠殑scheme紼嬪簭榪涜lambda婕旂畻銆?BR>2.鍙嶅鐮旂┒浜?jiǎn)鍑犻亶SICP銆傚悓鏃剁湅浜?jiǎn)褰曞儚鍜屼功锛堟劅璋㈡浌鑰佸笀涓嬬殑Video錛夛紝鑷俊瀵瑰墠浜岀珷鍗婃湁浜涜璁よ瘑涔︿腑鏈強(qiáng)錛屽悗浜岀珷鍗婄矖鐭ュぇ瑙堝皻涓嶈兘鍙戝墠浜烘墍鏈彂涔嬭█銆?BR>3.瀛︿範(fàn)浜?jiǎn)Smalltalk鍜孯uby錛孌uck Typing浠ュ強(qiáng)鍏朵粬涓浜涙湁鍏崇被鍨嬬郴緇熺殑涓滆タ銆?BR>4.鍥為【浜?jiǎn)涓涓嬮潰鍚戝璞¤璦鐨勪竴浜涘彂灞曞彶錛屼互鍙蹭負(fù)閴寸矖鐭ヤ竴浜涘叴鏇褲?BR>5.緇忔棩鍜宼aowen錛岃佸簞璁ㄨ璇█銆佽璁$瓑絳変箣綾伙紝姣忎負(fù)涓杈ㄥ繀絀鋒垜鎵鐭ヤ簤鍙戜竴璦錛屾墍浠ョ煡璇嗗彲浠ヨ繀閫熸潅緋?D

緇忚繃縐嶇涔嬪悗錛屽彂鐜板綋鍒濇墍璋撻福OO涔嬩撫閽燂紝瀹炲湪鏄█榪囧叾瀹炪?BR>--------------------------------------------------------------------------------------------------------------------------------------------------------------
絎? 鍏充簬"闈㈠悜瀵硅薄"

鏃㈢劧瑕佷負(fù)浜哄鏁蹭撫閽燂紝鍏堣鎵懼浜?jiǎn)鑻︿富锛屼笉鐒跺矀涓嶆槸鐧藉繖娲讳簡(jiǎn)涓鍦恒備粈涔堟槸闈㈠悜瀵硅薄錛熻繖涓棶棰樺お澶э紝鎴戜滑涓句竴涓緢甯歌鐨勪緥瀛愶細(xì)

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);

鍒嗗埆琛ㄧず錛岄渶瑕佷竴涓被鍨嬩負(fù)Instrument鐨勫璞nstrument錛岀劧鍚庡浠栬繘琛岀浉搴旂殑鎿嶄綔錛岃屼笖錛屼粠姒傚康涓婃潵璁詫紝絎竴涓柟娉曪紝浣挎紨濂忔棆寰嬬殑錛屼篃灝辨槸鍗曢煶錛岃岀浜屼釜鏂規(guī)硶鏄紨濂忓拰澹扮殑銆傞偅涔堬紝濡傛灉鎴戞湁涓涓被

class GlassBottle {

   
void playNote(Note note) {
      ..
   }

}

鎴戜滑鐭ラ亾錛岀幓鐠冪摱瑁呬簡(jiǎn)姘翠篃鏄彲浠ュ彂鍑哄0闊籌紝Mozart鍙槸涓虹幓鐠冪摱鍐欒繃鏇插瓙鐨勶紝鑰岃繖閲屾垜浠嵈涓嶈兘

GlassBottle beerBottle = .
vincent.playSolo(beerBottle);

鍥犱負(fù)鎴戜滑鍦ㄦ瀯閫燩erson綾葷殑鏃跺欙紝鎴戜滑鐨刾lay鏂規(guī)硶鏄緷璧栦竴涓被鍨嬩負(fù)Instrument鐨凮bject錛屾崲鑰岃█涔嬶紝鎴戜滑榪欓噷鎵璋撶殑Object-Oriented鍏跺疄縐頒綔Object-with-Type-Oriented鐨勬洿鍚堥傦紝鍏跺疄榪欑被璇█鏈変竴涓笓鏈夊悕璇嶏紝鍙仛static type object oriented銆傞偅Object-Oriented鏄笉鏄氨涓瀹氭槸Static Type Object Oriented鐨勫憿錛熶笉鐒?dòng)灱屾瘮濡傚湪Ruby閲岋紝鎴戜滑鍙互鍐欐垚錛?/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媯(gè)鏌ワ紝濡傛灉鏄帹婕旂殑璇濓紝鍦╬layNote閲岋紝鐢變簬thing璋冪敤浜?jiǎn)playNote鏂規(guī)硶錛屾墍浠ヤ紶榪涙潵鐨勫璞″繀欏昏鍒繪剰鎺ュ彈playNote榪欎釜娑堟伅錛屼簬鏄疓uitar鍜孏lassBottle閮芥槸鍙互閫氳繃錛屽洜姝ゆ垜鍗沖彲浠ユ紨濂忔垜鐨凱erez 711錛屼篃鍙互鏁茬幓鐠冪摱銆傝繖縐嶆柟寮忓彨鍋歞ynamic type銆?/P>

閭d箞static type鍜宒ynamic type鍖哄埆鍦ㄩ偅鍛紵static type璁や負(fù)錛宑lass灝辨槸type錛宼ype灝辨槸class; subclass灝辨槸subtyping錛宻ubtyping灝辨槸subclass(鍏跺疄榪欏彞涓嶄弗璋紝鍦╟++閲屽彲浠ヤ嬌寰梥ubclass涓嶆槸subtyping錛屼絾鏄痡ava閲屽氨娌″姙娉曚簡(jiǎn));鑰宒ynamic type鍒欒涓虹被鍨嬪拰class娌℃湁鍏崇郴錛岀被鍨嬪彇鍐充簬涓涓璞¤兘澶熸帴鍙楃殑娑堟伅銆?/P>

閭d箞鍝釜鎵嶆槸闈㈠悜瀵硅薄涔嬬湡璨屽憿錛熼仐鎲劇殑璇達(dá)紝static type騫朵笉鏄渶鍒濈殑闈㈠悜瀵硅薄銆備互瀵硅薄浣滀負(fù)妯″潡鍖栫殑鍗曚綅錛屽鑷猄imula 67銆備絾鏄疭imula 67騫朵笉鏄竴涓潰鍚戝璞$郴緇燂紝浠ョ洰鍓嶇殑瑙傜偣鏉ョ湅錛屽厖鍏墮噺鏄疧bject-based錛岀涓涓潰鍚戝璞¤璦褰撴帹Smalltalk錛孲malltalk鏄痙ynamic type鐨勩備笉榪嘢malltalk涓嶅お嫻佽錛岀涓涓ぇ闈㈢Н嫻佽鐨勯潰鍚戝璞¤璦鏄疌++錛孋++鏄痵tatic type鐨勶紝姝eLisp鏄涓涓嚱鏁板紡緙栫▼璇█錛屽緢澶歀isp鐨勭壒鎬ц褰撲綔鍑芥暟寮忚璦鐨勫叡鏈夌壒鎬?姣斿琛ㄦ槸鏈閲嶈鐨勬暟鎹粨鏋勶紝杞昏娉?涓鏍鳳紝鎵浠ュ緢澶氫漢浠ヤ負(fù)闈㈠悜瀵硅薄灝卞繀鐒舵槸static type錛堟瘮濡傝佸簞鍜屾垜錛夈傚浜庨潰鍚戝璞$殑璇В錛?0%鏉ヨ嚜C++銆備篃灝辨槸璇達(dá)紝80%鏉ヨ嚜浜巗tatic type鐨勯潰鍚戝璞$郴緇熴傚皢static type闈㈠悜瀵硅薄褰掑拵浜庢暣涓潰鍚戝璞★紝鎴戣緢瀹炲湪鏄ぇ鑰屾棤褰撹█榪囧叾瀹炪?/P>

鍚庨潰鎴戝啀涓涓灝嗚佸簞鎵璦涔婳O涓嶅綋涔嬪鍔犱互璇存槑



Raimundox 2005-12-20 19:58 鍙戣〃璇勮
]]>
A Walk on JSR220http://www.tkk7.com/raimundox/archive/2005/12/12/23427.htmlRaimundoxRaimundoxMon, 12 Dec 2005 03:08:00 GMThttp://www.tkk7.com/raimundox/archive/2005/12/12/23427.htmlhttp://www.tkk7.com/raimundox/comments/23427.htmlhttp://www.tkk7.com/raimundox/archive/2005/12/12/23427.html#Feedback1http://www.tkk7.com/raimundox/comments/commentRss/23427.htmlhttp://www.tkk7.com/raimundox/services/trackbacks/23427.html浠嶣JUG鐨刴aillist閲屽彂鎺樹(shù)竴涓垜浠ュ墠鐨勬棫甯栧嚭鏉ワ紝鍢垮樋

浠ュ墠鎴戝拰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錛屽吀鍨嬬殑涓瀵瑰錛屼竴鑸垜浠繖涔堝仛

1class Order {
2
3  private List<OrderItem> items;
4
5  public List<OrderItem> getItems() {
6     
7  }

8}


鍦↗2SE5閲岄潰錛?/P>

 1class 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>

1for (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
 2class ProductDescription {
 3  private String name;
 4  private String description;
 5  . and getters and setters
 6}

 7
 8@Entity(access = AccessType.FIELD)
 9class Product {
10  private ProdcutDescription description;
11}

鍦?SPAN class=st0 id=st name="st">JSR220閲岋紝濡傛灉涓涓猣ield鏄痚mbeddable錛岃屼笖瀵硅field娌℃湁鏍囨敞涓篅Transite,浠ュ強(qiáng)浣跨敤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
 2class DomainModel {
 3//  modeling your model here
 4}

 5
 6@Entity
 7class PersistentDomainModel extends DomainModel {
 8
 9   private long primaryKey;
10}

榪欎釜澶у灝變竴鐩簡(jiǎn)鐒朵簡(jiǎn)

4. Avoid Database Field in Domain Model Using @AttributeOverride


Annotation铏界劧綆鍖栦簡(jiǎn)寮鍙戯紝浣嗘槸浠嶇劧鏈変竴涓棶棰?WBR>錛屽氨鏄慨鏀筸apping鐨勬椂鍊欓渶瑕佷慨鏀逛唬鐮侊紝榪欎釜寰堜笉濂?WBR>錛岃屼笖褰卞皠鐨勬椂鍊欓渶瑕佸湪domain閲岀‖緙栫爜field
name錛岃繖涓畝鐩村氨鏄伓蹇?jī)锛屼絾鏄瘶q樻槸鐢卞姙娉曢伩鍏嶇殑銆?/P>

 1@EmbeddableSuperclass
 2class DomainModel {
 3//  modeling your model here
 4}

 5
 6
 7@Entity
 8@AttributeOverride(name="property", column=@Column(name="fieldName"))
 9class PersistentDomainModel extends DomainModel {
10
11   private long primaryKey;
12}

鍚屾牱錛岄氳繃緇ф壙鏉ラ殧紱繪妧鏈拰Domain錛岀劧鍚庡湪瀛愮被閲屼綔閮ㄧ講鐩?WBR>鍏崇殑鍔ㄤ綔銆傜劧鍚庢妸DomainModel鍜孭ersistentDomainModel 鍒嗗寘錛岄拡瀵笵omainModel緙栫▼錛屽氨O(jiān)k浜?WBR>銆傝繖涓椂鍊橠omain浼?xì)寮傚父鐨勻q插噣.....

5. Model Place as Factory

鍏跺疄榪欎釜鏄竴涓氬垯錛屼互鍓嶅ソ鍍忎篃璁ㄨ榪囥?/P>

1public 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閲屼篃鍙互鍋氾紝浣嗘槸鐢變簬姣旇緝楹葷儲(chǔ)錛屽ぇ瀹朵竴鑸繕鏄仛涓嶅埌銆?SPAN class=st0 id=st name="st">JSR220閲岋紝姝f槸閫氳繃瀹冪殑姣涚梾寮鴻揩鎴戜滑榪欎箞鍋?....錛堟睏錛夛紝涔熺畻浣撶幇鍑虹害瀹氫簡(jiǎn)銆?/P>

Raimundox 2005-12-12 11:08 鍙戣〃璇勮
]]>
Why Inconsistent Concepts Considered Harmfulhttp://www.tkk7.com/raimundox/archive/2005/12/10/23238.htmlRaimundoxRaimundoxFri, 09 Dec 2005 18:17:00 GMThttp://www.tkk7.com/raimundox/archive/2005/12/10/23238.htmlhttp://www.tkk7.com/raimundox/comments/23238.htmlhttp://www.tkk7.com/raimundox/archive/2005/12/10/23238.html#Feedback2http://www.tkk7.com/raimundox/comments/commentRss/23238.htmlhttp://www.tkk7.com/raimundox/services/trackbacks/23238.html灝弔ao緇欐垜鎵句簡(jiǎn)涓涓潪甯稿ソ鐨勯鐩?

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?".


鎴戞壙璁や互鍓嶆病鏈夎冭檻鍒拌繖涓棶棰橈紝鍥犱負(fù)鎴戜互涓鴻拷姹傛蹇典竴鑷存ф槸涓縐嶄笉璦鑷槑鐨勫ぉ鎬с傞偅涔堜負(fù)浠涔堣涓鑷存у緢閲嶈鍛紵鎴戞湁榪欐牱涓浜涙兂娉曘?/p>

1. 澶嶆潅鎬?/p>

姒傚康涓嶄竴鑷翠駭鐢熼鍏堜駭鐢熺殑涓涓伓鏋滃氨鏄鏉傛э紝榪欓噷鎴戝皢涓句袱涓緥瀛愩?br>
絎竴涓叧浜嶭isp鐨勩侺isp鏈韓鍏鋒湁涓涓緢涓鑷村緢綆鍗曠殑璁$畻妯″瀷鈥斺斘?婕旂畻銆傚湪榪欎釜璁$畻妯″瀷涓紝鍩烘湰鍏冪礌鏄嚱鏁幫紝位榪愮畻絎︼紝路榪愮畻絎︺傝涔変篃鏄畝鍗曟槑紜殑錛宭ambda榪愮畻絎︽彁鍙栧嚭鍑芥暟涓殑鑷敱鍙橀噺錛岀劧鍚庡啀鐢盿pply瀵硅嚜鐢卞彉閲忚祴鍊箋傛暣涓綆楄繃紼嬪氨鏄嚱鏁幫紙絎﹀彿錛夋眰鍊肩殑榪囩▼銆備緥濡傚浜庡嚱鏁皒 + y錛屾垜浠彲浠ヨ繖鏍鋒潵姹傚箋?/p>

((位x (位y . x + y)路3)路4)
=((位x. x+3)路4)
=4 + 3
=7

鐢變簬Lisp澶氬皯鍙互璁や負(fù)鏄?婕旂畻鐨勪竴縐嶅疄鐜幫紝鎴戜滑鍙互綾諱技鍐欏嚭Lisp浠g爜

(define f (lambda x (lambda y (+ x y))))
(apply (apply f 
34)

鎴栬呮洿鍔犵畝鍗曠殑鍐欎負(fù)

(define (f x y) (+ x y))
(f 
3 4)

鎵鏈夊湪Lisp涓殑紼嬪簭錛屾垜浠兘鍙互鐢ㄤ竴縐嶄竴鑷寸殑姒傚康鏉ヨ〃杈撅紝灝辨槸絎﹀彿姹傚鹼紝鎴戜滑瀵逛竴涓鍙峰簲鐢ㄤ竴浜涘鹼紝鐒跺悗榪欎釜絎﹀彿瀹屾垚璁$畻騫舵妸緇撴瀯榪斿洖緇欐垜浠紝鍦ㄨ綆楃殑榪囩▼涓紝絎﹀彿瀵瑰閮ㄧ幆澧冩病鏈変換浣曠牬鍧忓拰渚濊禆銆備絾鏄疞isp涓紩鍏ヤ簡(jiǎn)璧嬪鹼紝浜庢槸瀛樺湪涓浜涚鍙鳳紝涓嶄粎浠呮槸鏉ヨ綆楋紝鍚屾椂浠栦滑榪樿兘鏀瑰彉鐜銆?/p>

(define (bad-f x y) 
  (begin 
     (set
! z 5)
     (
+ x y)))

榪欎釜鍑芥暟涓嶄粎浠呮眰x + y鐨勫鹼紝鍚屾椂淇敼浜?jiǎn)绗﹀彿Z鐨勫箋傝祴鍊肩殑寮曞叆鐮村潖浜?jiǎn)鍑芥暟鍙眰鍊艱屼笉褰卞搷鐜榪欎釜姒傚康鐨勪竴鑷存с備簬鏄垜浠笉寰椾笉瀵繪壘涓涓洿鍔犲鏉傜殑涔熸洿鍔犳販涔辯殑璁$畻妯″瀷錛屾潵浠f浛綆鍗曚紭闆呯殑位 婕旂畻銆備簬鏄笉涓鑷寸殑姒傚康甯︽潵浜?jiǎn)鎬濈淮涓婄殑澶嶆潅鎬?涓嶈繃Lisp涓殑姒傚康涓嶄竴鑷撮櫎浜?jiǎn)漶旂敓浜?jiǎn)澶嶆潅涔嬪錛岃繕?gòu)葊鍙戜簡(jiǎn)浜轟滑瀵逛簬綆鍗曡綆楁ā鍨嬬殑鍚戝線浠庤屼駭鐢熶簡(jiǎn)鍑芥暟寮忕紪紼嬮鏍鹼紝榪欎篃鏄垜鏈鐖辯殑緙栫▼椋庢牸涔嬩竴)銆?/p>

姒傚康涓嶄竴鑷村甫鏉ョ殑澶嶆潅鎬ц窛紱繪垜浠渶榪戠殑搴旇鏄疛ava涓殑綆鍗曠被鍨嬶紝Java鏈韓鏄竴涓崟鏍圭殑闈㈠悜瀵硅薄璇█錛屼粠姒傚康涓婅涓鍒囬兘搴旇鏄璞★紝鑰屼笖鐢變簬鎬ц兘鑰冭檻鑰屽嚭鐜扮殑綆鍗曠被鍨嬶紝寮曞叆浜?jiǎn)浠f暟鎬х殑涓栫晫瑙傜殑鍚屾椂錛岀牬鍧忎簡(jiǎn)闈㈠悜瀵硅薄鐨勪竴鑷存蹇點(diǎn)侸ava涓櫧鐒舵湁鍖呰綾繪潵鍋氳ˉ鍋匡紝浣嗘槸浠嶇劧涓嶈兘寮ヨˉ姒傚康涓婄殑鏂銆傛垜浠彲浠ョ敤

1new Integer(3)

鏉ヤ唬琛ㄥ璞℃蹇典腑鐨?錛屼絾鏄?/p>

3 + 4 * 5

涓嶈兘瀵圭瓑鐨勭炕璇戜負(fù):

1new Integer(3+ new Integer(4* new Integer(5)

綆鍗曠被鍨嬪叿鏈夌殑榪愮畻絎﹀拰瀵硅薄綾誨瀷鐨勬秷鎭彂閫佹蹇典笂鏄笉涓鑷寸殑銆傝櫧鐒舵垜浠彲浠ュ湪Java 5涓嬌鐢ㄤ笂榪扮殑浠g爜錛屼絾鏄疛ava 5鐨凙uto-Boxing鏇村鐨勬妸瀵硅薄綾誨瀷褰撲綔綆鍗曠被鍨嬭繘琛屾暟鎹繍綆楋紝鑰屼笉鏄儚C++涓殑榪愮畻絎﹂噸杞戒竴鏍鋒妸鏁版嵁榪愮畻褰撲綔涓縐嶇壒孌婃秷鎭紶閫掞紝铏界劧璇硶涓婃湁鐩鎬技鐨勫姛鑳斤紝浣嗘槸姒傚康涓婂ぇ寮傚叾瓚o紝瀵逛簬鎴戣繖涓狾O鍒嗗瓙鑰岃█錛孞ava 5鐨凙uto-Boxing瀹炲湪鏄伓蹇?jī)鍒颁笉琛屻傚悓鏃剁畝鍗曠被鍨嬪拰瀵硅薄綾誨瀷鍦ㄨ祴鍊艱涔夊拰瀛樺偍妯″瀷涓婁篃瀛樺湪寰堝ぇ鐨勪笉涓鑷達(dá)紝榪欑涓嶄竴鑷存у湪浣跨敤Collection API鐨勬椂鍊欏甫鏉ヤ簡(jiǎn)涓浜涘鏉傚害銆傦紙榪樿寰桟ommons Collection閲岄偅浜汸rimitive Collection鍚э紵錛?br>
2.鍓綔鐢?/p>

姒傚康涓嶄竴鑷翠駭鐢熺殑絎簩涓伓鏋滃氨鏄壇浣滅敤錛屾垜澶ф鎯充簡(jiǎn)涓涓嬮兘鏈夊摢浜涘彲鑳界殑鍓綔鐢紝緇撴灉璁╂垜寰堝瘨錛屾垜鑳芥兂鍒扮殑鍓綔鐢紝澶у鏁版槸鐢變簬鍦ㄥ彟涓縐嶆ā鍨嬩腑寮曞叆浜?jiǎn)鍐瑷鐨勫洜绱犱粠鑰岄犳垚浜?jiǎn)姒傚康涓婄殑涓嶄竴鑷磋屽紩璧風(fēng)殑銆傚叾涓渶涓轟漢鐭ョ殑....榪樻槸璧嬪煎湪鍑芥暟寮忕紪紼嬩腑鐨勫壇浣滅敤...榪欎釜鍦ㄥ嚱鏁板紡緙栫▼紺懼尯鏈夊緢騫挎硾鐨勮璁猴紝鎴戝彧璇翠竴鐐癸紝涓轟粈涔堝懡浠よ璦鏄湁瀹崇殑銆?/p>

鍐璦鎴栬呰鍛戒護(hù)寮忚璦涓昏鐢ㄤ簬鍒葷敾瀵硅綆楁満鎿嶄綔鐨勫簭鍒楋紝騫朵笉鍏沖績(jī)搴忓垪鐨勫唴鍦ㄥ叧緋匯備篃灝辨槸璇達(dá)紝鎴戜滑鍙互鎶婁竴浜涘畬鍏ㄦ病鏈夎仈緋葷殑鎸囦護(hù)鍐欏湪涓璧楓傚洜姝ゅ啹璇█鍦ㄨ涔変笂姣棤寤烘爲(wèi)錛屽悓鏃跺湪鎶借薄涓婁篃姝㈡浜庡瓙紼嬪簭錛堜竴鐮f寚浠ゅ拰鍙︿竴鐮f寚浠わ級(jí)銆傚啹璇█鍏鋒湁寰堝己鐨勬椂闂磋﹀悎鎬у湪瀛樺偍涓婁篃寮虹儓鐨勫懼悜浜庣嚎鎬у瓨鍌ㄣ傜洰鍓嶅ぇ澶氭暟闅懼鐞嗙殑闂錛屽彲浠ュ綊緇撲負(fù)璁$畻妯″瀷鍜屾搷浣滆涔夌殑涓嶄竴鑷達(dá)紝鐢氳嚦鏈変簺瀛﹁呰涓烘槸鍐粨鏋勪弗閲嶅埗綰︿簡(jiǎn)璁$畻鏈虹殑鍙戝睍銆傚洜姝ゅ啹璇█琚嚱鏁扮ぞ鍖虹湅浣滀竴涓緢鍗遍櫓鐨勫壇浣滅敤錛屾瀬鍔涢伩鍏嶄箣銆?/p>

姒傚康鐨勪笉涓鑷翠駭鐢熺殑鍓綔鐢ㄥ湪娣瘋鐨凮O璇█涓篃寰堟槑鏄撅紝灝ゅ叾鏄湪鍛戒護(hù)寮忚璦涓姞鍏ラ潰鍚戝璞℃満鍒訛紝鑰屼笖浣跨敤闈㈠悜瀵硅薄浣滀負(fù)綾誨瀷緋葷粺鐨勬墿灞曪紝浣跨敤榪囩▼寮忕殑鏂規(guī)硶鏉ユ帶鍒舵祦紼嬨傝繃紼嬪拰瀵硅薄鐨勪笉涓鑷存湰韜氨緇欎簡(jiǎn)紼嬪簭鍛樹(shù)竴縐嶆殫紺猴紝浣犲彲浠ヤ嬌鐢ㄥ璞℃妧鏈潵鏋勯犵被鍨嬬郴緇燂紝鐒跺悗浣跨敤榪囩▼鐨勬柟娉曟潵鎿嶄綔浠栥傛槑鏄劇殑鍓綔鐢ㄤ滑寰堝鏄撲嬌鐢ㄨ繃紼嬪寲紼嬪簭錛屼粠鑰屼嬌寰楀璞″甫鏉ョ殑濂藉琚緢澶х殑鍓婂急浜?jiǎn)锛堝綋鐒舵垜浠湁閲嶆瀯鏉ュ讥琛q欎釜閿欒錛夛紝姣斿涓嬮潰涓涓緥瀛?鎴戜滑寰堝鏄撲粠鍐欏嚭涓嬮潰鐨勪唬鐮侊細(xì)

1if (order.getState() == Order.CANCEL)
2   do something for cancel;
3else if(order.getState() == Order.PAID)
4   do something for paid;
5else if(order.getState() == Order.DELIVERY)
6   do something for delivery

鑰屼笉鏄?br>

 1public 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
12class CancelState extends OrderState {
13
14   public void handler() {
15      do something for cancel;
16   }

17}

18
19order.getState().handle();

鍥犱負(fù)瀛樺湪榪囩▼鎬х殑鍏抽敭瀛梚f, while,澶勪簬鏂逛究鐨勮冭檻錛屾垜浠細(xì)鍐欏嚭絎竴縐嶉鏍肩殑浠g爜錛岃岃冭檻鍒版槗浜庣淮鎶わ紝鎴戜滑搴旇鍐欑浜岀椋庢牸鐨勪唬鐮併傚瓨鍦ㄤ袱縐嶄笉涓鑷寸殑涔﹀啓浠g爜鐨勯鏍鹼紝榪欎釜鏃跺欙紝鍓綔鐢ㄥ彇鍐充簬浣跨敤鐨勮璦OO鐨勭▼搴︼紝姣斿鍦–++閲屾洿瀹規(guī)槗鍐欏嚭絎竴縐嶉鏍肩殑浠g爜錛岃屽湪Ruby鍜孲malltalk涓紝鏇村鏄撳啓鍑虹浜岀椋庢牸鐨勪唬鐮併?br>

3.閫掑綊鐨勬瀯閫犺蔣浠?/p>

榪欎釜铏界劧璺熸蹇典竴鑷存湁鍏籌紝浣嗘槸涓涓洿澶х殑涓婚錛屽緟緇惂銆?/p>

4.浼橀泤錛岀編鎰熷拰鏃犲悕鍝佽川

姒傚康鐨勪竴鑷存т細(xì)浜х敓涓縐嶄紭闆呯殑緹庢劅錛屾垜瑙夊緱鎴戜滑閮芥湁榪欑鎰熻錛屽鏋滄垜浠兘鐢ㄤ竴縐嶄竴鑷寸殑瀹規(guī)槗鐞嗚В涓旂粺涓鐨勬柟寮忔潵澶勭悊澶氱涓嶅悓鐨勫鏉傜殑闂錛岄偅涔堟垜浠氨浼?xì)瑙夊緱杩櫩U嶆柟娉曞緢浼橀泤錛屼篃寰堝叿鏈夌編鎰熴傜被姣旂墿鐞嗕腑鐨勭墰欏垮畾寰嬶紝寮鏅嫆瀹氬緥錛岄害鍏嬫柉闊︽柟紼嬶紝閮芥槸榪欑綆鍗曚竴鑷磋岃В鍐沖鏉傞棶棰樼殑瀹岀編紺轟緥銆傛垜浠洿瀹規(guī)槗鎰熻鍒頒竴鑷寸殑鎰熷康浜х敓鐨勭編鎰燂紝鑰屼笉涓鑷寸殑姒傚康寰寰寰堥毦浠ゆ垜嬈h祻銆傛垨璁告棤鍚嶅搧璐ㄦ槸鎴戝涓鑷寸殑姒傚康鐨勪竴縐嶆ā緋婄殑瀹$編鍚с?/p>

鎴戝ぇ鎶佃兘鎯沖埌鐨勫氨榪欎箞澶氾紝涓嶇煡灝弔ao鏄惁婊℃剰鎴戠殑絳斿嵎銆?/p>

 



Raimundox 2005-12-10 02:17 鍙戣〃璇勮
]]>
Apologize to Object-Oriented Methodologyhttp://www.tkk7.com/raimundox/archive/2005/12/08/22986.htmlRaimundoxRaimundoxThu, 08 Dec 2005 07:11:00 GMThttp://www.tkk7.com/raimundox/archive/2005/12/08/22986.htmlhttp://www.tkk7.com/raimundox/comments/22986.htmlhttp://www.tkk7.com/raimundox/archive/2005/12/08/22986.html#Feedback1http://www.tkk7.com/raimundox/comments/commentRss/22986.htmlhttp://www.tkk7.com/raimundox/services/trackbacks/22986.html鏈榪戝涔?fàn)浜?jiǎn)涓涓婼malltalk錛岀劧鍚庢繁娣辯殑鍠滄涓婁簡(jiǎn)榪欎釜鍙よ佺殑璇█銆係malltalk璇█鍙叿鏈変竴涓緢灝忕殑璇█鏍稿績(jī)錛岃繖涓牳蹇?jī)鐢卞ぇ绾?0鍑犱釜鍏抽敭瀛楀拰涓浜涘熀紜鐨勯潰鍚戝璞¤涔夋瀯鎴愩傝屼笖鍏抽敭瀛楅兘鏄薄: . ; ( ) [ ] | := 涔嬬被鐨勭畝鍗曠鍙鳳紝騫舵病鏈夋彁渚涙渶鍩烘湰鎺у埗鐨勬祦紼嬨傛渶寮濮嬬殑鏃跺欒繖璁╂垜寰堣糠鎯戯紝铏界劧寰幆緇撴瀯鍙互鐢ㄩ掑綊琛ㄧず錛屼絾鏄垎鏀庝箞鍔烇紵鐒跺悗鍙戠幇浜?jiǎn)涓涓緢閰風(fēng)殑鐗規(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']

鍥犱負(fù)鍦⊿malltalk閲岋紝涓鍒囩殕瀵硅薄涓斾粠宸﹀埌鍙蟲(chóng)眰鍊鹼紝浜庢槸4 > 3 榪斿洖true錛宼rue鏄被True鐨勫敮涓瀹炰緥錛岀劧鍚庡氨鍙互瀵瑰畠鍙戦佹秷鎭紝ifTrue:錛屼簬鏄皟鐢ㄤ簡(jiǎn)^aBlock value.鏉ュ浼犺繘鍘葷殑BlockClosure姹傚箋?/P>


涓嬮潰鏄被浼肩殑java鐨勭被浼間唬鐮併?/P>

 

 1public 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
 9class 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
20class 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']灝卞彲浠ュ搴旂炕璇戜負(fù):

 

1Boolean condition = new Integer(4).isGreaterThan(new Integer(3));
2condition.ifTrue(new BlockClosure() {
3   public Object execite() {
4      System.out.println("Hello");
5      return null;
6   }

7}
);
8
9

榪欎釜鐪嬩技綆鍗曠殑搴旂敤錛屽嵈甯︽潵浜?jiǎn)涓や釜鏈夋繁鍒诲奖鍝嶇殑鎬ц川銆?/P>

絎竴錛岀敱浜巌f,else絳夌粨鏋勪笉鍐嶆槸棰勫畾涔夌殑璇硶浜?jiǎn)锛岃屼笌鎴戜滑鑷繁鍐欑殑浠g爜涓鏍鳳紝灞炰簬鑾竴涓被鐨勭壒瀹氭秷鎭紝閭d箞涔熷氨鎰忓懗鐫錛屾垜浠彲浠ュ儚ifTrue涓鏍鳳紝瀹氫箟鑷繁鐨勫垎鏀粨鏋勩?BR>姣斿
   aUser ifNotRegistered: [ do redirect to register page ]
         ifExpired: [ do redirect to active page ]

鍦ㄤ笉鑰冭檻鎬ц兘浼樺寲鐨勫墠鎻愪笅錛孲malltalk璁や負(fù)鍜?BR>   4 >3 ifTrue: [do something]
        ifFalse: [do somthing]

鏄叿鏈変竴鏍風(fēng)殑璇箟鐨勩傚茍涓嶅洜涓築oolean灞炰簬Kernel灝辨湁浠涔堜笉鍚屻傚洜姝ゆ帶鍒剁粨鏋勪篃灞炰簬涓涓彲緙栫▼鐨勫洜绱狅紝榪欏氨鏄疭malltalk鐨勮交璇硶鐗規(guī)с?/P>

絎簩錛屽湪綆鍗曠殑璇硶鍜屽畬鍏ㄧ殑闈㈠悜瀵硅薄璇箟涓紝鏋勯犱笌鍐渚濇浖寮忚璦瀹屽叏絳変環(huán)鐨勮兘鍔涳紙榪欑鑳藉姏鍦ㄨ娉曚笂琛ㄧ幇涓鴻祴鍊鹼紝鍒嗘敮錛岃凱浠e拰瀛愮▼搴忚皟鐢級(jí)錛屼簬鏄垜浠彲浠ュ畬鍏ㄧ敤涓鑷寸殑闈㈠悜瀵硅薄鐨勬柟娉曟潵鏋勯犺蔣浠躲?/P>

寰堥暱涓孌墊椂闂翠互鏉ワ紝鎴戦兘璁や負(fù)闈㈠悜瀵硅薄鏂規(guī)硶璁烘槸鍦ㄥ懡浠ゅ紡鐨勫啹璇轟緷鏇煎紡璇█鐨勫熀紜涓婏紝閫氳繃寮曞叆綾誨瀷緋葷粺鐒跺悗淇慨琛ヨˉ鐨勫緱鍒扮殑錛岀敱浜庡啹璇轟緷鏇艱璦寮忕殑璇█鏄潰鍚戞搷浣滃眰闈笂鐨勶紝鍙槸涓轟簡(jiǎn)鏇村ソ鐨勫埢鐢繪搷浣滆綆楃殑涓涓懡浠ょ殑搴忓垪錛屽洜姝ゅ啹璇█涓嶅彲閬垮厤鐨勫叿鏈変笉瀹屽鐨勮涔夛紝娣蜂貢鐨勬娊璞¤〃杈句互鍙?qiáng)绛壗{変竴緋誨垪鐨勯棶棰樸備綔涓哄啹璇█鐨勪竴涓ぇ琛ヤ竵鐨勯潰鍚戝璞℃柟娉曪紝鎴戜篃鎯沖綋鐒剁殑浠ヤ負(fù)浠栬櫧鐒舵湁浜?jiǎn)浜洏q涙錛屼絾鏄熀紜闂?shù)笂闈q樻槸涓嶈兘閬垮厤鐨勶紝鍔犱箣闈㈠悜瀵硅薄緙轟箯涓縐嶄竴鑷寸殑鏋勯犳柟娉曪紝寰堝鏃跺欐垜浠笉寰椾笉鍥炲綊鍒板懡浠ゅ紡鎴栬呰繃紼嬪紡鐨勬柟娉曟潵鏋勯犵郴緇燂紝浠庤岀牬鍧忔帀涓縐嶄竴鑷存竻鏅扮殑鎬濊礬錛屽湪榪囩▼鍜屽璞′箣闂翠笉浣忓湴鏉冭 錛堟瘮濡侱omain Model涔嬩簤錛夛紝榪欎釜璁╀漢闈炲父鐨勪笉鐖姐傚湪灝濊瘯浜?jiǎn)涓浜涢潰鍚戝璞¤璦涔嬪悗錛堟垜鏄湪95騫存帴瑙++鐨勬椂鍊欏紑濮嬩簡(jiǎn)瑙i潰鍚戝璞$殑錛岃屽悗涓昏浣跨敤Java鍋氫負(fù)寮鍙戣璦錛夛紝鎴戝彂鐜拌繖涓棶棰樻槸寰堥毦閬垮厤錛屼簬鏄垜鏂█榪欐槸闈㈠悜瀵硅薄鎶鏈湰韜殑闂錛岀幇鍦ㄧ湅鏉ヤ笉榪囪嚜宸辨墍瀛︽湁闄愶紝娌℃湁鐪熸鐢ㄨ繃綰潰鍚戝璞¤璦鑰屽凡錛屾睏棰滃緱寰堝晩銆傝繖閲屽悜闈㈠悜瀵硅薄鏂規(guī)硶閬撲釜姝夛紝鍢垮樋銆?/P>

Raimundox 2005-12-08 15:11 鍙戣〃璇勮
]]>
主站蜘蛛池模板: 精品少妇人妻AV免费久久洗澡| 今天免费中文字幕视频| 成人午夜免费视频| 久久久久国色AV免费观看| 成人无码WWW免费视频| 五月婷婷在线免费观看| 在线精品免费视频| 亚洲AV日韩精品一区二区三区| 亚洲AV无码一区二区三区久久精品 | 国产AⅤ无码专区亚洲AV| 亚洲成AV人片一区二区| 亚洲国产成AV人天堂无码| 久久人午夜亚洲精品无码区| a级毛片免费高清视频| 中文字幕免费在线观看| 夫妻免费无码V看片| 不卡精品国产_亚洲人成在线| 亚洲一区二区三区电影| 亚洲国产成人AV在线播放| 本道天堂成在人线av无码免费| 999任你躁在线精品免费不卡| 天天操夜夜操免费视频| 在线精品亚洲一区二区小说| 亚洲性无码av在线| 日日躁狠狠躁狠狠爱免费视频| 一级成人a毛片免费播放| 日本高清免费中文字幕不卡| 亚洲国产精品一区二区久久hs| 亚洲大成色www永久网址| 国产黄片不卡免费| 在线观看视频免费完整版| 国产成人亚洲精品影院| 亚洲一区在线免费观看| 国产裸体美女永久免费无遮挡| 91情侣在线精品国产免费| 亚洲中文字幕无码专区| 国产成人亚洲精品| 精品国产麻豆免费人成网站| 午夜两性色视频免费网站| 亚洲成人动漫在线| 特黄特色大片免费|