← Назад к вопросам

Какие знаешь шаблоны кодогенерации?

1.7 Middle🔥 141 комментариев
#CI/CD и инструменты разработки

Комментарии (1)

🐱
deepseek-v3.2PrepBro AI5 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Шаблоны кодогенерации в iOS разработке

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

1. Метапрограммирование с помощью Swift Macros (Swift 5.9+)

Наиболее современный и интегрированный в язык подход. Swift Macros позволяют создавать макросы, которые разворачиваются в код во время компиляции.

// Пример использования макроса @Observable из SwiftUI
import SwiftUI
import Observation

@Observable
class UserModel {
    var name: String = ""
    var age: Int = 0
}

// Макрос генерирует код для наблюдения за свойствами

Виды макросов:

  • Функциональные макросы (#macro) — возвращают выражение.
  • Аттач-макросы (@macro) — применяются к декларациям (классы, свойства).
  • Peer-макросы — добавляют новые декларации рядом с целевой.
  • Declaration-макросы — создают целые новые декларации.
// Пример создания простого макроса для дебагга
@freestanding(expression)
public macro debugLog(_ value: Any) = #externalMacro(module: "DebugMacros", type: "DebugLogMacro")

// Использование
let result = calculateSomething()
#debugLog(result) // Генерирует print("calculateSomething: \(result)")

2. Генерация через Sourcery (и другие инструменты на Swift/Stencil)

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

// Аннотация в коде
// sourcery: AutoMockable
protocol DataService {
    func fetchData() -> Data
}

// Stencil шаблон для генерации
{% for protocol in types.protocols where protocol.annotations.AutoMockable %}
class {{ protocol.name }}Mock: {{ protocol.name }} {
    {% for method in protocol.methods %}
    var {{ method.name }}Called = false
    {% endfor %}
}
{% endfor %}

// Результат генерации
class DataServiceMock: DataService {
    var fetchDataCalled = false
    func fetchData() -> Data { /* реализация */ }
}

Ключевые сценарии для Sourcery:

  • Генерация mocks для тестирования.
  • Автоматическое создание Equatable/Hashable реализаций.
  • Генерация Codable для сложных моделей.
  • Создание библиотек перечислений (например, для строк локализации).

3. Генерация моделей и API клиентов через Swagger/OpenAPI

Для проектов с задокументированным API (Swagger/OpenAPI) используются инструменты типа Swagger Codegen или OpenAPI Generator.

# Пример команды генерации
openapi-generator generate -i api.yaml -g swift5 -o ./GeneratedAPI

Это создает:

  • DTO модели с Codable конформностью.
  • API клиенты с методами для каждого endpoint.
  • Конфигурацию сетевого слоя.
// Пример генерированного кода
struct UserDTO: Codable {
    let id: Int
    let name: String
    let email: String
}

protocol UserAPI {
    func getUser(id: Int) async throws -> UserDTO
}

4. Генерация UI через шаблоны (например, для SwiftUI)

Для повторяющихся UI компонентов можно создавать шаблонные генераторы.

// Пример: генерация списка экранов для TabView
let screens = ["Home", "Search", "Profile"]
let generatedCode = screens.map { screenName in
    """
    struct \(screenName)View: View {
        var body: some View {
            Text("\(screenName)")
                .tabItem {
                    Label("\(screenName)", systemImage: "circle")
                }
        }
    }
    """
}.joined(separator: "\n")

5. Генерация кода для асинхронных операций (Combine, async/await)

Шаблоны для автоматического создания Publisher или async версий методов.

// Аннотация для генерации async версии
// generateAsync
func fetchItems() -> Future<[Item], Error>

// Генерированный код
func fetchItems() async throws -> [Item] {
    return try await withCheckedThrowingContinuation { continuation in
        fetchItems().sink(
            receiveCompletion: { completion in
                if case .failure(let error) = completion {
                    continuation.resume(throwing: error)
                }
            },
            receiveValue: { value in
                continuation.resume(returning: value)
            }
        )
    }
}

6. Инструменты и библиотеки для кодогенерации

  • Sourcery — наиболее популярный для Swift.
  • SwiftGen — специализируется на генерации кода для ресурсов (assets, локализация).
  • Meta — альтернатива Sourcery с другими шаблонами.
  • Cuckoo — генератор моков для тестирования.
  • Собственные скрипты (Python, Ruby) для специфичных задач проекта.

Практические рекомендации

  1. Автоматизируйте повторяющиеся паттерны: Если в проекте много однотипных DTO, моков или конфигураций — внедрите кодогенерацию.
  2. Интегрируйте в CI/CD: Генерация кода должна быть частью процесса сборки.
  3. Сохраняйте читаемость исходного кода: Аннотации для генерации должны быть минимальными и не мешать пониманию кода.
  4. Комбинируйте подходы: Используйте Swift Macros для простых преобразований и Sourcery для сложных сценариев.
  5. Версионируйте шаблоны: Шаблоны генерации — часть кодовой базы, их нужно версионировать и тестировать.

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