Должны ли мы реализовать поведение копирования при записи для наших пользовательских типов?

В Swift коллекции неявно реализованы с поведением копировать при записи; Однако мы не получаем его бесплатно в наших пользовательских типах.

Мой главный вопрос:

Независимо от того, как этого добиться, стоит ли это делать для наших пользовательских типов? Почему, почему нет?

Кроме того:

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


person Ahmad F    schedule 06.05.2019    source источник
comment
Это зависит от вашего пользовательского типа. – Если вы можете опираться на существующие типы с помощью COW, то это, безусловно, более безопасный и простой подход.   -  person Martin R    schedule 06.05.2019
comment
Спасибо @MartinR. Это зависит от вашего пользовательского типа, вот что я хотел бы знать, существуют ли стандарты для этого? Надеюсь, не слишком широко...   -  person Ahmad F    schedule 06.05.2019
comment
Универсального ответа, наверное, нет. Можете быть более конкретными? Какой тип и объем данных содержит ваш тип? Вам вообще нужна семантика значений (иначе используйте класс)? Можно ли использовать использовать существующие типы COW или нет?   -  person Martin R    schedule 06.05.2019
comment
@MartinR, например, у меня есть структура (модель даже без функций), которая содержит около 20 свойств различных типов, таких как Array, Double, Bool, и да, в определенные моменты я копирую ее. На данный момент, было бы хорошей идеей реализовать для него корову?   -  person Ahmad F    schedule 06.05.2019
comment
Я бы сначала оценил, действительно ли вам нужна семантика значений. Если нет: используйте класс, и все готово.   -  person Martin R    schedule 06.05.2019
comment
См. также stackoverflow.com/a/24232845/1187415, где цитируется старая версия справочника по языку Swift: «< i>Основная цель структуры — инкапсулировать несколько относительно простых значений данных.”   -  person Martin R    schedule 06.05.2019


Ответы (1)


Вы не обязаны этого делать, но оптимизация может оказаться полезной, если у вас есть ресурсы и вам нужно это сделать. Задайте себе следующие вопросы:

  • Часто ли копируется мой тип данных (т.е. применимость)?
  • Достаточно ли просто внедрить CoW в разумные сроки (т. е. жизнеспособность)?
  • Получает ли мое приложение выгоду от этих оптимизаций (т. е. возврат инвестиций)?

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

Преждевременная оптимизация производительности — корень всех зол ~ Дональд Кнут

person TmKVU    schedule 06.05.2019