锘??xml version="1.0" encoding="utf-8" standalone="yes"?>
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.”
]]>
浠婂ぉ鏃╀笂鎵撳紑Google Reader灝辯湅瑙佽繖涔堜竴綃囷紝鍐呭鍊掍篃緗簡(jiǎn)錛屼笉榪囨槸bad smell鐨勫彟涓涓悕瀛楄屽凡錛岀‖瑕佹壇涓婂垎姘翠篃鍙兘綆楁槸鍕夊媺寮哄己銆備笉榪囬儊闂風(fēng)殑鏄紝绔熺劧鏄釜媧嬩漢鐨勬墜絎旓紝鍥藉涓嶆槍瀹炰笉鑳戒笉浠ゆ垜杈堝績(jī)蹇у晩銆?br>
p.s. 棰勮鏈潵6涓湀鍙eご紱咃細(xì)"浣犺繖鍐欏綋蹇?jī)鍧忎簡(jiǎn)椤圭洰鐨勯姘?
]]>
娉ㄦ剰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鍟?..
]]>
姣忎釜Church number閮芥槸涓涓帴鍙椾袱涓弬鏁扮殑鍑芥暟錛岃繖涓や釜鍙傛暟鍙堥兘鏄嚱鏁幫紝絎竴涓弬鏁扮О涓哄悗緇у嚱鏁幫紝絎簩涓弬鏁板垯鍙仛闆剁偣鍑芥暟銆備緷鎹繖涓や釜鍑芥暟錛屾垜浠彲浠ュ畾涔塁hurch number zero, one, two錛?br />
(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ì)
(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 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 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 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)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瀛樺偍瀹炵幇嫻偣涔熶笉鏄笉鍙兘鐨勪簨鎯?..
]]>
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>
涓嶅悓浜嶧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ù):
寰堣嚜鐒?dòng)灱屼竴涓緇冩湁绱犵殑紼嬪簭鍛樹(shù)細(xì)閲嶆瀯鍑哄涓嬩唬鐮?
涔嬪悗鏃犺鏄痯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閲屾槸甯歌鐨勫仛娉曪紝浣嗘槸浠嶇劧涓嶅濂斤紝鎴戜滑鍙互鍋氫竴浜涘皬鐨勫彉鍖栦互寰楀埌鏇村ソ鐨勬祴璇?
鍩烘湰涓婅繖鍙笉榪囨槸"鍙︿竴縐嶅啓娉?鑰屽凡錛屼絾鏄畠鏇村ソ鐨勮〃杈句簡(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錛屾坊鍔犳柟娉?
鐒跺悗鍦╟om.thoughtworks.selenium.DefaultSelenium涓坊鍔犲疄鐜?
鐒跺悗璇曢獙涓涓?
鍦ㄦ垜浠嬌鐢ㄧ函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 />
鑰佸簞鏄弽瀵逛竴鍒囩殕瀵硅薄鐨勶紝鑰孴rustNo1鍦╦avaeye鐨勪竴綃囧笘瀛愪笂璇?
鎴戝厛璇撮潰鍚戝璞$殑鐞嗚鍩虹鐨勯棶棰橈紝鑷充簬涓鍒囩殕瀵硅薄紼嶅悗鍐嶈〃銆?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>
鐒跺悗鎴戜滑灝卞彲浠?/P>
鑷劧鐨勶紝濡傛灉鎴戣皟鐢?/P>
浼?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暟鐨勭郴緇熺殑璇濓紝鎴戜滑鍙互鎶婃暟鍊艱〃紺烘垚鍗曞煎嚱鏁?
榪欎釜涓滆タ鏃犺緇欎粈涔坸閮借繑鍥?錛岀劧鍚庢牴鎹甽ambda婕旂畻閲岀殑alpha鍙樻崲錛岃繖涓猯ambda鎶借薄絳変環(huán)浜庢暟鍊?銆傚洜姝わ紝瀵逛簬鎵鏈夌殑鏁板鹼紝鎴戜滑鍙互鎸塴ambda婕旂畻澶勭悊銆?/P>
絎簩涓槸bool鐨勮〃杈撅紝涔熷氨鏄浣曢昏緫榪涜lambda鎶借薄錛屼笅闈㈡垜鐩存帴緇欏嚭浜?jiǎn)锛尵~虹渷璁や負(fù)澶у閮界湅浜?jiǎn)SICP錛屽Scheme涔熼鏈夊績(jī)寰椼?/P>
鐒跺悗鎴戝氨鍙互鍋氫竴涓祴璇?/P>
鍥犳錛屽浜庢墍鏈塨ool鎴戜滑鍙互鎸塴ambda婕旂畻鏉ュ鐞?/P>
絎笁涓槸鑷畾涔夌被鍨嬶紝榪欓噷鎴戜滑榪樻槸鍏堢湅涓涓狶isp閲岀殑渚嬪瓙錛屽簭瀵廣?/P>
榪欓噷渚濇棫鏄痟igh-order錛屾垜浠潵嫻嬭瘯
榪欓噷澶у鑷繁鐢╞eta瑙勭害綆椾竴涓嬶紝灝卞彂鐜扮殑紜槸榪欐牱鐨勩傝繖閲屾垜浠張鍙互鐪嬪埌錛屽湪lambda婕旂畻閲岋紝鏍規(guī)湰娌℃湁鏁版嵁鎴栬呯被鍨嬨傛湁鐨勬案榪滃悇縐嶅悇鏍風(fēng)殑lambda鎶借薄鑰屽凡(鐩墠宸茬粡鏈変簡(jiǎn)甯︾被鍨嬬殑lambda婕旂畻)銆傝繖閲岃涓鍙ラ澶栬瘽錛孲ICP閲岀殑Data as Procedure鍏跺疄灝辨槸鍦ㄨ榪欎釜闂錛屼笉榪囦粬娌℃槑璇達(dá)紝鑰屾槸鐢ㄤ簡(jiǎn)涓縐嶇壒孌婄殑鐢ㄦ硶鑰屽紩鍑轟簡(jiǎn)娑堟伅浼犻掗鏍鹼紝鎴戣寰楄繖閲孲ICP鏈変簺欏炬澶卞郊錛屽浜巇ata as procedure鎴戞葷粨鐨勪竴鑸艦寮忔槸
緇間笂鎵榪幫紝鎴戜滑鐪嬪埌鍦╨ambda婕旂畻閲岋紝涓鍒囬兘鏄痩ambda鎶借薄錛岀劧鍚庡浜庝笉鍚岀殑lambda鎶借薄浣跨敤alpha鍙樻崲錛宐eta瑙勭害鍜宔ta瑙勭害錛岃〃榪板悇縐嶄笉鍚岃綆椼傜湅錛屽湪闈㈠悜瀵硅薄涔嬪墠灝卞凡緇忔湁浜?jiǎn)涓鍒囩殕鏌愭煇鐨勫畬緹庣殑璁$畻鐞嗚瀛樺湪浜?jiǎn)銆傝屼笖鍥為【涓涓嬶細(xì)
鎴戜滑鏈夌悊鐢辮錛屽璞″叾瀹炲氨鏄竴涓猯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>
鍓嶉潰宸茬粡璇磋繃浜?jiǎn)锛尵lф壙鑷沖皯鏈?涓涔? 瀹炵幇緇ф壙鍜岀被鍨嬬戶鎵匡紝鍦ㄨ鏄庤繖涓や釜涓滆タ涔嬪墠錛屾垜浠戶緇潵鐪嬩笂闈㈢殑渚嬪瓙
鐜板湪鎴戜滑鐪媝layBWV996榪欎釜娑堟伅錛孊WV996鏄疊ach鎵鍐欎竴涓瞾鐗圭惔緇勬洸錛岄瞾鐗圭惔鏄脊鎷ㄤ箰鍣紝鍚屾椂涔熸槸鍜屽0涔愬櫒(鎵璋撳拰澹頒箰鍣ㄥ氨鏄彲浠ユ紨濂忓拰澹?銆傚湪寰堝涔愬櫒涓婇兘鏈夋敼緙栫殑鐗堟湰錛屾瘮濡傞瞾鐗圭惔鐨勮繎浜插悏浠栫瓑絳夛紝榪欎釜鏃跺欙紝鎴戜滑鍙互瀹炵幇榪欐牱鍑犱釜綾?/P>
鐒跺悗鎴戜滑鍙互灝濊瘯浠ユ璋冪敤
鏈鍚庝竴涓細(xì)寰楀埌涓涓猰essageNotUnderstand鐨勯敊璇備篃灝辨槸璇達(dá)紝瀵逛簬Bass鑰岃█鐢變簬涓嶈兘婕斿鍜屽0浠庤屼笉鑳芥紨濂廈MV996(涓嶈繃榪欎釜涓栫晫涓婅兘浜哄お澶氫簡(jiǎn)...鍝?錛屾垜浠崲鍒伴潤(rùn)鎬佺被鍨嬮潰鍚戝璞$郴緇熸潵鐪嬨?BR>瀵逛簬絎竴涓柟娉曪紝playSolo鐨勬椂鍊欐垜浠姹傜殑綾誨瀷鏄兘澶熸紨濂忓崟闊崇殑銆傛垜浠彲浠ュ啓鍑烘潵
瀵逛簬絎簩涓柟娉曪紝playChord鐨勬椂鍊欐垜浠姹傜殑綾誨瀷鏄兘澶熸紨濂忓拰寮︾殑錛屾垜浠彲浠ュ啓鍑烘潵
鑰屽浜庣涓変釜鏂規(guī)硶錛宲layBWV996鐨勬椂鍊欐垜浠姹傛棦鑳芥紨濂忓拰寮︿篃鑳芥紨濂忓崟闊籌紝榪欎釜鏃跺欏嚭鐜頒竴涓棶棰橈紝鎴戜滑鎬庝箞澶勭悊Instrument鐨勭戶鎵垮叧緋?涓涓兘婕斿鍜屽雞鐨勪箰鍣ㄦ槸鍚﹀彲浠ユ紨濂忓崟闊?絳旀鏄竴鑸岃█鏄殑錛屼絾鏄篃涓嶆帓闄ゆ湁涓浜涗笉鏄繖鏍風(fēng)殑)?榪樻槸鎴戜滑綆鍗曠殑鍐?
鎴栬?/P>
瀵逛簬鍔ㄦ佺被鍨嬬畝鍗曠殑闅愭х被鍨嬬害瀹氾紝鏄劇ず鐨勭被鍨嬬郴緇熷甫鏉ョ殑涓涓壇浣滅敤灝辨槸鎴戜滑蹇呴』澶勭悊綾誨瀷涔嬮棿鐨勫叧緋匯?STRONG>娉ㄦ剰榪欓噷鏄被鍨嬩箣闂寸殑鍏崇郴錛岃屼笉鏄璞′箣闂寸殑鍏崇郴銆傝佸簞鍚屽織鎵逛簡(jiǎn)寰堝綃囩殑闈㈠悜瀵硅薄鐨勬娊璞★紝闈㈠悜瀵硅薄鐨勭被鍨嬬郴緇熶互鍙?qiáng)闈㈠悜瀵硅薄鐨勬湰浣撹锛?STRONG>鍏跺疄閮藉湪鏄湪綾誨瀷鍏崇郴涓婃姌鑵撅紝鑰屼笉鏄湪瀵硅薄鍏崇郴涓婃姌鑵?/STRONG>銆傝屼簨瀹炰笂闈㈠悜瀵硅薄鐨?STRONG>綾誨瀷緋葷粺騫墮潪蹇呯劧灝辨槸闈?rùn)鎬佺被鍨嬬郴緇燂紝鑰屾垜浠殑綾諱箣闂寸殑鍏崇郴涓嶄竴瀹氬氨鍜岀被鍨嬬殑鍏崇郴鐩鎬竴鑷淬?/STRONG>灝卞儚涓婁緥鎵紺猴紝鍦⊿malltalk閲岋紝Lute錛孏uitar鍜孊ass涔嬮棿娌℃湁浠諱綍鐨勭戶鎵垮叧緋伙紝浣嗘槸瀵逛簬person鐨?涓秷鎭岃█錛屽畠浠嵈鏄湁綾誨瀷鐨勩?BR>
鍥犳鑰佸簞鎵鎵圭殑錛屾槸瀵硅薄綾誨瀷緋葷粺鐨勬娊璞¤兘鍔涳紝鑰岄潪闈㈠悜瀵硅薄鐨勬娊璞¤兘鍔涖傛濡備粬鍦ㄧ被鍨嬬郴緇熼噷鎵緇欑殑渚嬪瓙錛岄偅寮犱粬璁や負(fù)寰堝け璐ョ殑闈㈠悜瀵硅薄鐨勫浘錛屽叾瀹炲彲浠ュ畬鍏ㄤ笉渚濊禆緇ф壙鏉ュ疄鐜幫紝鑰屽榪欎釜綾誨瀷緋葷粺鐨勬秷璐硅呰岃█錛屼粬浠兘澶熶互涓瀹氱殑綾誨瀷鐨勮鐐癸紝鏉ュ鐞嗚繖涓郴緇熺殑瀵硅薄銆?/P>
鑰岃佸簞鏈鍚庝竴涓粨璁?
鎴戠殑鐪嬫硶鏄紝榪欏彞璇濇牴鏈氨鏄杈╋紝鍓嶉潰鍗婂彞鐨勪富璇槸鈥滀竴涓被鍨嬧濓紝鍚庨潰鍗婂彞鐨勪富璇槸"OO"... 姘旂悆鍜屼繚闄╁錛屽浜巄allon榪欎釜鏂規(guī)硶鑰岃█鏄竴涓被鍨嬶紝閮芥槸"鏈夊嚑鍒?鍙互鍚硅搗鏉ャ備絾鏄垜鎬庝箞瀹氫箟涓涓簿紜殑鏈川錛烞allonable錛熻繕鏄疢akeFromLatexAndVeryThin?鎴栬呯畝鍗曡FlexableAndThin錛?/P>
鍦ㄧ戶鎵胯繖涓鐐逛笂錛屾垜鎯寵佸簞寮曟枃涓?Elminster鐨勮瘽鏄粠浜嬬墿鐨勭壒寰佷笌灞炴у綊綰沖嚭瀹冪殑鈥滅被鍨嬧濄傛伆鎭板浜庨潤(rùn)鎬佺被鍨嬮潰鍚戝璞$郴緇熸槸鍙鐨勩傚鎴戝墠鏂囨墍榪幫紝鎴戞妸涓涓猳bject鍜屾墍鏈塻ender鐨勭害瀹氾紙涔熷氨鏄痠nterface錛夛紝緇ф壙鍦ㄤ竴璧鳳紝鎭版伆灝辨槸涓涓涓烘伆褰撶殑綾誨瀷瀹氫箟銆?BR>
铏界劧鍓嶅崐鍙ユ槸瀵圭殑錛屼絾鏄崲涓鏍瘋娉曞彲鑳芥洿濂?"鎵鑳芥帴鍙楃殑鎿嶄綔鍙嶆槧浜?jiǎn)鍏舵湰璐?/STRONG>"錛岄潰鍚戝璞℃湰韜氨娌℃湁璇存垜瑕佸仛涓涓湰璐ㄦ娊璞★紝榪欎竴鐐瑰湪Smalltalk鐨勭被鍨嬪垽鏂搷浣滀笂鐨勫彲鑳芥槸涓涓綈璇侊紝Smalltalk鐢╥sKindOf鏉ュ垽鏂戶鎵垮叧緋伙紝鎴戜滑鏉ョ帺涓涓枃瀛楁父鎴忥紝鏀規(guī)垚淇氳灝辨槸kinda錛屼篃灝辨槸"鏈変竴鐐癸紝鏈夊嚑鍒?鐨勬剰鎬濓紝鑰屼笉鏄錛屸滃氨鏄濓紝鎴栬呪滀粠鍒嗙被瀛︿笂鍙瘉鏄庝箣綾葷殑鍚箟鈥濄傛垜鍐嶄婦涓涓緦榫婄殑渚嬪瓙銆?/P>
vincent ballon: AirBallon new.
vincent ballon: Condom new.
鑰屽浜庡姩鎬佺被鍨嬬郴緇熼噷鐨勯潰鍚戝璞¤璦錛岀戶鎵跨殑涔熸湁綾誨瀷緇ф壙鐨勫惈涔夛紝浣嗘槸騫朵笉鏄敮涓鐨勯斿緞銆傜敤涓鍙ユ垜浠父璇寸殑璇濓紝鍦ㄩ潤(rùn)鎬佺被鍨嬬郴緇熼噷錛岀被鍨嬪拰綾繪槸绱ц﹀悎鐨勶紝鍔ㄦ佺被鍨嬬郴緇熶腑浠栦滑鐨勮﹀悎姣旇緝鏉俱?BR>
浠庢鑰岃錛屾墍鏈夊浜庨潰鍚戝璞$殑鍝插鑰冭檻浠ュ強(qiáng)鏈綋鐨勬濊冿紝瀵逛簬鍔ㄦ侀潰鍚戝璞$郴緇熷凡緇忎笉鏄偅涔堣揩鍒囦簡(jiǎn)銆傝屾妸瀵硅薄綾誨瀷緋葷粺鐨勪笉瓚沖綊鍜庝簬闈㈠悜瀵硅薄鐨勪笉瓚籌紝涔熶技涔庤鎹笉瓚熾?/P>
鍏充簬鎺ュ彛鐨勯棶棰樿佸簞璇村浜?jiǎn)锛寴q欎釜涓滆タ騫朵笉灞炰簬闈㈠悜瀵硅薄鐨勬蹇碉紝鑰屼笖鍦ㄥ姩鎬佺被鍨嬮潰鍚戝璞¤璦(姣斿Ruby, Smalltalk閲?錛屾牴鏈病鏈夎繖涓笢瑗褲傝繖鏄竴涓函綺圭殑闈?rùn)鎬佺被鍨嬮潰鍚戝璞¤璦鐨勭壒鎬э紝鎴栬呯洿鎺ヨ錛屾帴鍙e氨鏄竴涓函綾誨瀷(Type)銆傝繕鏄笂嬈$殑渚嬪瓙錛?/P>
鍦ㄦ垜鎺ヨЕSmalltalk鐨勬渶寮濮嬬殑涓孌墊椂闂撮噷錛岃繖縐嶅湴鏂規(guī)槸璁╂垜鏈闅懼彈錛屾垜宸茬粡涔?fàn)鎯簡(jiǎn)鐢ňc誨瀷杈呭姪鎴戠殑鎬濈淮錛屼絾鏄垜鍙戠幇鎴戝湪Smalltalk閲屽仛涓嶅埌錛岃櫧鐒舵垜鍙互鍐欏嚭
浣嗘槸浠栧嵈涓嶆槸涓涓帴鍙o紝鎴戝彲浠ュ緢鐢?/P>
鏉ユ瀯閫犱竴涓狪nstrument涔嬪悗鍦ㄥ畠涔嬩笂璋冪敤playNote鏂規(guī)硶錛岀劧鑰屾垜浼?xì)寰楀堫C竴涓猰essageNotUnderstand鐨勯敊璇紝Smalltalk鍜孯uby閲屾病鏈堿bstract鐨勬蹇點(diǎn)備篃灝辨槸璇碼bstract method錛宎bstract class浠ュ強(qiáng)interface錛岄兘涓嶆槸闈㈠悜瀵硅薄鐨勬蹇碉紙鎴栬呬弗鏍間竴浜涜錛岄兘涓嶆槸闈㈠悜瀵硅薄鐨勫繀欏葷殑姒傚康錛夛紝鑰屾槸闈㈠悜瀵硅薄綾誨瀷緋葷粺鐨勬蹇點(diǎn)傞偅涔堝湪Smalltalk閲屾垜浠細(xì)鎬庝箞鍋氬憿錛?/P>
瀵逛簬playSoloOnInstrument:instrument錛屾垜浠浜巌nstrument鐨勭被鍨嬫槸鏈夎姹傜殑錛屽氨鏄畠蹇呴』鑳藉鎺ュ彈playNote榪欎釜娑堟伅銆傚綋鐒惰繖涓被鍨嬮渶瑕佹槸闅愭э紝鎴戜篃鍙互瀵圭瓑鐨勫啓鍑洪潤(rùn)鎬侀潰鍚戝璞$殑浠g爜鎶婅繖涓殣鎬х殑綾誨瀷鏄劇ず鐨勮〃紺哄嚭鏉?
鍚屾牱瀵逛簬絎簩涓柟娉曟垜浠篃鍙互鍐欏嚭鏉?
濡傛灉鎴戜滑闇瑕佸浜庝竴涓殑娑堟伅涔熸槸涓鏍風(fēng)殑錛屾瘮濡?/P>
鍚屾牱榪欎釜鏃跺欓殣鎬х殑綾誨瀷闇瑕佸氨鏄?/P>
閭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鏉ュ疄鐜扮殑
榪欎篃鏄疌++閲屼負(fù)鏁頒笉澶氱殑subclass涓嶆槸subtype鐨勪緥瀛愩?/P>
2.綾誨瀷緇ф壙錛岃繖涓湪C++鍜宩ava閲屾湁錛岃屽湪smalltalk,ruby鏈夊嵈涓嶆槑鏄俱?/P>
綾誨瀷緇ф壙鐨勬瀬鑷村氨鏄疌++閲岀殑綰櫄鐖剁被
涔熷氨鏄痡ava閲岀殑interface
鍥犳錛屼篃灝辨槑浜?jiǎn)浜?jiǎn)錛屾墍璋撯滈潰鍚戞帴鍙g紪紼嬧濇槸浠ョ被鍨嬩綔涓虹害瀹氱殑緙栫▼銆傛垜瑙夊緱榪欑偣澶у涓瀹氫笉闄岀敓錛岄潰鍚戞帴鍙g殑緙栫▼閲宨nterface閮藉緢灝忚屼笖綰﹀畾鏄庣‘銆備絾鏄璇存槑涓鐐圭殑鏄紝榪欎釜涓滆タ鍜?闈㈠悜鎶借薄鑰屼笉瑕侀潰鍚戝叿浣撶紪紼?鍏跺疄榪樹(shù)笉涓鏍鳳紝鎵浠ヨ繖涓笢瑗夸篃灝變粎浠呰兘綆楁槸闈?rùn)鎬佺被鍨嬮潰鍚戝璞$殑涓涓儻鐢ㄦ硶錛岃繕鍒頒笉浜?jiǎn)鍘熷垯杩欎箞楂樸?/P>
緇忚繃縐嶇涔嬪悗錛屽彂鐜板綋鍒濇墍璋撻福OO涔嬩撫閽燂紝瀹炲湪鏄█榪囧叾瀹炪?BR>--------------------------------------------------------------------------------------------------------------------------------------------------------------
絎? 鍏充簬"闈㈠悜瀵硅薄"
鏃㈢劧瑕佷負(fù)浜哄鏁蹭撫閽燂紝鍏堣鎵懼浜?jiǎn)鑻︿富锛屼笉鐒跺矀涓嶆槸鐧藉繖娲讳簡(jiǎn)涓鍦恒備粈涔堟槸闈㈠悜瀵硅薄錛熻繖涓棶棰樺お澶э紝鎴戜滑涓句竴涓緢甯歌鐨勪緥瀛愶細(xì)
榪欎釜渚嬪瓙鑷劧寰堜笉鍏呭垎錛屼笉榪囩戶鎵垮晩錛屾帴鍙e晩錛屽鎬佸晩錛岀暐涓懼ぇ姒傦紝灝氬彲浠ヤ綔涓轟竴涓璁虹殑渚嬪瓙銆備粠榪欎釜渚嬪瓙閲岋紝鎴戜滑鍙戠幇鏈夎繖鏍蜂竴涓簨瀹烇紝灝辨槸Person綾繪湁涓や釜鏂規(guī)硶
鍒嗗埆琛ㄧず錛岄渶瑕佷竴涓被鍨嬩負(fù)Instrument鐨勫璞nstrument錛岀劧鍚庡浠栬繘琛岀浉搴旂殑鎿嶄綔錛岃屼笖錛屼粠姒傚康涓婃潵璁詫紝絎竴涓柟娉曪紝浣挎紨濂忔棆寰嬬殑錛屼篃灝辨槸鍗曢煶錛岃岀浜屼釜鏂規(guī)硶鏄紨濂忓拰澹扮殑銆傞偅涔堬紝濡傛灉鎴戞湁涓涓被
鎴戜滑鐭ラ亾錛岀幓鐠冪摱瑁呬簡(jiǎn)姘翠篃鏄彲浠ュ彂鍑哄0闊籌紝Mozart鍙槸涓虹幓鐠冪摱鍐欒繃鏇插瓙鐨勶紝鑰岃繖閲屾垜浠嵈涓嶈兘
鍥犱負(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>
鐒跺悗灝卞彲浠?/P>
鍚屾牱涔熷彲浠?/P>
鍦ㄨ繖閲岋紝綾誨瀷鍙互鎺ㄦ紨涔熷彲浠ョ暀鍒皉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鐨勶紝姝eLisp鏄涓涓嚱鏁板紡緙栫▼璇█錛屽緢澶歀isp鐨勭壒鎬ц褰撲綔鍑芥暟寮忚璦鐨勫叡鏈夌壒鎬?姣斿琛ㄦ槸鏈閲嶈鐨勬暟鎹粨鏋勶紝杞昏娉?涓鏍鳳紝鎵浠ュ緢澶氫漢浠ヤ負(fù)闈㈠悜瀵硅薄灝卞繀鐒舵槸static type錛堟瘮濡傝佸簞鍜屾垜錛夈傚浜庨潰鍚戝璞$殑璇В錛?0%鏉ヨ嚜C++銆備篃灝辨槸璇達(dá)紝80%鏉ヨ嚜浜巗tatic type鐨勯潰鍚戝璞$郴緇熴傚皢static type闈㈠悜瀵硅薄褰掑拵浜庢暣涓潰鍚戝璞★紝鎴戣緢瀹炲湪鏄ぇ鑰屾棤褰撹█榪囧叾瀹炪?/P>
鍚庨潰鎴戝啀涓涓灝嗚佸簞鎵璦涔婳O涓嶅綋涔嬪鍔犱互璇存槑
鍦↗2SE5閲岄潰錛?/P>
灝卞彲浠ョ洿鎺ユ潵澶勭悊錛?/P>
浠庢煇縐嶇▼搴︿笂鍒╃敤enhanced for鐨勮娉曪紝鏉ョ畝鍖栬娉曘?BR>
trade-off: 涓嶉傚悎澶氫釜details 鑱氬悎錛岄傚悎浜庣畝鍗曠殑moment-interval鍜宮omen
2. Annotate Description with @Embeddable, and the Thing it describe with @Entity
渚嬪瓙錛孭roduct鍜孭roductDescription
鍦?SPAN class=st0 id=st name="st">JSR220閲岋紝濡傛灉涓涓猣ield鏄痚mbeddable
榪欎釜鍩烘湰娌″彂鐜皌rade-off
3. Avoid Database Primary Key in Domain Model Using @EmbeddableSuperclass
渚嬪瓙錛屽湪hibernate閲岋紝鎬繪槸瑕佺粰Domain鍔犱竴涓猵r
铏界劧涔熷彲浠ラ氳繃緇ф壙緇撴瀯鏉ラ伩鍏嶏紝浣嗘槸閰嶇疆鏂囦歡澶錛?JSR220閲岋紝閫氳繃鑷姩澶勭悊鐨刟nnotation
榪欎釜澶у灝變竴鐩簡(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>
鍚屾牱錛岄氳繃緇ф壙鏉ラ殧紱繪妧鏈拰Domain錛岀劧鍚庡湪瀛愮被閲屼綔閮ㄧ講鐩?WBR>鍏崇殑鍔ㄤ綔銆傜劧鍚庢妸DomainModel鍜孭ersistentDomainModel 鍒嗗寘錛岄拡瀵笵omainModel緙栫▼錛屽氨O(jiān)k浜?WBR>銆傝繖涓椂鍊橠omain浼?xì)寮傚父鐨勻q插噣.....
5. Model Place as Factory
鍏跺疄榪欎釜鏄竴涓氬垯錛屼互鍓嶅ソ鍍忎篃璁ㄨ榪囥?/P>
鍩烘湰涓婁笅鍗?涓皬鏃剁殑鎴愭灉灝辮繖涔堝錛屾垜鏄湪灝濊瘯鐢?SPAN class=st0 id=st name="st">JSR220 API浠f浛浠ュ墠鎴戝拰limo鍐欑殑閭d釜鐝嶇彔鍟嗗煄璁㈠崟閮ㄥ垎寰楀埌鐨勪竴浜?WBR>tips銆傛諱綋鑰岃█錛?SPAN class=st0 id=st name="st">JSR220榪樻槸鎸哄ソ鐨勶紝鎴戜滑鍙互寰堣嚜鐒剁殑
]]>
鎴戞壙璁や互鍓嶆病鏈夎冭檻鍒拌繖涓棶棰橈紝鍥犱負(fù)鎴戜互涓鴻拷姹傛蹇典竴鑷存ф槸涓縐嶄笉璦鑷槑鐨勫ぉ鎬с傞偅涔堜負(fù)浠涔堣涓鑷存у緢閲嶈鍛紵鎴戞湁榪欐牱涓浜涙兂娉曘?/p>
1. 澶嶆潅鎬?/p>
姒傚康涓嶄竴鑷翠駭鐢熼鍏堜駭鐢熺殑涓涓伓鏋滃氨鏄鏉傛э紝榪欓噷鎴戝皢涓句袱涓緥瀛愩?br>
絎竴涓叧浜嶭isp鐨勩侺isp鏈韓鍏鋒湁涓涓緢涓鑷村緢綆鍗曠殑璁$畻妯″瀷鈥斺斘?婕旂畻銆傚湪榪欎釜璁$畻妯″瀷涓紝鍩烘湰鍏冪礌鏄嚱鏁幫紝位榪愮畻絎︼紝路榪愮畻絎︺傝涔変篃鏄畝鍗曟槑紜殑錛宭ambda榪愮畻絎︽彁鍙栧嚭鍑芥暟涓殑鑷敱鍙橀噺錛岀劧鍚庡啀鐢盿pply瀵硅嚜鐢卞彉閲忚祴鍊箋傛暣涓綆楄繃紼嬪氨鏄嚱鏁幫紙絎﹀彿錛夋眰鍊肩殑榪囩▼銆備緥濡傚浜庡嚱鏁皒 + y錛屾垜浠彲浠ヨ繖鏍鋒潵姹傚箋?/p>
鐢變簬Lisp澶氬皯鍙互璁や負(fù)鏄?婕旂畻鐨勪竴縐嶅疄鐜幫紝鎴戜滑鍙互綾諱技鍐欏嚭Lisp浠g爜
鎴栬呮洿鍔犵畝鍗曠殑鍐欎負(fù)
鎵鏈夊湪Lisp涓殑紼嬪簭錛屾垜浠兘鍙互鐢ㄤ竴縐嶄竴鑷寸殑姒傚康鏉ヨ〃杈撅紝灝辨槸絎﹀彿姹傚鹼紝鎴戜滑瀵逛竴涓鍙峰簲鐢ㄤ竴浜涘鹼紝鐒跺悗榪欎釜絎﹀彿瀹屾垚璁$畻騫舵妸緇撴瀯榪斿洖緇欐垜浠紝鍦ㄨ綆楃殑榪囩▼涓紝絎﹀彿瀵瑰閮ㄧ幆澧冩病鏈変換浣曠牬鍧忓拰渚濊禆銆備絾鏄疞isp涓紩鍏ヤ簡(jiǎn)璧嬪鹼紝浜庢槸瀛樺湪涓浜涚鍙鳳紝涓嶄粎浠呮槸鏉ヨ綆楋紝鍚屾椂浠栦滑榪樿兘鏀瑰彉鐜銆?/p>
榪欎釜鍑芥暟涓嶄粎浠呮眰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涓櫧鐒舵湁鍖呰綾繪潵鍋氳ˉ鍋匡紝浣嗘槸浠嶇劧涓嶈兘寮ヨˉ姒傚康涓婄殑鏂銆傛垜浠彲浠ョ敤
鏉ヤ唬琛ㄥ璞℃蹇典腑鐨?錛屼絾鏄?/p>
3 + 4 * 5
涓嶈兘瀵圭瓑鐨勭炕璇戜負(fù):
綆鍗曠被鍨嬪叿鏈夌殑榪愮畻絎﹀拰瀵硅薄綾誨瀷鐨勬秷鎭彂閫佹蹇典笂鏄笉涓鑷寸殑銆傝櫧鐒舵垜浠彲浠ュ湪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ì)
鑰屼笉鏄?br>
鍥犱負(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>
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>
4 銆? ifTrue: [Transcript show: 'Hello']灝卞彲浠ュ搴旂炕璇戜負(fù):
榪欎釜鐪嬩技綆鍗曠殑搴旂敤錛屽嵈甯︽潵浜?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>