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

标签 if-statement refactoring smalltalk

由于 Smalltalk 不鼓励使用 case Of:,有什么替代方案可以实现以下情况而不会发生类爆炸?

self condition1
        ifTrue: [ self actionForCondition1 ]
        ifFalse: [ 
            self condition2
                ifTrue: [ self actionForCondition2 ]
                ifFalse: [ 
                    self condition3
                        ifTrue: [ self actionForCondition3 ]
                        ifFalse: [ ....  ] ] ]

最佳答案

取决于你的条件到底是什么样的?

  • 如果您的条件是型式测试
    anObject isKindOf: aClass
    

    你可以在类上调度,这意味着你在 anObject 上调用一个 Action 方法.
  • 如果您的条件是平等测试
    anObject = anotherObject
    

    您可以使用以对象为键的字典和作为块闭包的操作。
  • 作为最后的恢复,如果没有其他帮助,您可能需要重写建议的代码以避免不必要的嵌套:
    self condition1
        ifTrue: [ ^ self actionForCondition1 ].
    self condition2
        ifTrue: [ ^ self actionForCondition2 ].
    self condition3
        ifTrue: [ ^ self actionForCondition3 ].
    ...
    
  • 关于if-statement - 在 Smalltalk 中重构 if-chains 没有类爆炸,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8113497/

    相关文章:

    c# - 如何简化这个数组插入代码?

    遗留代码的 Java 重构策略

    smalltalk - 从Squeak或Pharo调用Shell命令

    java - 仅当检查整个数组时才使用 Else 语句

    java - 简单的控制结构(if 语句)

    if-statement - 需要重构 Arrow 反模式的想法

    ruby - 是否存在适用于 Ruby 的(实验性)类浏览器?

    selector - Smalltalk 委托(delegate)/存储消息选择器

    mysql - 在 MySQL 中使用 IF 输出作为变量

    mysql - 我想在 mysql 的 if 语句中使用用户 'substr'