On 18 juin 2013, at 11:10, Stéphane Ducasse wrote:

> is it not slower?

Yes a bit slower. 

> and I would remove as much as method as possible from Object.
> 
> why 
>> | temp |
>> temp := <a long expression>.
>> temp <aComplexTest>
>>     ifTrue: [ temp <something> ]
>>     ifFalse: [ temp <something else> ].
> 
> is not good enough?

If it is the whole content of a method it is good. 
But in complex methods you end up with a bunch of temps that do are not needed 
and that decrease readability.

> 
> And finally we should kill as much as possible of these if…. so 
> 
> 
>> Hello everyone.
>> 
>> I see a lot of code that follows the following pattern:
>> 
>> <a long expression> <aComplexTest>
>>     ifTrue: [ <a long expression> <something> ]
>>     ifFalse: [ <a long expression> <something else> ].
>> 
>> The classic refactoring is to store <a long expression> in a temp to avoid 
>> repetition:
>> 
>> | temp |
>> temp := <a long expression>.
>> temp <aComplexTest>
>>     ifTrue: [ temp <something> ]
>>     ifFalse: [ temp <something else> ].
>> 
>> Then  <a long expression> is evaluated once and the name of the temp can 
>> carry a meaningful name that helps reading the code.
>> But this is more verbose than the first version.
>> But if you add the following method in Object:
>> 
>> if: conditionBlock then: trueBlock else: falseBlock
>>     ^ (conditionBlock cull: self)
>>         ifTrue: [ trueBlock cull: value ]
>>         ifFalse: [ falseBlock cull: value ]
>> 
>> You can then rewrite it like that:
>> 
>> <a long expression>
>>     if: [ :obj | obj <aComplexTest> ]
>>     then: [ :obj | <something> ]
>>     else: [ :obj | <something else> ]
>> 
>> The names of the block args can give a meaningful name depending on the 
>> result of the test (something like ... if: #notEmpty then: [ :collection | 
>> ... ] else: [ :emptyCollection | ... ]).  Using cull: for the three block 
>> also enable a good flexibility: you can omit the arg when irrelevant.
>> 
>> Likewise, we could also have Object>>#while:do:
>> 
>> while: conditionBlock do: actionBlock
>>     ^ [ conditionBlock cull: self ] whileTrue: [ actionBlock cull: self ]
>> 
>> What do you think?
>> 
>> Camille
> 

Reply via email to