Как практически неизменность реализуется при разработке приложений Scala? - PullRequest
7 голосов
/ 03 ноября 2011

Будучи новичком в Scala и текущим Java-разработчиком, Scala был разработан для поощрения использования неизменяемости в дизайне классов.

Как это влияет практически на дизайн классов? Единственное, что мне приходит в голову, это тематические занятия. Настоятельно ли рекомендуются классы случаев для определения данных? Пример? Как еще поощряется неизменность в дизайне классов Scala?

Как разработчик Java, классы, определяющие данные, были изменяемыми. Эквивалентные классы Scala должны быть определены как case-классы?

1 Ответ

11 голосов
/ 04 ноября 2011

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

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

Наконец, обратите внимание, что вы должныпопросите var, чтобы получить некоторую изменчивость.Параметры неизменны, и val так же короток, как и var.Сравните это с Java, где параметры являются изменяемыми, и вам нужно добавить ключевое слово a final, чтобы получить неизменность.В то время как в Scala легче и легче оставаться неизменным, в Java легче оставаться изменчивым.

Приложение

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

Scala List состоит из двух классов, известных как cons и Nil.Первый действительно написан :: в Scala, но я буду называть его традиционным именем.

Nil - пустой список.Он не содержит ничего.Методы, которые зависят от того, что список не пустой, такие как head и tail, генерируют исключения, в то время как другие работают нормально.

Естественно, cons должны тогда представлять непустой список,Фактически, cons имеет ровно два элемента: значение и список.Эти элементы известны как head и tail .

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

Один из примеров такого списка:

val list = 1 :: 2 :: 3 :: Nil

Теперь компоненты Scala List неизменны .Нельзя изменить ни значение, ни список cons .Одним из преимуществ неизменности является то, что вам никогда не нужно копировать коллекцию перед передачей или после получения ее каким-либо другим способом: вы знаете, что список не может измениться.

Теперь давайте рассмотрим, что произойдетесли бы я изменил этот список.Давайте рассмотрим две модификации: удаление первого элемента и добавление нового элемента.

Мы можем удалить один элемент с помощью метода tail, имя которого вовсе не является совпадением.Итак, мы пишем:

val list2 = list.tail

И list2 будет указывать на тот же список, на который указывает list tail .Ничего не было создано: мы просто повторно использовали часть list.Итак, давайте добавим элемент к list2 тогда:

val list3 = 0 :: list2

Мы создали там cons .Этот новый cons имеет значение ( head ), равное 0, а его tail указывает на list2.Обратите внимание, что list и list3 указывают на один и тот же list2.Эти элементы совместно используются обоими list и list3.

Существует много других постоянных структур данных.Тот факт, что данные, которыми вы манипулируете, является неизменным, облегчает совместное использование компонентов.

Более подробную информацию об этом можно найти в книге Криса Окасаки, Чисто функциональные структуры данных ,или на его в свободном доступе тезис с тем же именем.

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