在Smalltalk中重构if-chains而没有类爆炸

Jua*_*rre 6 refactoring if-statement smalltalk

由于Smalltalk不鼓励使用caseOf:,在没有类爆炸的情况下实现以下情况有哪些备选方案?

self condition1
        ifTrue: [ self actionForCondition1 ]
        ifFalse: [ 
            self condition2
                ifTrue: [ self actionForCondition2 ]
                ifFalse: [ 
                    self condition3
                        ifTrue: [ self actionForCondition3 ]
                        ifFalse: [ ....  ] ] ]
Run Code Online (Sandbox Code Playgroud)

Luk*_*gli 6

取决于你的条件究竟如何?

  • 如果你的条件是型式试验

    anObject isKindOf: aClass
    
    Run Code Online (Sandbox Code Playgroud)

    您可以在类上调度,这意味着您可以调用操作方法anObject.

  • 如果你的条件是平等测试

    anObject = anotherObject
    
    Run Code Online (Sandbox Code Playgroud)

    您可以使用包含对象作为键的字典,将操作用作块闭包.

  • 作为最后一个重新开始,如果没有其他帮助,您可能需要重写建议的代码以避免不必要的嵌套:

    self condition1
        ifTrue: [ ^ self actionForCondition1 ].
    self condition2
        ifTrue: [ ^ self actionForCondition2 ].
    self condition3
        ifTrue: [ ^ self actionForCondition3 ].
    ...
    
    Run Code Online (Sandbox Code Playgroud)


小智 5

如果您滚动到接近结尾

http://www.desk.org:8080/CampSmalltalk/control%20flow

你会发现这句话

“在 Smalltalk 中有四种方法可以表达 case-statement。”

其次是示例链接。

文本位于稍长的一系列页面的中间,为了说明的目的,偶尔会提到假设的导师和 Smalltalk 课程中的学生;为了您的问题,您可以忽略它)