首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Smalltalk变量函数

Smalltalk变量函数
EN

Stack Overflow用户
提问于 2010-10-06 20:11:15
回答 3查看 1.7K关注 0票数 5

Smalltalk(特别是Squeak/Pharo)有某种形式的可变函数吗?

我刚刚读到了在smalltalk中设计自己的控制语句的强大功能,虽然我是ifTrue的铁杆粉丝: ifFalse:我很难想出一个好方法来实现任意的if,if else,if else,...,else语句,思考这些变量函数对于实现case语句是多么有用。就像这样

假类

代码语言:javascript
复制
ifTrue: aBlock (... elseIf: aBoolean then: aSecondBlock ...) else: aLastBlock

vArgList pairsDo: [:x :y| x ifTrue:[^ (y value)] ].
^ aLastBlock
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-10-12 05:26:39

您可以使用#caseOf:otherwise:消息。在一些示例中查找此消息的发送者。

但不管怎样,如果您想使用case语句,那么您并没有遵循smalltalk的做法。告诉我们你想通过你的案例陈述实现什么,这样我们就可以向你展示一些更清晰的方法。

票数 1
EN

Stack Overflow用户

发布于 2010-10-07 03:02:36

Smalltalk用于方法调用的类似关键字的语法本质上定义了方法的多重性。没有像Common Lisp中那样的&rest模式。

当然,您可以让一个方法接受一个列表,比如BlockClosure>>valueWithArguments:,但这几乎不是一回事。

您可以修改Compiler以支持可变方法调用。也许调用只是在每个变量之间使用with:

(条件) ifTrue: aBlock elseIf: aBoolean with: aSecondBlock with: anotherBoolean with: aThirdBlock

票数 3
EN

Stack Overflow用户

发布于 2010-10-24 20:02:03

我在编程中学到的一件事不是你不需要case语句,你不需要 case语句。

Case语句是膨胀对象的方法。当你使用它的时候,你是在降低维护性。那时你将拥有所有你想要的可能性,但是当你想要添加一些东西的时候,当你不再记得那个对象的责任中的微妙之处时,你将不得不检查令人讨厌的代码,所以你会使它变得更加膨胀。

在很短的时间内,它们看起来很友好,但case语句不是你的朋友。从长远来看,他们会咬你的。

此外,它们还会降低代码的灵活性。例如,您不能肯定地添加关于前面代码的案例。当你不再记得为什么要这样编码的时候,你就不得不检查旧的代码。

Case语句是好代码的敌人。

如果你有比ifTrue:ifFalse:更多的东西,那么正确的做法就是为它创建状态。所以你要做的就是实现三个非常简单的类,它们都能理解一些动词。

比如,#doTheNextThing。因此,当对象接收到消息时,它将委托给状态(无论哪一个是这3个状态中的一个(或30个,所以请注意,这很好地扩展了复杂性),并且状态知道如何使原始接收者做出正确的反应。

这将使您的代码轻量级、易懂且可维护性高。您将能够忘记这一点,因为您知道,当您再次查看它时,一切都是如此明显,您不需要考虑代码的过去,而需要考虑代码的未来。

这一点很重要,因为你的内存是你拥有的最昂贵的内存,而AFAIK是不可升级的。所以这项技术可以让你做更强大的事情。

此外,制作3个类对一些人来说可能听起来更多的工作,但事实并非如此。任何新手都可以在一眨眼之间添加3个空类,但只有正确的专家才会记住旧代码中的case语句是如何生成的。如果你非常乐观,只需要几分钟就能回想起来,这样你们就知道下一步该做什么了。想想看。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3872246

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档