gpt4 book ai didi

smalltalk - 在smalltalk中重构一个方法

转载 作者:行者123 更新时间:2023-12-04 00:27:04 25 4
gpt4 key购买 nike

我是 Smalltalk (Squeak) 的新用户(实际上是在类(class)中学习它)。我有一种方法来检查一个矩形是否等于给定的矩形,如下所示:

isEqual:givenRec
self a = givenRec a
ifTrue: [
self b = givenRec b
ifTrue: [
^true
].
^false
].
self b = givenRec a
ifTrue: [
self a = givenRec b
ifTrue: [
^true
].
^false
].
^false

我的问题是 - 有没有更好的写法?让它更紧凑?

另外 - 为什么我不能引用 a,它是带有 self 内部方法的 instanceVariableNames?感谢您的帮助!

编辑:

类是这样定义的:

MyShape subclass: #MyTriangle
instanceVariableNames: 'a b c'
classVariableNames: ''
poolDictionaries: ''
category: 'Ex2'

MyShape 只是从 Object 派生而来,什么都没有。

最佳答案

你可以让它更紧凑,是的。

首先,除了#ifTrue:之外,还有#ifFalse:#ifTrue:ifFalse:,大致相当于if- not--then 和 if--then--else。

而且,我们已经有了逻辑 AND 条件,所以为什么不使用它呢:

isEqual: givenRec

(self a = givenRec a and: [self b = givenRec b])
ifTrue: [^ true].
(self b = givenRec a and: [self a = givenRec b])
ifTrue: [^ true].
^false

使用#ifTrue:ifFalse:

isEqual: givenRec

(self a = givenRec a and: [self b = givenRec b])
ifTrue: [^ true]
ifFalse: [^ (self b = givenRec a and: [self a = givenRec b])]

此外,我们可以围绕整个语句进行返回:

isEqual: givenRec

^ (self a = givenRec a and: [self b = givenRec b])
ifTrue: [true]
ifFalse: [self b = givenRec a and: [self a = givenRec b]]

但是ifTrue: [true]有点多余,我们用#or:

isEqual: givenRec

^ (self a = givenRec a and: [self b = givenRec b]) or:
[self b = givenRec a and: [self a = givenRec b]]

非常好,我们也很容易看到逻辑结构。(请注意,我不同于常见的格式样式,以指出两个逻辑表达式的相似点和不同点)。

我们现在只有一个返回^,没有#ifTrue:…


对于实例变量问题:

当您像以前一样在类中定义一些实例变量时,您可以在代码中直接使用它们来访问它们:

Object subclass: #Contoso
instanceVariableNames: 'things'
classVariableNames: ''
poolDictionaries: ''
category: 'Examples'
isThingPlusThreeSameAs: anObject

^ thing + 3 = anObject

但通常情况下,最好通过 getterssetters 来引用实例变量,通常称为 accessors。您必须手动编写它们或使用浏览器中类的第二个上下文菜单(通过“更多...”)的“创建 inst var 访问器”菜单项:

这将生成表单的访问器方法

thing

^ thing
thing: anObject

thing := anObject

你可以像这样在其他方法中使用它们

isThingPlusThreeSameAs: anObject

^ self thing + 3 = anObject

关于smalltalk - 在smalltalk中重构一个方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36514528/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com