Подтвердить что ты не робот

Как говорить о сопутствующих объектах против обычных объектов?

Я преподаю Scala в первый раз, и мои ученики находят умышленное "наказание", вовлеченное в сопутствующие объекты, очень запутанным. Рассмотрим следующий пример:

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

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

Смятение возникает, когда я использую словесные фразы, такие как "объект стека" или "объекты стека" или особенно "объект стека". Мои ученики испытывают трудности с пониманием того, я имею в виду объект Singleton Stack или объекты класса Stack.

Я ищу альтернативные способы вербализации таких вещей, которые новички могут понять легче. Я всегда рассматривал объекты класса Stack как "экземпляры стека" или "экземпляры Stack", но кажется сумасшедшим, когда вы пытаетесь научить OO не иметь возможность называть эти вещи объектами. Я пытаюсь ВСЕГДА использовать фразу "Singleton Object" или "Companion Object", когда речь идет об одном объекте Stack, но синтаксис Scala работает против меня там, потому что он использует только слово "объект".

В этом случае я мог бы переименовать одноэлементный объект StackFactory вместо Stack, но это только опция для моих собственных классов, а не для тысяч и одного сопутствующего объекта, уже встроенного в Scala.

Изменить:

Извините, я не был достаточно ясен в своем вопросе. Основная путаница происходит НЕ при обращении к сопутствующему объекту. В этом случае, как отметили несколько человек, достаточно просто использовать такую ​​фразу, как "сопутствующий объект". Вместо этого основная путаница происходит при обращении к обычным экземплярам. Затем, если я скажу "объект стека" (что означает некоторый экземпляр стека) или "объект стека" (что означает этот конкретный экземпляр), некоторые части учащихся подумают, что я имею в виду объект-компаньон, - хотя я не использовал слово компаньон или синглтон.

И я прекрасно вижу, откуда возникает путаница, потому что слово "объект" появляется в тексте программы только со своим сопутствующим объектом.

4b9b3361

Ответ 1

Эта проблема в Scala, конечно, не без иронии, но даже в пространстве Java могут возникать проблемы с именами, относящимися к java.lang.Object, ее экземплярам, ​​классу и экземплярам его класса.

Для Scala я предлагаю следующую терминологию:

  • Вызывать экземпляры объектов экземпляров
  • Вызов object "объектов"

В конце концов, я бы сказал, что идея OO включает объекты (в смысле модулей и композиции) столько же, сколько объекты (в смысле экземпляров).

Независимо от того, как вы решаете, последовательность является ключевой, особенно для обучения.

Ответ 2

Я думаю, что Stack singleton (если он стоит один) или Stack companion (если он поставляется с классом) - лучший способ назвать object Stack. Справочник по языку Scala вызывает их модули. Но модули до сих пор слишком сильно связаны с объектами времени выполнения (как в OSGI), чтобы быть в курсе этого.

Ответ 3

Я думаю, что использование фразы "сопутствующий объект" должно быть достаточно ясным.

Ответ 4

Я поеду за

  • "Stack" == класс Stack
  • "Сопутствующий пакет" == Сопутствующий объект класса Stack
  • "Stack" == экземпляр класса Stack

Ответ 5

Я думаю, ваше решение звучит неплохо. "Синглтон Stack очень четко обозначает тот факт, что вы говорите об одном объекте, а не о целом классе объектов. Что касается имен, действующих против вас, объясните, что object объявляет один объект (singleton), тогда как class является шаблоном для целого класса объектов (экземпляров класса).

Еще одна вещь, которую вы, вероятно, должны убедиться, что object Stack не является экземпляром class Stack. Если ученики не понимают этого момента, то, вероятно, им будет сложнее провести различие между singleton Stack и экземплярами class Stack.

В этом случае я мог бы переименовать одноэлементный объект StackFactory Stack, но это только вариант для моих собственных классов, а не для тысячи и один сопутствующие объекты, уже встроенные в Scala.

Обратите внимание, что если вы переименуете объект, то он больше не является сопутствующим объектом. Классы и их сопутствующие объекты имеют специальные разрешения, предоставленные компилятором Scala для доступа к другим частным членам. Если вы измените имя синглтона так, чтобы он не соответствовал классу, то больше не было какого-либо индикатора для компилятора, являющегося его сопутствующим объектом, и он теряет сопутствующие привилегии.

Ответ 6

Если вы действительно хорошо относитесь к тому, чтобы быть последовательным, вы также можете ссылаться на экземпляры class Stack как "экземпляры стека", но для этого может потребоваться немного крутизна привычки. Кроме этого, "объект сокетов Stack" или "Stack объекта" никогда не "объект Stack".

Ответ 7

Возможно, мое предложение немного наивно, но я бы просто позвонил

  • класс стека: самому классу стека (я сказал вам, что это наивно)

  • стек/экземпляр стека/объект стека: экземпляр класса стека

  • сопутствующий объект сокета-спутника-стека/стек singleton/stack factory (если вы используете его для этой цели): сопутствующий объект класса стека.

(На самом деле, в Odersky "программировании scala" термин чаще всего используется "сопутствующий объект", который, я думаю, довольно ясен...)

Я также хотел бы подчеркнуть разницу между экземпляром стека и компаньоном стека, который является общим источником путаницы.

и в связи с путаницей ваших учеников, я бы сочувствовал, насколько важно, чтобы студент университета был осторожным и согласным с использованием терминологии, вы могли бы также предоставить некоторые викторины или упражнения, чтобы отличить каждое из этих понятий.

Иногда терминологию лучше изучать, используя ее.

Ответ 8

Если вы хотите, чтобы объект singleton был компаньоном класса или признака, он должен иметь то же имя (и пакет и исходный файл).

Компаньоны могут обращаться к другим частным членам, например. a factory в сопутствующем объекте все еще может создавать экземпляры класса (компаньона) с частным конструктором.