35

我是第一次教 Scala,我的学生发现伴随对象中涉及的故意“双关语”非常令人困惑。考虑以下示例:

class Stack {
  ... methods such as push/pop
}

object Stack {
  ... factory method(s) and possibly others
}

当我使用诸如“堆栈对象”或“堆栈对象”或特别是“堆栈对象”之类的口头短语时,就会出现混淆。我的学生很难理解我是指单例对象 Stack 还是 Stack 类的对象。

我正在寻找替代方法来表达初学者可以更容易理解的内容。我一直考虑将 Stack 类的对象称为“堆栈实例”或“堆栈实例”,但是当试图教 OO 不能将这些东西称为对象时,这似乎很疯狂。在谈论单例对象 Stack 时,我一直在尝试始终使用短语“单例对象”或“伴随对象”,但 Scala 的语法在那里对我不利,因为它只使用“对象”一词。

在这种情况下,我可以重命名单例对象 StackFactory 而不是 Stack,但这只是我自己的类的一个选项,而不是已经内置在 Scala 中的一千零一个伴随对象。

编辑:

对不起,我的问题不够清楚。主要的混淆不是在引用伴随对象时发生。在这种情况下,正如一些人所指出的那样,使用诸如“伴生对象”之类的短语很容易。相反,主要的混淆发生在引用普​​通实例时。然后,如果我说“堆栈对象”(表示某个堆栈实例)或“堆栈对象”(表示这个特定实例),部分学生会认为我的意思是伴随对象——即使我没有使用词伴侣或单身人士。

而且我可以清楚地看到混淆的来源,因为“对象”一词仅与伴随对象一起出现在程序文本中。

4

8 回答 8

19

我认为Stack singleton(如果它是独立的)或Stack companion(如果它带有一个类)是命名object Stack. Scala 语言参考称它们为模块。但是模块现在已经与运行时实体(如在 OSGI 中)有太多的关联,以至于无法适应。

于 2012-09-19T20:21:15.820 回答
17

我认为使用短语“伴侣对象”应该足够清楚。

于 2012-09-19T14:56:24.193 回答
8

Scala 中的这个问题当然不是没有讽刺意味的,但即使在 Java 空间中,也可能存在关于java.lang.Object、它的实例、它的类和它的类的实例的命名问题。

对于 Scala,我提出以下术语:

  • 将实例化的对象称为“实例”</li>
  • 调用object“对象”</li>

最后,我会说 OO 的概念包括对象(在模块和组合的意义上)和对象(在实例的意义上)一样多。

无论您如何决定,一致性都是关键,尤其是对于教学而言。

于 2012-09-19T14:56:31.847 回答
7

我会去

  • “堆栈” == 类堆栈
  • “Stack 的同伴” == Stack 类的同伴对象
  • "A Stack" == 类 Stack 的一个实例
于 2012-09-19T21:13:48.570 回答
4

我认为您的解决方案听起来不错。“Stack单例”非常清楚地表示您谈论的是单例对象而不是整个对象类的事实。至于对您不利的名称,请解释object声明一个对象(单例),而class它是整个对象类(类实例)的模板

您可能应该确保的另一件事是它object Stack 不是 class Stack. 如果学生不理解这一点,那么他们可能会更难区分单例Stackclass Stack.

在这种情况下,我可以重命名单例对象 StackFactory 而不是 Stack,但这只是我自己的类的一个选项,而不是已经内置在 Scala 中的一千零一个伴随对象。

请注意,如果您重命名该对象,则它不再是伴随对象。类及其伴生对象具有 Scala 编译器授予的特殊权限,可以访问彼此的私有成员。如果您更改单例的名称以使其与类不匹配,则编译器将不再有任何指示它是伴生对象并且它会失去伴生特权。

于 2012-09-19T15:03:14.003 回答
3

如果你真的很擅长保持一致,你也可以将实例class Stack称为“堆栈实例”,但这可能需要一些习惯性的扭曲。除此之外,“堆栈伴随对象”或“对象堆栈”,绝不是“堆栈对象”。

于 2012-09-19T15:09:40.410 回答
2

也许我的提议有点天真,但我会打电话给

  • 堆栈类:堆栈类本身(我告诉过你这很幼稚)

  • 堆栈/堆栈实例/堆栈对象:堆栈类的实例

  • 堆栈伴侣/堆栈伴侣对象/堆栈单例/堆栈工厂(如果您将其用于该目的):堆栈类的伴侣对象。

(事实上​​,在 Odersky 的“programming scala”中,最常用的术语是“companion object”,我认为这很清楚......)

我还要强调堆栈实例和堆栈伴侣之间的区别,这是一个常见的混淆来源。

关于你的学生的困惑,我会理解对于一个大学生来说,谨慎并与术语的使用保持一致是多么重要,你也可以提供一些测验或练习来区分这些概念之间的区别。

有时通过使用术语可以更好地学习术语。

于 2012-09-21T03:21:20.213 回答
1

如果您希望单例对象成为类或特征的伴侣,它必须具有相同的名称(以及包和源文件)。

伴侣可以访问彼此的私有成员,例如伴侣对象中的工厂仍然可以使用私有构造函数创建(伴侣)类的实例。

于 2012-09-20T05:58:31.377 回答