Использовал ли инструменты кодогенерации, такие как Sourcery?

«Использовал ли инструменты кодогенерации, такие как Sourcery?» — вопрос из категории Софт-скиллы, который задают на 10% собеседований IOS Разработчик. Ниже — развёрнутый пример ответа, который можно адаптировать под свой опыт.

Ответ

Да, активно использовал Sourcery — инструмент для метапрограммирования в Swift, который генерирует код на основе аннотаций в исходниках и шаблонов (Stencil).

Типичные сценарии применения:

  • Автоматизация boilerplate-кода: Генерация реализаций протоколов Equatable, Hashable, Codable для моделей.
  • Моки для тестирования: Автоматическое создание мок-объектов, которые реализуют протоколы зависимостей, что упрощает unit-тестирование.
  • Линтинг и проверки: Генерация кода для проверки, что все случаи в enum обработаны в switch.
  • Динамические шаблоны UI: Генерация кода для таблиц или коллекций на основе моделей данных.

Пример шаблона Sourcery (.stencil) для автоматической генерации Equatable:

// AutoEquatable.stencil
{% for type in types.structs|enum where type.implements.Equatable %}
// MARK: - AutoEquatable for {{ type.name }}
extension {{ type.name }}: Equatable {
    static func ==(lhs: {{ type.name }}, rhs: {{ type.name }}) -> Bool {
        {% for variable in type.storedVariables %}
        guard lhs.{{ variable.name }} == rhs.{{ variable.name }} else { return false }
        {% endfor %}
        return true
    }
}
{% endfor %}

Аннотация в исходном коде Swift, которая активирует шаблон:

// sourcery: AutoEquatable
struct User {
    let id: Int
    let name: String
    var email: String?
}

Преимущества:

  • Снижение рутинной работы и ошибок при написании повторяющегося кода.
  • Единообразие сгенерированного кода по всему проекту.
  • Упрощение рефакторинга — при изменении модели достаточно перегенерировать код.

Недостатки / сложности:

  • Настройка в CI/CD: Генерацию нужно интегрировать в процесс сборки (например, как Run Script Phase в Xcode).
  • Отладка: Сложнее отследить источник ошибки, если она в сгенерированном коде. Необходимо проверять шаблоны и входные аннотации.
  • Зависимость от инструмента: Добавляет ещё одну зависимость в проект.