【问题标题】:How do we write if elseif elseif in pharo?我们如何在pharo中编写if elseif elseif?
【发布时间】:2018-01-25 11:52:27
【问题描述】:

我必须使用 if elseif elseif 检查 3 个条件。我怎么能在pharo中做到这一点。我做了,但不确定,因为我在 pharo 中没有找到任何此类应用程序。

x = 25
ifTrue:[DoSomething]
ifFalse:[DoSomething else].

x < 25
ifTrue: [DoSomething]
ifFalse:[Domething else].

x > 25
ifTrue: [DoSomething ]
ifFalse:[DoSomething else].

【问题讨论】:

  • 你可以天真地做一些类似x &lt; 25 ifTrue: [ ... ] ifFalse: [ &lt;something else&gt;. x = 25 ifTrue: [ ... ] ifFalse: [ &lt;something else&gt;. x &gt; 25 ifTrue: [ ...] ifFalse: [ ... ] ] ]的事情。但你可能想看看Refactoring if-chains in Smalltalk without class explosion
  • 如果您将“做某事”视为动作(A1、A2、A3、...、A6),那么对于 x = 25,您需要 A1、A4、A6,对于 @ 987654325@ 需要 A2、A3、A6,x &gt; 25 需要 A2、A4、A5。不管语言如何,我都会检查我的整体设计,看看是否有重构。否则,您所拥有的可能是最清晰的编写方式。如果它们本身是复杂的动作,则这些动作可能需要是它们自己的方法来清楚地说明它们。就目前而言,就您目前所展示的情况而言,很难提供明确的答案。

标签: smalltalk pharo pharo-5


【解决方案1】:

您可以选择不同的设计(使用多态性、查找等),但这对于任何 OO 语言都几乎相同(特别是对于 Smalltalk,请参阅此 Refactoring if-chains in Smalltalk without class explosion)。

在 Smalltalk(以及其他几种语言,例如 Ruby)中,您有一个额外的选择,那就是类扩展。您可以设计自己的“if”语句,以很好地匹配您的特定域并使代码更明显。

例如在您给定的示例中,我可以向 Number 类添加一个名为 compareTo:lesser:equal:greater: 的新方法,然后您的代码更改为

x compareTo: 25
    lesser: [ do something ]
    equals: [ do something else ]
    greater: [ do something entirely different ]

这自然取决于您的特定域,也许在不同的情况下,措辞会有所不同。例如。对于集合,有col ifEmpty: [ ] ifNotEmpty: [ ],对于nil,有ifNil:ifNotNil:,对于检测detect:ifFound:ifNone:,对于字典at:ifPresent:ifAbsent:,等等。

【讨论】:

  • 似乎是我需要的。谢谢@彼得
猜你喜欢
  • 2011-11-01
  • 2010-10-12
  • 1970-01-01
  • 2016-11-21
  • 1970-01-01
  • 1970-01-01
  • 2023-04-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多