??xml version="1.0" encoding="utf-8" standalone="yes"?> 是的
ButQ读完和理解之间q有chasm需要跨,是的Q我?x)在Hpȝ的重构上LM用它?img alt="" src="/CuteSoft_Client/CuteEditor/images/face1.gif" align="absMiddle" border="0" />q样才会(x)有体?x)?br />
其实q本书应该先去读base pattern部分Q?/span>因ؓ(f)Martin大叔的很多pattern都会(x)用到base patternQ但是偶不知他老h家ؓ(f)啥把q部分放在了最后?br />
今天Q从今天开始,我开始新的C++journeyQEffecitive C++?
]]>
不可否认Q这是一本可?#8220;怡情”的好书。前面的9章是最值得一ȝ?br />
但是我想大叔在写q本书时Q还没有能够?#8220;refactor”旉样高度概括,所以书中掺杂了很多财务的专业知识背景,我,没有做过Q所以读h很费劌Ӏ?/p>
从明天vQ我做个C++?br />
和Lippman周游世界
]]>
但是出来hL需要还?/span>L没想?/span>Martin大叔?#8220;分析模式”竟然是用q个g西写的代码,额的啊Q我只好打v万分的精,恶补一下?/span>
最不幸的是|上能够扑ֈ的关?/span>SmallTalk书,实?/span>Java得多的多。找C?/span>E文的Q将吧?/span>
另外的发现就?/span>rubyL(fng)ruby>(smalltalk+perl)Q所以有些资料可以在ruby中找到哈?/span>
我的q䆾Smalltalk的学?fn)笔讎ͼq不是按?/span>Smalltalkq阶的思\整理的,而是在阅?/span>APW七章的q程中随用到随整理的。看AP是够用了?/span>
字符 $a $1
字符串变量,用单引号表示。注意在SmallTalk中双引号是注释。所?/span>
‘John’ ‘Martin’q是对的?/span>
A := “John Hunt”q是错的Q去?/span>? Q?/span>
‘a’?/span>$a表示的是不同cȝ实例Q前者对应的StringsQ后者对应的Charater?/span>
Symbols
我觉得这q当于java中的帔R
#join week system42
赋?/span> := Q这个和Delphi一样哈Q?/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>resetQ其实就是执?/span>resetQ?/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语言中也支持集合的P代器Q如果你要求SmalltalkE序员求数组元素的和Q他们会(x)像这h使用inject函数Q?/span>
sumOfValues "Smalltalk method" ^self values inject: 0 into: [ :sum :element | sum + element value]
inject是这样工作的Q当兌的代码块W一ơ被调用Ӟsum被赋l?/span>inject的参数|在这里是0Q,element取数l第一个元素。第二次和以后调用到代码块时Q?/span>sum被赋l上ơ调用代码块时返回的|q样sump完了全程Q?/span>inject最l的l果是代码块最后被调用的倹{?/span>
Dictionary?/span>Set的子cR?/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]可以理解为:(x)f(x) = x + 1
Code Block的调用:(x)
[:x | x + 1] value: 3
can be evaluated as
f(3) = 3 + 1
q是相等?/span>Code Block的定义和调用在一赗?/span>
令一U方法是先定?/span>code Block,然后在其它的地方再调用?/span>
anotherBlock := [ :parml :parm2 | | temp | temp := pannl incorporate: parm2. temp rehash. ].
说明Q?/span>
1) 定义Code BlockQ?/span>anotherBlock?/span>
2) parml Q?/span>parm2是两个参?/span>
3) temp是定义的变量
调用Q?/span>anotherBlock value: objecfcl value: object2
管狠不适应Q但?/span>Code Block可以使得代码z明了:(x)
positiveAmounts := allAmounts select: [:amt | amt isPositive]
q句话就是从collection allAmountsq回所?/span>positive的单元的集合?/span>amt按我的理解就是对应的每个element?/span>
Q?/span>2009-2-3Q?/span>
在读q章Ӟ对于q章开始的2|qC定要反复的读。尤其是当读到后l小节,感觉q失方向的时候,一定要回来再读q部分,q部分是q章的一个高度的概括?/span>
如果不具备会(x)计的知识背景Q花半天的时间恶补一下。徏议看看《会(x)计学原理Q新~)》(徐文彬)。了解几个关键的术语Q̎?/span>,?x)计U目,复式记̎?/span>
我先云山雄的读了一遍,再回头看q章的开始部分,对于Martin的阐q思\了解的清CQ另外在恶补q基本的?x)计知识后,?/span>Transaction?/span>Summary Account理解h老轻松了Q真是磨刀不误砍柴?/span>J
AccountQ̎?/span>
EntryQ记账分?/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. (我理解这句话的意思其实就是会(x)计中所q的复式记̎Double entryQ复式记账一般就是指借贷记̎)
一般的Transsction是财务上所说的“一借一?#8221;Q?/span>Multiegged Transsction是财务上所说的“一借多?#8221;或?#8220;一贷多?#8221;?/span>
导入以下的会(x)计知识:(x)
q是资cdL(fng)余额。如果是负债或所有者权益类帐户Q七期初余额、期末余额一般应在贷斏V?/span>
费用cd户和资cd户一P收入和利润帐户和负债或所有者权益类帐户?/span>
“?#8221;表示资增加或负Z?qing)所有者权益的减少Q?#8220;?#8221;表示资减少或负Z?qing)所有者权益的增加.
“有借必有贷Q借贷必相{?/span>”
帐户是根据会(x)计科目开讄。会(x)计科目既有dcȝ目和明细U目Q帐户也有dcd户和明细帐户?/span>
‘原材?#8217;是一个dcdP它只能概括但应所有原材料的增减变化以其结果。在‘原材?#8217;帐户下面Q还要按照每一U原材料分别讄明细分类帐户?/span>
‘应收账款’是一个L反映应收账款l算情况的dcdPZ详细反映应收账款的结情况,q必L每一个客戯|应收̎ƾ明l分cd戗?/span>
备注账户q不需要保持^衡?/span>
No real money leaks from or to a memo account.
对于Posting rulesQ?/span>Martin要从以下的几个方面来阐述Q?/span>
1. Posting rules是什?/span>
Posting rules allow us to build active networks of accounts that update each other and reflect business rules.
2. 如何实现记规则Q?/span>Individual instance method
Z么要引入Individual instance methodQ这是因为簿记规则往往很复杂,不会(x)仅仅是乘以一个系数这么简单。例如计E,不同的金额对应不同的E率。也是说对于不同的实例Q?/span>instanceQ会(x)对应不同?/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>Transactionsq三者之间的关系通过UML体现。这是这章的基础?/span>
entry?/span>Transactions之间的关pd如同是先有鸡q是先有蛋的问题。因为有U束条gQ如果没有创?/span>Transactions׃能创?/span>entryQ同h?/span>entry也不能创?/span>TransactionsQ这也是因ؓ(f)有约束条件?/span>
解决Ҏ(gu)是Transactions负责创徏entryQ?/span>entry的创建操作仅能由Transactions来访问。但是这h怼(x)q背U束Q?/span>No problemQ我们可以定义规则就是:(x)所有的public operations必须以所有约束条仉得到满为结束条件?/span>
Transactionsq个概念在实际的业务pȝ中是不存在的Q它其实是h造的Q?/span>artificalQ,是ؓ(f)了便于数据管理,毕竟我们现在用的q是关系型数据库以及(qing)面向对象的设计方法哈?/span>
注意q里Summary Account的记账方式是和业务系l不同的。在实际的胦务管理中Q我们会(x)在汇总̎户和明细账户中分别编制会(x)计分录(EntryQ,而在业务pȝ中ƈ不是q样?/span>,按照Martin的叙qͼ(x)
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 RulesQ?/span>(记规则)
Posting rule looks at a particular account and, when it sees an entry, creates another entry.
单的Posting Rule是乘以一个因子,如图Figure6.8.但是复杂的,例如计税p采用Figure6.9的模式?/span>
注意q也是Z么要引入Individual instance method的原因。(q个我也是看?/span>2遍才明白的啊Q?/span>
q句话很重要Q?/span>We want the behavior to vary with each individual instance.
所以不能通过cȝ承实现?/span>Individual instance method是讨论如何实现“the behavior to vary with each individual instance”?/span>
1. Individual instance method-如何实现记规则Q?/span>
1) Singleton Class单一实例
2) Strategy Pattern
3) 使用内部?/span>case语句
?/span>Posting Rule上我们要定义一pd的操作?/span>
?/span>Posting Rule上定?/span>computeFor?/span>ComputeFor包含case语句去调用上面的一pd的操作?/span>
4) 使用带参数的Ҏ(gu)Q?/span>Parameterized MethodQ?/span>
5) 解释?/span>Interpreter
最?/span>Martinl出了选择实现Ҏ(gu)的原则。他的首选是Q?/span>Parameterized Method?/span>
不过我认为如果是做品,解释?/span>Interpreter是不二的选择。因为实际的业务pȝ的复杂程度绝不是M人在产品开发过E中可以惌到的Q最大的灉|性是q求的唯一目标。用开发的复杂性换取实施的灉|性?/span>
2. Posting Rules在哪里执?/span>
原则Q?/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>entryQ?/span>posting rules׃(x)被触发执行?/span>
?/span>2U方式:(x)
AQ在创徏Transaction?/span>entry的方法中posting rules被触发?/span>
BQ?/span>Observer模式?/span>Make Posting rules observer of their trigger account.q种方式比较复杂Q尽量避免用?/span>
B. Account-based FiringZ账户的触?/span>
q是一Ug时处理。对应每个̎L(fng)护一个未处理交易条目列表Q尤光用?/span>cyclic accounting systemQ@环记账系l)。每?/span>account处理一ơ?/span>
一定要注意账户的处理顺序?/span>
C. Posting-rule-based Firing
?/span>Account-based Firing怼Q只?/span>Posting rule负责理未处理交易条目列表。这U触发方式比较复杂,量避免使用哈?/span>
D. Backward-chained Firing
以当前操作帐Pprocessing accountQؓ(f)输出->扑ֈposting rule->再推导出对应?/span>accountQ这是要找出哪个帐戯发的当前操作帐户Q?/span>->对这些帐戯行更?/span>
E. 如何选择posting rule的执行方式:(x)
要基于一?/span>2Ҏ(gu)考虑Q?/span>
ü Posting rule执行的时?/span>
ü 希望在何处捕获错?/span>
Martin对这几种Ҏ(gu)的评hQ?/span>
Eager Firing没有灉|?/span>
Account-based Firing?/span>Posting-rule-based Firing都具有很好的灉|性,帐户l构单用前者,若复杂,则用后者?/span>
4. Posting Rules在哪里定?/span>
两种Ҏ(gu)Q?/span>
1Q?span style="font: 7pt 'Times New Roman'"> knowledge and operational levelQ?/span>posting rules定义?/span>account type上?/span>
2Q?span style="font: 7pt 'Times New Roman'"> 使用summary accountQ把posting rules定义?/span>summary accountQ所有子帐户也都遵@同样?/span>posting rules
对于q两U不同方法的选择的最主要的因素就是:(x)the degree of difference in the behavior of the candidate accounts and account types.
Choosing the entry
有三U方法:(x)
1Q?span style="font: 7pt 'Times New Roman'"> Getting all entries back and then doing a selection
2Q?span style="font: 7pt 'Times New Roman'"> Providing a selection-specific method
3Q?span style="font: 7pt 'Times New Roman'"> Using a filter?/span>Filter是一个封装了查询query的对象?/span>Pattern?/span>Figure6.24的时序图?/span>