[Newbies] How to shorten a method (using inject: into: ?)
Randal L. Schwartz
merlyn at stonehenge.com
Mon Jul 21 14:28:12 UTC 2008
>>>>> "cdrick" == cdrick <cdrick65 at gmail.com> writes:
cdrick> Hi Stan,
cdrick> 2008/7/21 stan shepherd <squeak414 at free.fr>:
>>
>> Hi, I have the following method, that code critics flags as long:
>>
>> testMaleMeiosis2
>> | testSet mCount pCount mTotal pTotal |
>> pTotal := 0.
>> mTotal := 0.
>> Forecaster testMale meiose
>> do: [:strand |
>> testSet := strand testRun.
>> mCount := testSet maternalCount.
>> pCount := testSet paternalCount.
>> mTotal := mTotal + mCount.
>> pTotal := pTotal + pCount].
>> self
>> should: [mTotal = 100
>> and: [pTotal = 100]]
>>
>> I'm trying to shorten it, including various attempts with inject: into: ,
>> but with no success. Any tips please?
cdrick> So somethink like that should work:
cdrick> testMaleMeiosis2
cdrick> | resultArray tesSet |
cdrick> testSet := strand testRun.
cdrick> resultArray := Forecaster testMale meiose
cdrick> inject: #(0 0)
cdrick> into: [:array :val |
cdrick> array at: 1 put: (array at: 1) + testSet maternalCount.
cdrick> array at: 2 put: (array at: 2) + testSet paternalCount.
cdrick> array]
cdrick> self should: [ resultArray = #(100 100)].
This looks even uglier. How about first gathering the testSets, then
getting what you need from those:
| testSets mTotal pTotal |
testSets := (Forecaster testMale meiose) collect: [:strand | strand testRun ].
mTotal := (testSets collect: [:each | each maternalCount]) sum.
pTotal := (testSets collect: [:each | each paternalCount]) sum.
Unless you're talking about 5000 elements in testSets, this is likely in the
same ballpark for speed, and that's probably dwarfed by the cost of #testRun
anyway.
Sometimes an obsession with #inject:into: as a shiny object leads you down a
dark path. Especially with sums. Consider #sum first.
--
Randal L. Schwartz - Stonehenge Consulting Services, Inc. - +1 503 777 0095
<merlyn at stonehenge.com> <URL:http://www.stonehenge.com/merlyn/>
Smalltalk/Perl/Unix consulting, Technical writing, Comedy, etc. etc.
See http://methodsandmessages.vox.com/ for Smalltalk and Seaside discussion
More information about the Beginners
mailing list