Где тематические классы НЕ должны использоваться в Scala? - PullRequest
25 голосов
/ 22 января 2010

Case-классы в Scala - это стандартные классы, улучшенные с помощью сопоставления с образцом, equals, ... (или я ошибаюсь?). Более того, они не требуют «нового» ключевого слова для своего экземпляра. Мне кажется, что их проще определить, чем обычные классы (или я опять не прав?).

Существует множество веб-страниц, рассказывающих, где их следует использовать (в основном о сопоставлении с образцом). Но где их следует избегать? Почему бы нам не использовать их повсюду?

Ответы [ 4 ]

20 голосов
/ 22 января 2010

Есть много мест, где тематические классы не подходят:

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

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

Или, другими словами, не переоценивать.

16 голосов
/ 22 января 2010

Наследование от тематических классов проблематично. Предположим, у вас есть такой код:

case class Person(name: String) { }

case class Homeowner(address: String,override val name: String)
  extends Person(name) { }

scala> Person("John") == Homeowner("1 Main St","John")
res0:  Boolean = true

scala> Homeowner("1 Main St","John") == Person("John")
res1: Boolean = false

Возможно, это то, что вы хотите, но обычно вы хотите a == b, если и только если b == a. К сожалению, компилятор не может автоматически исправить это за вас.

Это становится еще хуже, потому что хэш-код Person("John") не совпадает с хэш-кодом Homeowner("1 Main St","John"), поэтому теперь равняется действиям странным , а hashCode действует странным.

Пока вы знаете, чего ожидать, наследование от case-классов может дать приемлемые результаты, но это стало рассматриваться как дурной тон (и, таким образом, не рекомендуется в 2.8).

1 голос
/ 01 февраля 2010

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

0 голосов
/ 23 января 2010

Может быть заманчиво использовать case-классы, потому что вам нужен бесплатный toString / equals / hashCode. Это может вызвать проблемы, поэтому избегайте этого.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...