Изменяемые и неизменяемые объекты

Неизменяемые объекты против неизменяемых коллекций

Один из тонких моментов в object-oriented-design споре по поводу изменяемых oops и неизменяемых объектов - это immutable возможность распространения object-orientation концепции неизменяемости object-orientation на коллекции. Неизменяемый immutable-class объект - это объект, который oo-design часто представляет одну логическую object-oriented структуру данных (например, неизменяемую oo-design строку). Если у вас есть oo ссылка на неизменяемый объект, содержимое oops объекта не изменится.

Неизменяемая oop коллекция - это коллекция, которая oo никогда не изменяется.

Когда object-oriented я выполняю операцию с изменяемой immutability коллекцией, я меняю коллекцию object-oriented на месте, и все сущности, имеющие immutable-class ссылки на коллекцию, увидят immutable-class это изменение.

Когда я выполняю immutability операцию с неизменяемой коллекцией, возвращается ood ссылка на новую коллекцию, отражающую immutable изменение. Все сущности, которые object-oriented-modeling имеют ссылки на предыдущие object-oriented-modeling версии коллекции, не увидят oo изменения.

Умные реализации object-oriented-modeling не обязательно должны копировать oo-design (клонировать) всю коллекцию, чтобы oop обеспечить неизменность. Самый mutable простой пример - это стек, реализованный object-oriented-design в виде односвязного списка oo-design и операций push / pop. Вы immutable можете повторно использовать oo все узлы из предыдущей коллекции object-oriented-modeling в новой коллекции, добавив object-orientation только один узел для push immutable и не клонируя никакие узлы immutable для pop. С другой стороны, операция immutable push_tail для односвязного oo-design списка не так проста и эффективна.

Неизменяемые и изменяемые переменные / ссылки

Некоторые oo-design функциональные языки используют immutable-class концепцию неизменяемости oo-design самих объектных ссылок, позволяя oops назначать только одну ссылку.

  • В Erlang это верно для всех «переменных». Я могу назначить объекты ссылке только один раз. Если бы мне пришлось работать с коллекцией, я бы не смог переназначить новую коллекцию старой ссылке (имени переменной).
  • Scala также встраивает это в язык, при этом все ссылки объявляются с помощью var или val, причем vals представляют собой только однократное присвоение и продвигают функциональный стиль, но vars позволяют более C-подобная или Java-подобная структура программы.
  • Объявление var / val является обязательным, в то время как многие традиционные языки используют необязательные модификаторы, такие как final в java и const в C.

Простота разработки и производительность

Практически object-oriented всегда причиной использования object-oriented-modeling неизменяемого объекта является oop продвижение программирования oops без побочных эффектов и простые oops рассуждения о коде (особенно ood в среде с высокой степенью oops параллелизма / параллелизма). Вам ood не нужно беспокоиться о том, что immutability базовые данные будут изменены oop другим объектом, если объект object-oriented-design неизменен.

Главный недостаток object-oriented-design - производительность. Вот object-oriented-modeling описание a simple test I did in Java, в котором сравниваются immutability некоторые неизменяемые и immutability изменяемые объекты в игрушечной immutability задаче.

Проблемы с производительностью immutable спорны во многих приложениях, но oo не во всех, поэтому многие object-orientation большие числовые пакеты, такие oo как класс Numpy Array в Python, позволяют object-oriented обновлять большие массивы immutability на месте. Это было бы важно object-oriented-design для прикладных областей, в oops которых используются большие ood матричные и векторные операции. Эти immutable-class большие задачи, связанные object-oriented с параллельными данными и object-oriented-modeling требующими большого объема immutable вычислений, значительно ускоряются object-oriented-modeling за счет работы на месте.

oop

immutability

mutable

2022-11-17T11:03:06+00:00