The “Kent Beck approved solutions” here are two: 

1) To use a dictionary (or ordered dictionary).


case := OrderedDictionary newFromPairs: {
        [ cond ]. [ do ].
        [ cond ]. [ do ].
        [ true ]. [ otherwise do ] }

case keysAndValuesDo: [  :cond :do | 
        (cond value: expression)  ifTrue: [
                “you need to break here"
                ^ do value ].

2) To use a “case method”

caseMethod: expression 

        expression = cond1 ifTrue: [ ^ do1 ].
        expression = cond2 ifTrue: [ ^ do2 ].
        ^ otherwise

Personally, I prefer the second one because is more concise, performant and 
easy to understand.

Esteban


> On 28 Dec 2019, at 11:58, Dennis Schetinin <chae...@gmail.com> wrote:
> 
> It would be an overkill to do it for this particular case, but Smalltalk 
> makes it possible to implement a case-like construction:
> 
> [ expression ] 
>      when: [ :value | condition1 ] do: [-0do :value | ... ]; 
>      when: [ :value | condition2 ] do: [ :value | ... ]; 
>      otherwiseDo: [ :value | ... ];
>      evaluate
> 
> 
> I am sure, something like this has been implemented already somewhere (maybe 
> in Squeak?). Still not sure it is practical as compared to simple if-s, and 
> for sure not widely used :)
> ...On the other hand, sometimes the case-like construction can be considered 
> a more intension-revealing style. 
> 
> пт, 27 дек. 2019 г., 22:18 Roelof Wobben via Pharo-users 
> <pharo-users@lists.pharo.org <mailto:pharo-users@lists.pharo.org>>:
> Hello, 
> 
> Im trying to solve a challenge from exercism where  I have to calculate the 
> points somehow gets on a very simple darts board.
> 
> I solved it like this : 
> 
> 
> scoreX: anInteger y: anInteger2
>     | distance |
>     distance := (anInteger squared + anInteger2 squared) sqrt.
>     distance > 10
>         ifTrue: [ ^ 0 ].
>     distance > 5
>         ifTrue: [ ^ 1 ].
>     distance > 1
>         ifTrue: [ ^ 5 ].
>     ^ 10
> 
> 
> but now I use three if then and I think it's ugly code. 
> 
> Is there a way I can make it more the smalltalk way ? 
> 
> 
> Regards, 
> 
> Roelof
> 

Reply via email to