В этой статье мы обсудим значения и ссылочные типы Swift 5 и посмотрим, как они обрабатываются.

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

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

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

Давайте углубимся в некоторые различия между этими двумя типами.

Swift имеет всего шесть типов: они состоят из четырех именованных типов или номинальных типов:

  • протокол: тип значения (но могут быть ссылочными типами)
  • struct: Тип значения
  • enum: Тип значения
  • class: Тип ссылки

И два Безымянных / составных типа:

  • кортеж: тип значения
  • функция: ссылочный тип

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

Разница между типами значений и ссылочными типами

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

В первом примере у нас есть TestValue в качестве значения и TestReference в качестве ссылочного типа, как показано ниже:

Это создает ценную и справочную версию Test. Давайте теперь посмотрим на поведение типа значения:

Затем давайте посмотрим на поведение ссылочного типа:

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

По этой причине управление состоянием программы становится трудным, когда мы активно работаем со ссылочными типами. Однако такое поведение можно использовать во благо. Например, мы можем использовать его для реализации «Действие при дистанционном тестировании».

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

Использование ссылочных типов при тестировании типов значений

Давайте посмотрим на следующую структуру:

Как видите, проверить функциональность этой структуры очень сложно. Теперь давайте попробуем исправить проблемы в приведенном выше коде, добавив имитацию, чтобы сделать его более тестируемым.

Сначала мы добавим протокол с именем CountKeeper, а затем структуру RealTimeCounter, чтобы обеспечить реализацию протокола по умолчанию, как показано ниже:

Теперь мы можем внедрить эту CountKeeper зависимость протокола в наш Counter, чтобы сделать его более тестируемым:

Наконец, давайте создадим фиктивный объект ссылочного типа:

Теперь мы можем написать ряд тестов, используя этот фиктивный объект ссылочного типа, поскольку этот фиктивный объект позволяет нам проникнуть внутрь класса Test и изменить его извне. В то же время мы можем быть уверены, что такое поведение не будет отображаться в нашем производственном коде, поскольку CountKeeper для производственного кода является структурой. Вы можете увидеть результат нескольких тестовых случаев на скриншоте ниже:

За другими обновлениями вы можете следить за мной в Твиттере на моем твиттере @NavRudraSambyal

Спасибо за чтение, поделитесь, если вы сочли полезным :)

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

Являясь независимой редакцией, Heartbeat спонсируется и публикуется Comet, платформой MLOps, которая позволяет специалистам по данным и группам машинного обучения отслеживать, сравнивать, объяснять и оптимизировать свои эксперименты. Мы платим участникам и не продаем рекламу.

Если вы хотите внести свой вклад, отправляйтесь на наш призыв к участникам. Вы также можете подписаться на наши еженедельные информационные бюллетени (Deep Learning Weekly и Comet Newsletter), присоединиться к нам в » «Slack и подписаться на Comet в Twitter и LinkedIn для получения ресурсов, событий и гораздо больше, что поможет вам быстрее создавать лучшие модели машинного обучения.