Swift Struct vs Class: каков допустимый размер стека? и рефакторинг класса для структуры
Во-первых, я понимаю, что разница между значениями и ссылочными типами -this не является вопросом. Я переписываю часть своего кода в Swift и решил также реорганизовать некоторые из классов. Поэтому я думал, что посмотрю, есть ли у некоторых классов смысл как структуры.
Память: у меня есть некоторые классы моделей, которые содержат очень большие массивы, которые постоянно растут в размерах (неизвестный конечный размер) и могут существовать в течение нескольких часов. Во-первых, существуют ли какие-либо рекомендации относительно предполагаемого или абсолютного размера для структуры, поскольку он живет в стеке?
Использование рефакторинга: Поскольку я рефакторинг того, что сейчас является беспорядком со слишком большой зависимостью, интересно, как я мог бы улучшить это. Контроллеры просмотров и просмотра в основном легко, это моя модель и то, что она делает, что всегда оставляло меня желать лучшего примера.
WorkerManager
: Singleton, который держит один или два Worker
одновременно. Всегда будут записывать новые данные с датчика, а другой - просматривать сохраненные данные. Контроллеры вид получить Worker
ссылку из WorkerManager
, и попросить Worker
для данных, которые будут отображаться.
Worker
: все в очереди, чтобы предотвратить проблемы с доступом к памяти (указатели массива C постоянно изменяются по мере их роста). Прослушивание: Слушание Worker
прослушивает новые данные, отправляет его на Processor
объект (что он создан), который очищает данные и сохраняет его в массивах C, проведенных Worker
. Тогда, если есть достоверные данные, то Worker
указывает Analyzer
(также принадлежащий работнику) для анализа данных и сохраняет его в других массивах C, подаваемого видом. Оба Processor
и Analyzer
нуждаются в состоянии знать, что произошло в прошлом, и что обрабатывать и анализировать дальше. Чистые исходные данные хранятся в отдельном объекте Record
NSManaged. Рецензент берет Record
и использует чистые исходные данные для воссоздания всех проанализированных данных, чтобы их можно было пересмотреть. (анализируемые данные массивны, и я не хочу хранить их на диске)
Теперь, мой второй вопрос: может ли/следует заменить Processor
и Analyzer
на структуры? Или, может быть, протоколы для Worker
? Они не являются "объектами" в нормальном смысле, просто удобными группами связанных методов и необходимым состоянием. А так как для кода почти тысяча строк для каждого, и я не хочу ставить его в один класс или даже в тот же файл.
У меня просто нет хорошего представления о том, как удалить все мое состояние, использовать чистые функции для всех сложных математических операций, выполняемых на массивах, и где их разместить.
Ответы
Ответ 1
Хотя сама структура живет в стеке, данные массива живут в куче, так что массив может динамически увеличиваться. Таким образом, даже если у вас есть массив с миллионом элементов в нем и передать его где-то, ни один из элементов не копируется, пока вы не измените новый массив из-за реализации копирования на запись. Это подробно описано в 2015 году в сессии WWDC 414.
Что касается второго вопроса, я думаю, что в 2015 году сессия WWF 414 снова получит ответ. Основная проверка, которую инженеры Apple рекомендуют для типов значений:
Используйте тип значения, когда:
- Сравнение данных экземпляра с == имеет смысл
- Вы хотите, чтобы копии имели независимое состояние
- Данные будут использоваться в коде через несколько потоков
Используйте ссылочный тип (например, используйте класс), когда:
- Сравнение идентичности экземпляра с === имеет смысл
- Вы хотите создать общее, изменяемое состояние
Поэтому из того, что вы описали, я думаю, что ссылочные типы лучше всего подходят для Processor
и Analyzer
. Похоже, что копии Processor
and Analyzer
являются допустимыми объектами, если вы не создали новый Producer
и Analyzer
явно. Не хотите ли, чтобы изменения этих объектов были разделены?