Какие знаешь шаблоны кодогенерации?
Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Шаблоны кодогенерации в 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) для специфичных задач проекта.
Практические рекомендации
- Автоматизируйте повторяющиеся паттерны: Если в проекте много однотипных DTO, моков или конфигураций — внедрите кодогенерацию.
- Интегрируйте в CI/CD: Генерация кода должна быть частью процесса сборки.
- Сохраняйте читаемость исходного кода: Аннотации для генерации должны быть минимальными и не мешать пониманию кода.
- Комбинируйте подходы: Используйте Swift Macros для простых преобразований и Sourcery для сложных сценариев.
- Версионируйте шаблоны: Шаблоны генерации — часть кодовой базы, их нужно версионировать и тестировать.
Кодогенерация существенно сокращает время разработки, уменьшает количество человеческих ошибок и обеспечивает консистентность кода, особенно в больших проектах с множеством разработчиков.