Methods 访问实例变量或self更好吗?

Methods 访问实例变量或self更好吗?,methods,smalltalk,pharo,squeak,Methods,Smalltalk,Pharo,Squeak,所以我有一个类计数器和一个名为增量 Object subclass: #Counter instanceVariableNames: 'count' classVariableNames: '' poolDictionaries: '' category: 'Pharo-MOOC' 那么,在Smalltalk/Squeak/Pharo中,哪一个是惯用的还是更好 increment "add 1 to the instance variable (coun

所以我有一个类
计数器
和一个名为
增量

Object subclass: #Counter
    instanceVariableNames: 'count'
    classVariableNames: ''
    poolDictionaries: ''
    category: 'Pharo-MOOC'
那么,在Smalltalk/Squeak/Pharo中,哪一个是惯用的还是更好

increment
    "add 1 to the instance variable (count)"
    self count: self count + 1.


当然,这是为什么呢?

两者都是对等的。 在性能方面,编译器可能会优化这些setter和getter,这样您就不会有任何额外的消息发送。 现在,两种方法都有优点和缺点。我现在能想到的是:

  • 第一个在将来的子类中更适合细化(因为它们提供了另一个修改的钩子)
  • 第二种方法(通常)更具可读性
如果我没记错的话,Kent Beck在他的书《Smalltalk最佳实践模式》中推荐了第一种方法。但是,和任何模式一样,这不是一个用石头写的规则。但是,一般来说,您应该避免创建setter


在我的例子中,我经常选择第一种方法,但我把我的设定者放在一个私人协议中:)

我投票结束这个问题,因为它主要是基于观点的。是的,你是对的。我提供的答案只是主观的。虽然比其他人更传统;)顺便说一句,这完全是离题的:这是新闻英语最美妙的事情之一。在Newspeak中,两者之间没有区别,因为在Newspeak中,一切都是消息发送:没有实例变量。事实上,根本没有变量。“实例变量”只是一对getter和setter(或者在不可变“变量”的情况下只是getter)。局部变量只是
LexicalScope
对象上的getter和setter(或getter)对。诸如此类。我不会把这个问题主要称为基于意见的问题。而且@EstebanLM的答案是否定的。它为每一方展示了一个有效的论点,并且回答说,通过采用一种或另一种方法不会犯错误,这是对一个有效问题的有效和深思熟虑的回答。
increment
    "add 1 to the instance variable (count)"
    count := count + 1.