锘??xml version="1.0" encoding="utf-8" standalone="yes"?> 鏄殑
But錛岃瀹屽拰鐞嗚В涔嬮棿榪樻湁chasm闇瑕佽法瓚婏紝鏄殑錛屾垜浼氬湪H緋葷粺鐨勯噸鏋勪笂鍒繪剰鍘諱嬌鐢ㄥ畠銆?img alt="" src="/CuteSoft_Client/CuteEditor/images/face1.gif" align="absMiddle" border="0" />榪欐牱鎵嶄細鏈変綋浼氥?br />
鍏跺疄榪欐湰涔﹀簲璇ュ厛鍘昏base pattern閮ㄥ垎錛?/span>鍥犱負Martin澶у彅鐨勫緢澶歱attern閮戒細鐢ㄥ埌base pattern錛屼絾鏄伓涓嶇煡浠栬佷漢瀹朵負鍟ユ妸榪欓儴鍒嗘斁鍦ㄤ簡鏈鍚庛?br />
浠婂ぉ錛屼粠浠婂ぉ寮濮嬶紝鎴戝紑濮嬫柊鐨凜++journey錛欵ffecitive C++銆?
]]>
涓嶅彲鍚﹁錛岃繖鏄竴鏈彲浠?#8220;鎬℃儏”鐨勫ソ涔︺傚墠闈㈢殑9绔犳槸鏈鍊煎緱涓璇葷殑銆?br />
浣嗘槸鎴戞兂澶у彅鍦ㄥ啓榪欐湰涔︽椂錛岃繕娌℃湁鑳藉鍍?#8220;refactor”鏃墮偅鏍烽珮搴︽鎷紝鎵浠ヤ功涓幒鏉備簡寰堝璐㈠姟鐨勪笓涓氱煡璇嗚儗鏅紝鎴戯紝娌℃湁鍋氳繃錛屾墍浠ヨ璧鋒潵寰堣垂鍔層?/p>
浠庢槑澶╄搗錛屾垜灝嗗仛涓狢++浜?br />
鍜孡ippman鍛ㄦ父涓栫晫
]]>
浣嗘槸鍑烘潵娣鋒繪槸闇瑕佽繕鐨?/span>L娌℃兂鍒?/span>Martin澶у彅鐨?#8220;鍒嗘瀽妯″紡”绔熺劧鏄敤榪欎釜楝間笢瑗垮啓鐨勪唬鐮侊紝棰濈殑紲炲晩錛屾垜鍙ソ鎵撹搗涓囧垎鐨勭簿紲烇紝鎭惰ˉ涓涓嬨?/span>
鏈涓嶅垢鐨勬槸緗戜笂鑳藉鎵懼埌鐨勫叧浜?/span>SmallTalk涔︼紝紜疄姣?/span>Java灝戝緱澶氱殑澶氥傛壘鍒頒竴鏈?/span>E鏂囩殑錛屽皢灝卞惂銆?/span>
鍙﹀鐨勫彂鐜板氨鏄?/span>ruby鍙風Оruby>(smalltalk+perl)錛屾墍浠ユ湁浜涜祫鏂欏彲浠ュ湪ruby涓壘鍒板搱銆?/span>
鎴戠殑榪欎喚Smalltalk鐨勫涔犵瑪璁幫紝騫朵笉鏄寜鐓?/span>Smalltalk榪涢樁鐨勬濊礬鏁寸悊鐨勶紝鑰屾槸鍦ㄩ槄璇?/span>AP絎竷绔犵殑榪囩▼涓殢鐢ㄥ埌闅忔暣鐞嗙殑銆傜湅AP鏄鐢ㄤ簡銆?/span>
瀛楃 $a $1
瀛楃涓插彉閲忥紝鐢ㄥ崟寮曞彿琛ㄧず銆傛敞鎰忓湪SmallTalk涓弻寮曞彿鏄敞閲娿傛墍浠?/span>
‘John’ ‘Martin’榪欐槸瀵圭殑銆?/span>
A := “John Hunt”榪欐槸閿欑殑錛堝幓姝?/span>? 錛?/span>
‘a’鍜?/span>$a琛ㄧず鐨勬槸涓嶅悓綾葷殑瀹炰緥錛屽墠鑰呭搴旂殑Strings錛涘悗鑰呭搴旂殑Charater銆?/span>
Symbols
鎴戣寰楄繖灝辯浉褰撲簬java涓殑甯擱噺
#join week system42
璧嬪?/span> := 錛堣繖涓拰Delphi涓鏍峰搱錛?/span>
myName := ‘John Hunt
newIndex := oldIndex
涓存椂鍙橀噺 |x y z| x :=5. y :=6. Z :=x+y. Transcript show: z printString.
(anObject isKindOf: String) ifTrue: [...] ifFalse: [...] is an example of Smalltalk's runtime equilivant of "type testing"
do – does the same operation on every element of the collection.
MyCollection do: [:piece | piece reset]
瀵?/span>MyCollection鐨勬瘡涓?/span>element鍙戦佹秷鎭?/span>reset錛堝叾瀹炲氨鏄墽琛?/span>reset錛?/span>
collect – like do: but returns a collection of the results.
select – test every element and returns those which pass.
reject – test every element and returns those which fail.
detect – returns the first element which passes the test
inject:into
鍦?/span>Smalltalk璇█涓篃鏀寔闆嗗悎鐨勮凱浠e櫒錛屽鏋滀綘瑕佹眰Smalltalk紼嬪簭鍛樻眰鏁扮粍鍏冪礌鐨勫拰錛屼粬浠細鍍忚繖鏍鋒潵浣跨敤inject鍑芥暟錛?/span>
sumOfValues "Smalltalk method" ^self values inject: 0 into: [ :sum :element | sum + element value]
inject鏄繖鏍峰伐浣滅殑錛屽綋鍏寵仈鐨勪唬鐮佸潡絎竴嬈¤璋冪敤鏃訛紝sum琚祴緇?/span>inject鐨勫弬鏁板鹼紙鍦ㄨ繖閲屾槸0錛夛紝element鍙栨暟緇勭涓涓厓绱犮傜浜屾鍜屼互鍚庤皟鐢ㄥ埌浠g爜鍧楁椂錛?/span>sum琚祴緇欎笂嬈¤皟鐢ㄤ唬鐮佸潡鏃惰繑鍥炵殑鍊鹼紝榪欐牱sum灝辮窇瀹屼簡鍏ㄧ▼錛?/span>inject鏈緇堢殑緇撴灉鏄唬鐮佸潡鏈鍚庤璋冪敤鐨勫箋?/span>
Dictionary鏄?/span>Set鐨勫瓙綾匯?/span>
at : aKey 瀵瑰簲Java鐨?/span>get(key)
at : aKey put : aValue瀵瑰簲Java鐨?/span>put(key, value)
[ :params | <message-expressions> ]
Where :params is the list of parameters the code can take. This means that the Smalltalk code:
[:x | x + 1]鍙互鐞嗚В涓猴細f(x) = x + 1
Code Block鐨勮皟鐢細
[:x | x + 1] value: 3
can be evaluated as
f(3) = 3 + 1
榪欐槸鐩哥瓑浜?/span>Code Block鐨勫畾涔夊拰璋冪敤鍦ㄤ竴璧楓?/span>
浠や竴縐嶆柟娉曟槸鍏堝畾涔?/span>code Block,鐒跺悗鍦ㄥ叾瀹冪殑鍦版柟鍐嶈皟鐢ㄣ?/span>
anotherBlock := [ :parml :parm2 | | temp | temp := pannl incorporate: parm2. temp rehash. ].
璇存槑錛?/span>
1) 瀹氫箟Code Block錛?/span>anotherBlock銆?/span>
2) parml 錛?/span>parm2鏄袱涓弬鏁?/span>
3) temp鏄畾涔夌殑鍙橀噺
璋冪敤錛?/span>anotherBlock value: objecfcl value: object2
灝界鐙犱笉閫傚簲錛屼絾鏄?/span>Code Block鍙互浣垮緱浠g爜綆媧佹槑浜嗭細
positiveAmounts := allAmounts select: [:amt | amt isPositive]
榪欏彞璇濆氨鏄粠collection allAmounts榪斿洖鎵鏈?/span>positive鐨勫崟鍏冪殑闆嗗悎銆?/span>amt鎸夋垜鐨勭悊瑙e氨鏄搴旂殑姣忎釜element銆?/span>
錛?/span>2009-2-3錛?/span>
鍦ㄨ榪欑珷鏃訛紝瀵逛簬榪欑珷寮濮嬬殑2欏墊榪頒竴瀹氳鍙嶅鐨勮銆傚挨鍏舵槸褰撹鍒板悗緇皬鑺傦紝鎰熻榪峰け鏂瑰悜鐨勬椂鍊欙紝涓瀹氳鍥炴潵鍐嶈榪欓儴鍒嗭紝榪欓儴鍒嗘槸榪欑珷鐨勪竴涓珮搴︾殑姒傛嫭銆?/span>
濡傛灉涓嶅叿澶囦細璁$殑鐭ヨ瘑鑳屾櫙錛岃姳鍗婂ぉ鐨勬椂闂存伓琛ヤ竴涓嬨傚緩璁湅鐪嬨婁細璁″鍘熺悊錛堟柊緙栵級銆嬶紙寰愭枃褰級銆備簡瑙e嚑涓叧閿殑鏈錛氳處鎴?/span>,浼氳縐戠洰,澶嶅紡璁拌處銆?/span>
鎴戝厛浜戝北闆劇僵鐨勮浜嗕竴閬嶏紝鍐嶅洖澶寸湅榪欑珷鐨勫紑濮嬮儴鍒嗭紝瀵逛簬Martin鐨勯槓榪版濊礬浜嗚В鐨勬竻鏅頒簡錛屽彟澶栧湪鎭惰ˉ榪囧熀鏈殑浼氳鐭ヨ瘑鍚庯紝瀵?/span>Transaction鍜?/span>Summary Account鐞嗚В璧鋒潵鑰佽交鏉句簡錛岀湡鏄(鍒涓嶈鐮嶆煷鍔?/span>J
Account錛氳處鎴?/span>
Entry錛氳璐﹀垎褰?/span>
Account can only be added or removed by entries. The entries provide a history of all changes of the account.
Transactions add a further degree of auditability by linking entries together. In a transaction, the items withdrawn from one account must be deposited in another. (鎴戠悊瑙h繖鍙ヨ瘽鐨勬剰鎬濆叾瀹炲氨鏄細璁′腑鎵榪扮殑澶嶅紡璁拌處Double entry錛屽寮忚璐︿竴鑸氨鏄寚鍊熻捶璁拌處)
涓鑸殑Transsction灝辨槸璐㈠姟涓婃墍璇寸殑“涓鍊熶竴璐?#8221;錛岃?/span>Multiegged Transsction灝辨槸璐㈠姟涓婃墍璇寸殑“涓鍊熷璐?#8221;鎴栬?#8220;涓璐峰鍊?#8221;銆?/span>
瀵煎叆浠ヤ笅鐨勪細璁$煡璇嗭細
榪欐槸璧勪駭綾誨笎鎴風殑浣欓銆傚鏋滄槸璐熷烘垨鎵鏈夎呮潈鐩婄被甯愭埛錛屼竷鏈熷垵浣欓銆佹湡鏈綑棰濅竴鑸簲鍦ㄨ捶鏂廣?/span>
璐圭敤綾誨笎鎴峰拰璧勪駭綾誨笎鎴蜂竴鏍鳳紱鏀跺叆鍜屽埄娑﹀笎鎴峰拰璐熷烘垨鎵鏈夎呮潈鐩婄被甯愭埛銆?/span>
“鍊?#8221;琛ㄧず璧勪駭澧炲姞鎴栬礋鍊轟互鍙婃墍鏈夎呮潈鐩婄殑鍑忓皯錛?#8220;璐?#8221;琛ㄧず璧勪駭鍑忓皯鎴栬礋鍊轟互鍙婃墍鏈夎呮潈鐩婄殑澧炲姞.
“鏈夊熷繀鏈夎捶錛屽熻捶蹇呯浉絳?/span>”
甯愭埛鏄牴鎹細璁$鐩紑璁劇殑銆備細璁$鐩棦鏈夋誨垎綾葷鐩拰鏄庣粏縐戠洰錛屽笎鎴蜂篃灝辨湁鎬誨垎綾誨笎鎴峰拰鏄庣粏甯愭埛銆?/span>
‘鍘熸潗鏂?#8217;鏄竴涓誨垎綾誨笎鎴鳳紝瀹冨彧鑳芥鎷絾搴旀墍鏈夊師鏉愭枡鐨勫鍑忓彉鍖栦互鍏剁粨鏋溿傚湪‘鍘熸潗鏂?#8217;甯愭埛涓嬮潰錛岃繕瑕佹寜鐓ф瘡涓縐嶅師鏉愭枡鍒嗗埆璁劇疆鏄庣粏鍒嗙被甯愭埛銆?/span>
‘搴旀敹璐︽’鏄竴涓繪嫭鍙嶆槧搴旀敹璐︽緇撶畻鎯呭喌鐨勬誨垎綾誨笎鎴鳳紝涓轟簡璇︾粏鍙嶆槧搴旀敹璐︽鐨勭粨綆楁儏鍐碉紝榪樺繀欏繪寜姣忎竴涓鎴瘋緗簲鏀惰處嬈炬槑緇嗗垎綾誨笎鎴楓?/span>
澶囨敞璐︽埛騫朵笉闇瑕佷繚鎸佸鉤琛°?/span>
No real money leaks from or to a memo account.
瀵逛簬Posting rules錛?/span>Martin瑕佷粠浠ヤ笅鐨勫嚑涓柟闈㈡潵闃愯堪錛?/span>
1. Posting rules鏄粈涔?/span>
Posting rules allow us to build active networks of accounts that update each other and reflect business rules.
2. 濡備綍瀹炵幇綈胯瑙勫垯錛?/span>Individual instance method
涓轟粈涔堣寮曞叆Individual instance method錛熻繖鏄洜涓虹翱璁拌鍒欏線寰寰堝鏉傦紝涓嶄細浠呬粎鏄箻浠ヤ竴涓郴鏁拌繖涔堢畝鍗曘備緥濡傝紼庯紝涓嶅悓鐨勯噾棰濆搴斾笉鍚岀殑紼庣巼銆備篃灝辨槸璇村浜庝笉鍚岀殑瀹炰緥錛?/span>instance錛変細瀵瑰簲涓嶅悓鐨?/span>behavior銆?/span>
3. Posting rules濡備綍琚墽琛?/span>
Posting rule execution pattern describes ways in which posting rules can be triggered.
4. Posting rules鍦ㄥ摢閲屽畾涔?/span>
Posting rules for many accounts
Account, entry鍜?/span>Transactions榪欎笁鑰呬箣闂寸殑鍏崇郴閫氳繃UML浣撶幇銆傝繖鏄繖绔犵殑鍩虹銆?/span>
entry鍜?/span>Transactions涔嬮棿鐨勫叧緋誨氨濡傚悓鏄厛鏈夐浮榪樻槸鍏堟湁铔嬬殑闂銆傚洜涓烘湁綰︽潫鏉′歡錛屽鏋滄病鏈夊垱寤?/span>Transactions灝變笉鑳藉垱寤?/span>entry錛涘悓鏍鋒病鏈?/span>entry涔熶笉鑳藉垱寤?/span>Transactions錛岃繖涔熸槸鍥犱負鏈夌害鏉熸潯浠躲?/span>
瑙e喅鏂規硶灝辨槸Transactions璐熻矗鍒涘緩entry錛?/span>entry鐨勫垱寤烘搷浣滀粎鑳界敱Transactions鏉ヨ闂備絾鏄繖鏍鋒垨璁鎬細榪濊儗綰︽潫錛?/span>No problem錛屾垜浠彲浠ュ畾涔夎鍒欏氨鏄細鎵鏈夌殑public operations蹇呴』浠ユ墍鏈夌害鏉熸潯浠墮兘寰楀埌婊¤凍涓虹粨鏉熸潯浠躲?/span>
Transactions榪欎釜姒傚康鍦ㄥ疄闄呯殑涓氬姟緋葷粺涓槸涓嶅瓨鍦ㄧ殑錛屽畠鍏跺疄鏄漢閫犵殑錛?/span>artifical錛夛紝鏄負浜嗕究浜庢暟鎹鐞嗭紝姣曠珶鎴戜滑鐜板湪鐢ㄧ殑榪樻槸鍏崇郴鍨嬫暟鎹簱浠ュ強闈㈠悜瀵硅薄鐨勮璁℃柟娉曞搱銆?/span>
娉ㄦ剰榪欓噷Summary Account鐨勮璐︽柟寮忔槸鍜屼笟鍔$郴緇熶笉鍚岀殑銆傚湪瀹為檯鐨勮儲鍔$鐞嗕腑錛屾垜浠細鍦ㄦ眹鎬昏處鎴峰拰鏄庣粏璐︽埛涓垎鍒紪鍒朵細璁″垎褰曪紙Entry錛夛紝鑰屽湪涓氬姟緋葷粺涓茍涓嶆槸榪欐牱鐨?/span>,鎸夌収Martin鐨勫彊榪幫細
1. The entries of a summary account are derived from the component’s entries in a recursive manner.
2. post entries only to detail accounts not to summary accounts.
1. 浠涔堟槸Posting Rules錛?/span>(綈胯瑙勫垯)
Posting rule looks at a particular account and, when it sees an entry, creates another entry.
綆鍗曠殑Posting Rule灝辨槸涔樹互涓涓洜瀛愶紝濡傚浘Figure6.8.浣嗘槸澶嶆潅鐨勶紝渚嬪璁$◣灝辮閲囩敤Figure6.9鐨勬ā寮忋?/span>
娉ㄦ剰榪欎篃灝辨槸涓轟粈涔堣寮曞叆Individual instance method鐨勫師鍥犮傦紙榪欎釜鎴戜篃鏄湅浜?/span>2閬嶆墠鏄庣櫧鐨勫晩錛?/span>
榪欏彞璇濆緢閲嶈錛?/span>We want the behavior to vary with each individual instance.
鎵浠ヤ笉鑳介氳繃綾葷戶鎵垮疄鐜般?/span>Individual instance method灝辨槸璁ㄨ濡備綍瀹炵幇“the behavior to vary with each individual instance”銆?/span>
1. Individual instance method-濡備綍瀹炵幇綈胯瑙勫垯錛?/span>
1) Singleton Class鍗曚竴瀹炰緥
2) Strategy Pattern
3) 浣跨敤鍐呴儴鐨?/span>case璇彞
鍦?/span>Posting Rule涓婃垜浠瀹氫箟涓緋誨垪鐨勬搷浣溿?/span>
鍦?/span>Posting Rule涓婂畾涔?/span>computeFor銆?/span>ComputeFor鍖呭惈case璇彞鍘昏皟鐢ㄤ笂闈㈢殑涓緋誨垪鐨勬搷浣溿?/span>
4) 浣跨敤甯﹀弬鏁扮殑鏂規硶錛?/span>Parameterized Method錛?/span>
5) 瑙i噴鍣?/span>Interpreter
鏈鍚?/span>Martin緇欏嚭浜嗛夋嫨瀹炵幇鏂規硶鐨勫師鍒欍備粬鐨勯閫夋槸錛?/span>Parameterized Method銆?/span>
涓嶈繃鎴戣涓哄鏋滄槸鍋氫駭鍝侊紝瑙i噴鍣?/span>Interpreter鏄笉浜岀殑閫夋嫨銆傚洜涓哄疄闄呯殑涓氬姟緋葷粺鐨勫鏉傜▼搴︾粷涓嶆槸浠諱綍浜哄湪浜у搧寮鍙戣繃紼嬩腑鍙互鎯寵薄鍒扮殑錛屾渶澶х殑鐏墊椿鎬ф槸榪芥眰鐨勫敮涓鐩爣銆傜敤寮鍙戠殑澶嶆潅鎬ф崲鍙栧疄鏂界殑鐏墊椿鎬с?/span>
2. Posting Rules鍦ㄥ摢閲屾墽琛?/span>
鍘熷垯錛?/span>Separate the strategy of firing the posting rules from the rules themselves as much as possible to reduce the coupling between these mechanisms.
A. Eager Firing
褰撹Е鍙戣處鎴蜂腑浜х敓涓涓?/span>entry錛?/span>posting rules灝變細琚Е鍙戞墽琛屻?/span>
鏈?/span>2縐嶆柟寮忥細
A錛庡湪鍒涘緩Transaction鎴?/span>entry鐨勬柟娉曚腑posting rules琚Е鍙戙?/span>
B錛庝嬌鐢?/span>Observer妯″紡銆?/span>Make Posting rules observer of their trigger account.榪欑鏂瑰紡姣旇緝澶嶆潅錛屽敖閲忛伩鍏嶄嬌鐢ㄣ?/span>
B. Account-based Firing鍩轟簬璐︽埛鐨勮Е鍙?/span>
榪欐槸涓縐嶅歡鏃跺鐞嗐傚搴旀瘡涓處鎴風淮鎶や竴涓湭澶勭悊浜ゆ槗鏉$洰鍒楄〃錛屽挨鍏墮傜敤浜?/span>cyclic accounting system錛堝驚鐜璐︾郴緇燂級銆傛瘡澶?/span>account澶勭悊涓嬈°?/span>
涓瀹氳娉ㄦ剰璐︽埛鐨勫鐞嗛『搴忋?/span>
C. Posting-rule-based Firing
鍜?/span>Account-based Firing鐩鎬技錛屽彧鏄?/span>Posting rule璐熻矗綆$悊鏈鐞嗕氦鏄撴潯鐩垪琛ㄣ傝繖縐嶈Е鍙戞柟寮忔瘮杈冨鏉傦紝灝介噺閬垮厤浣跨敤鍝堛?/span>
D. Backward-chained Firing
浠ュ綋鍓嶆搷浣滃笎鎴鳳紙processing account錛変負杈撳嚭->鎵懼埌posting rule->鍐嶆帹瀵煎嚭瀵瑰簲鐨?/span>account錛堣繖灝辨槸瑕佹壘鍑哄摢涓笎鎴瘋Е鍙戠殑褰撳墠鎿嶄綔甯愭埛錛?/span>->瀵硅繖浜涘笎鎴瘋繘琛屾洿鏂?/span>
E. 濡備綍閫夋嫨posting rule鐨勬墽琛屾柟寮忥細
瑕佸熀浜庝竴涓?/span>2鐐規潵鑰冭檻錛?/span>
ü Posting rule鎵ц鐨勬椂闂?/span>
ü 甯屾湜鍦ㄤ綍澶勬崟鑾烽敊璇?/span>
Martin瀵硅繖鍑犵鏂規硶鐨勮瘎浠鋒槸錛?/span>
Eager Firing娌℃湁鐏墊椿鎬?/span>
Account-based Firing鍜?/span>Posting-rule-based Firing閮藉叿鏈夊緢濂界殑鐏墊椿鎬э紝甯愭埛緇撴瀯綆鍗曚嬌鐢ㄥ墠鑰咃紝鑻ュ鏉傦紝鍒欎嬌鐢ㄥ悗鑰呫?/span>
4. Posting Rules鍦ㄥ摢閲屽畾涔?/span>
涓ょ鏂規硶錛?/span>
1錛?span style="font: 7pt 'Times New Roman'"> knowledge and operational level錛?/span>posting rules瀹氫箟鍦?/span>account type涓娿?/span>
2錛?span style="font: 7pt 'Times New Roman'"> 浣跨敤summary account錛屾妸posting rules瀹氫箟鍦?/span>summary account錛屾墍鏈夊瓙甯愭埛涔熼兘閬靛驚鍚屾牱鐨?/span>posting rules
瀵逛簬榪欎袱縐嶄笉鍚屾柟娉曠殑閫夋嫨鐨勬渶涓昏鐨勫洜绱犲氨鏄細the degree of difference in the behavior of the candidate accounts and account types.
Choosing the entry
鏈変笁縐嶆柟娉曪細
1錛?span style="font: 7pt 'Times New Roman'"> Getting all entries back and then doing a selection
2錛?span style="font: 7pt 'Times New Roman'"> Providing a selection-specific method
3錛?span style="font: 7pt 'Times New Roman'"> Using a filter銆?/span>Filter灝辨槸涓涓皝瑁呬簡鏌ヨquery鐨勫璞°?/span>Pattern瑙?/span>Figure6.24鐨勬椂搴忓浘銆?/span>