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

Неизменяемые коллекции?

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

Я говорю о коллекциях для хранения значений Point3 и т.д., которые можно добавить, поскольку они идут в разное время. Итак, если в коллекции есть 1M-значения, и вам нужно удалить 1 из них, вам придется создавать одну и ту же коллекцию снова, правильно?

4b9b3361

Ответ 1

Эрик Липперт имеет серию о неизменности в С#, и если вы прочтете его полностью, он реализует пару разных неизменных коллекций:

Ответ 2

Неизменяемые коллекции великолепны, особенно если ваше приложение уже использует неизменяемые типы или семантику.

.NET просто отправил свои первые неизменные коллекции, которые я предлагаю вам попробовать.

Ответ 3

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

Обычно ваша коллекция представляет что-то, верно? Это коллекция собак или коллекция счетов...

Обычно есть что-то, что вы можете сделать с коллекцией собак (Herd? Neuter?) Или с коллекцией счетов (pay?). Практически всегда есть операции, которые применяются ко всему списку объектов - операции, которые имеют функциональные возможности помимо единственного числа. invoice.pay() (например, гарантируя, что самые важные счета будут оплачены первыми), без класса вокруг вашей коллекции, на самом деле нет места для размещения этих операций.

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

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

Ответ 4

Если вы только когда-либо добавляете/удаляете с самого начала или конца, вы можете обмануть - но в целом; да: подразумевается, что вам нужно создать новую коллекцию для каждого изменения.

Итак: вам нужно (эффективно) мутировать коллекции? Если да, и учитывая их размер: у меня возникнет соблазн взглянуть на синхронизирующий доступ (вместо того, чтобы сделать их должным образом неизменными). Посмотрите lock (aka Monitor).

Ответ 5

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

На оборотной стороне неизменяемость также может привести к снижению производительности, особенно когда вы используете шаблон "copy-on-write" для моделирования "изменений".

Вам нужно решить почему, чтобы ваши объекты/коллекции были неизменными - и это поможет вам принять решение о том, делать это или нет.

Ответ 6

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

Ответ 7

Это зависит от стиля, в котором ваша программа написана/разработана.

Неизменяемая коллекция имеет смысл только в том случае, если вы программируете в стиле, зависящем от функционального программирования (Импортно разработанные программы не должны их использовать).

И как в функциональных языках, вы должны использовать Связанные списки, которые могут быть созданы в O (1) на элемент (cons) и обрабатывать их функционально (рекурсии, создание новых списков из списков).

Если ваша программа требует императивных коллекций (массивов, векторов/списков), сохраните их изменчивыми.

Ответ 8

Вы можете определить свой публичный интерфейс как IEnumerable, но по-прежнему использовать изменчивую коллекцию в своей реализации.

Ответ 9

Все зависит от того, кто использует коллекции одновременно. Строки неизменяемы, чтобы предотвратить одновременное удаление двух-стильных файлов boo-boo, пытаясь удалить первый char.

Ответ 10

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