35

私は初めてScalaを教えていますが、生徒たちはコンパニオンオブジェクトに含まれる意図的な「しゃれ」が非常に混乱していることに気づいています。次の例を考えてみましょう。

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

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

「スタックオブジェクト」や「スタックオブジェクト」、特に「スタックオブジェクト」などの動詞句を使用すると、混乱が生じます。私の生徒は、私がシングルトンオブジェクトStackを意味するのか、Stackクラスのオブジェクトを意味するのかを理解するのに苦労しています。

初心者が理解しやすいように言葉で表現する別の方法を探しています。私は常にStackクラスのオブジェクトを「Stackinstances」または「instancesofStack」と呼ぶことを考えてきましたが、OOにこれらのオブジェクトを呼び出せないように教えようとすると、おかしなことに思えます。シングルトンオブジェクトスタックについて話すときは、常に「シングルトンオブジェクト」または「コンパニオンオブジェクト」というフレーズを使用しようとしていますが、Scalaの構文は、「オブジェクト」という単語のみを使用しているため、そこではうまくいきません。

この場合、Stackの代わりにシングルトンオブジェクトStackFactoryの名前を変更できますが、これは自分のクラスのオプションにすぎず、Scalaにすでに組み込まれている1,000個のコンパニオンオブジェクトのオプションではありません。

編集:

申し訳ありませんが、私の質問では十分に明確ではありませんでした。主な混乱は、コンパニオンオブジェクトを参照する場合には発生しません。その場合、何人かの人が指摘しているように、「コンパニオンオブジェクト」などのフレーズに使用するのは簡単です。代わりに、通常のインスタンスを参照するときに主な混乱が発生します。次に、「スタックオブジェクト」(スタックインスタンスを意味する)または「スタックオブジェクト」(この特定のインスタンスを意味する)と言うと、一部の学生は、私がコンパニオンオブジェクトを意味していると思います。コンパニオンまたはシングルトンという単語。

また、「オブジェクト」という単語は、コンパニオンオブジェクトとともにのみプログラムテキストに表示されるため、混乱がどこから来ているのかを完全によく理解できます。

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>
  • objectsを「オブジェクト」と 呼びます</li>

結局のところ、OOの概念には、オブジェクト(インスタンスの意味)だけでなく、オブジェクト(モジュールと構成の意味)も含まれていると言えます。

どのように決定するかに関係なく、特に教育では一貫性が重要です。

于 2012-09-19T14:56:31.847 に答える
7

私は行きます

  • "スタック"==クラススタック
  • "Stackのコンパニオン"==Stackクラスのコンパニオンオブジェクト
  • "AStack"==クラスStackのインスタンス
于 2012-09-19T21:13:48.570 に答える
4

あなたの解決策は良さそうだと思います。「Stackシングルトン」は、オブジェクトのクラス全体ではなく、シングルトンオブジェクトについて話しているという事実を非常に明確に示しています。あなたに不利に働く名前については、それが単一のオブジェクト(シングルトン)をobject宣言しているのに対し、はオブジェクトのクラス全体(クラスインスタンス)のテンプレートであることを説明します。class

おそらく確認する必要があるもう1つのことは、それobject Stack がのインスタンスではないという class Stackことです。Stack生徒がその点を理解していない場合、シングルトンとのインスタンスを区別するのに苦労するでしょうclass Stack

この場合、Stackの代わりにシングルトンオブジェクトStackFactoryの名前を変更できますが、これは自分のクラスのオプションにすぎず、Scalaにすでに組み込まれている1,000個のコンパニオンオブジェクトのオプションではありません。

オブジェクトの名前を変更すると、コンパニオンオブジェクトではなくなることに注意してください。クラスとそのコンパニオンオブジェクトには、Scalaコンパイラーによって付与された、互いのプライベートメンバーにアクセスするための特別なアクセス許可があります。シングルトンの名前をクラスと一致しないように変更すると、それがコンパニオンオブジェクトであるというコンパイラへのインジケータがなくなり、コンパニオン特権が失われます。

于 2012-09-19T15:03:14.003 に答える
3

一貫性が本当に得意な場合は、のインスタンスをclass Stack「スタックインスタンス」と呼ぶこともできますが、それには少し習慣をひねる必要があるかもしれません。それ以外は、「スタックコンパニオンオブジェクト」または「オブジェクトスタック」であり、「スタックオブジェクト」ではありません。

于 2012-09-19T15:09:40.410 に答える
2

たぶん私の提案は少し素朴ですが、私はただ電話します

  • スタッククラス:スタッククラス自体に(ナイーブだと言った)

  • スタック/スタックインスタンス/スタックオブジェクト:スタッククラスのインスタンス

  • スタックコンパニオン/スタックコンパニオンオブジェクト/スタックシングルトン/スタックファクトリ(その目的で使用する場合):スタッククラスのコンパニオンオブジェクト。

(実際、Oderskyの「プログラミングスカラ」で最も頻繁に使用される用語は「コンパニオンオブジェクト」であり、これはかなり明確だと思います...)

また、スタックインスタンスとスタックコンパニオンの違いを強調します。これは一般的な混乱の原因です。

学生の混乱については、大学生が用語の使用に注意して一貫していることがいかに重要であるかを共感します。また、これらの概念のそれぞれの違いを伝えるためのクイズや演習を提供することもできます。

用語は、それを使用することでよりよく学習される場合があります。

于 2012-09-21T03:21:20.213 に答える
1

シングルトンオブジェクトをクラスまたはトレイトのコンパニオンにする場合、同じ名前(およびパッケージとソースファイル)が必要です。

コンパニオンは相互にプライベートメンバーにアクセスできます。たとえば、コンパニオンオブジェクトのファクトリは、プライベートコンストラクタを使用して(コンパニオン)クラスのインスタンスを作成できます。

于 2012-09-20T05:58:31.377 に答える