Smalltalk(特别是Squeak/Pharo)有某种形式的可变函数吗?
我刚刚读到了在smalltalk中设计自己的控制语句的强大功能,虽然我是ifTrue的铁杆粉丝: ifFalse:我很难想出一个好方法来实现任意的if,if else,if else,...,else语句,思考这些变量函数对于实现case语句是多么有用。就像这样
假类
ifTrue: aBlock (... elseIf: aBoolean then: aSecondBlock ...) else: aLastBlock
vArgList pairsDo: [:x :y| x ifTrue:[^ (y value)] ].
^ aLastBlock发布于 2010-10-12 05:26:39
您可以使用#caseOf:otherwise:消息。在一些示例中查找此消息的发送者。
但不管怎样,如果您想使用case语句,那么您并没有遵循smalltalk的做法。告诉我们你想通过你的案例陈述实现什么,这样我们就可以向你展示一些更清晰的方法。
发布于 2010-10-07 03:02:36
Smalltalk用于方法调用的类似关键字的语法本质上定义了方法的多重性。没有像Common Lisp中那样的&rest模式。
当然,您可以让一个方法接受一个列表,比如BlockClosure>>valueWithArguments:,但这几乎不是一回事。
您可以修改Compiler以支持可变方法调用。也许调用只是在每个变量之间使用with::
(条件) ifTrue: aBlock elseIf: aBoolean with: aSecondBlock with: anotherBoolean with: aThirdBlock
发布于 2010-10-24 20:02:03
我在编程中学到的一件事不是你不需要case语句,你不需要 case语句。
Case语句是膨胀对象的方法。当你使用它的时候,你是在降低维护性。那时你将拥有所有你想要的可能性,但是当你想要添加一些东西的时候,当你不再记得那个对象的责任中的微妙之处时,你将不得不检查令人讨厌的代码,所以你会使它变得更加膨胀。
在很短的时间内,它们看起来很友好,但case语句不是你的朋友。从长远来看,他们会咬你的。
此外,它们还会降低代码的灵活性。例如,您不能肯定地添加关于前面代码的案例。当你不再记得为什么要这样编码的时候,你就不得不检查旧的代码。
Case语句是好代码的敌人。
如果你有比ifTrue:ifFalse:更多的东西,那么正确的做法就是为它创建状态。所以你要做的就是实现三个非常简单的类,它们都能理解一些动词。
比如,#doTheNextThing。因此,当对象接收到消息时,它将委托给状态(无论哪一个是这3个状态中的一个(或30个,所以请注意,这很好地扩展了复杂性),并且状态知道如何使原始接收者做出正确的反应。
这将使您的代码轻量级、易懂且可维护性高。您将能够忘记这一点,因为您知道,当您再次查看它时,一切都是如此明显,您不需要考虑代码的过去,而需要考虑代码的未来。
这一点很重要,因为你的内存是你拥有的最昂贵的内存,而AFAIK是不可升级的。所以这项技术可以让你做更强大的事情。
此外,制作3个类对一些人来说可能听起来更多的工作,但事实并非如此。任何新手都可以在一眨眼之间添加3个空类,但只有正确的专家才会记住旧代码中的case语句是如何生成的。如果你非常乐观,只需要几分钟就能回想起来,这样你们就知道下一步该做什么了。想想看。
https://stackoverflow.com/questions/3872246
复制相似问题