Clean Code на Swift: принципы и примеры для начинающих
Каждый разработчик iOS или macOS рано или поздно сталкивается с проблемой: код, который отлично работал вчера, сегодня становится нечитаемым. Это не вина языка Swift — это результат пренебрежения принципами Clean Code. Чистый код — это не просто эстетика. Это основа поддерживаемости проекта, снижения времени на отладку и комфортной работы в команде. В этой статье мы разберем ключевые принципы Clean Code на примерах Swift, которые помогут вам писать код, понятный не только компьютеру, но и людям.
1. Именование: переменные, константы и функции
Первый и самый важный принцип — имя должно отвечать на вопрос «Зачем?», а не «Как?». В Swift, благодаря строгой типизации, вы можете опустить тип в названии, но не намерение.
Плохой пример:
var d: Double = 3.14
var arr = [String]()
func calc(a: Double, b: Double) -> Double {
return a * b
}
Хороший пример (Clean Code):
let piValue: Double = 3.14159
var userNames: [String] = []
func calculateRectangleArea(width: Double, height: Double) -> Double {
return width * height
}
Правила именования в Swift:
- Используйте camelCase для переменных и функций.
- Избегайте сокращений (
btn→submitButton). - Для булевых переменных используйте префиксы
is,has,should(например,isUserLoggedIn). - Имена функций должны начинаться с глагола:
fetchData(),saveToCache().
2. Функции: одна задача — одна функция
Принцип единственной ответственности (Single Responsibility) применим не только к классам, но и к функциям. Если функция делает больше одного дела — её нужно разбить.
Плохой пример: функция делает всё сразу
func processUserData(user: User) {
// Валидация
guard user.email.contains("@") else { return }
// Сохранение в базу
Database.shared.save(user)
// Отправка уведомления
NotificationCenter.default.post(name: .userDidRegister, object: nil)
// Обновление UI
DispatchQueue.main.async {
self.label.text = "Добро пожаловать, \(user.name)"
}
}
Хороший пример: разделение на маленькие функции
func registerUser(_ user: User) {
guard validateUser(user) else { return }
saveUserToDatabase(user)
postRegistrationNotification()
updateUI(for: user)
}
private func validateUser(_ user: User) -> Bool {
return user.email.contains("@") && !user.name.isEmpty
}
private func saveUserToDatabase(_ user: User) {
Database.shared.save(user)
}
private func postRegistrationNotification() {
NotificationCenter.default.post(name: .userDidRegister, object: nil)
}
private func updateUI(for user: User) {
DispatchQueue.main.async {
self.welcomeLabel.text = "Добро пожаловать, \(user.name)"
}
}
Совет: Если вы не можете придумать короткое имя для функции, скорее всего, она делает слишком много.
3. Комментарии: меньше — лучше, но метко
В Clean Code комментарии — это признак неудачного кода. Хороший код должен документировать себя сам. Однако есть исключения: сложная бизнес-логика, работа с легаси или публичные API.
Избыточный комментарий (плохо):
// Увеличиваем счетчик на 1
counter += 1
Полезный комментарий (хорошо):
// Используем Decimal для избежания ошибок округления при работе с валютой
let price = Decimal(string: "19.99") ?? .zero
Правила работы с комментариями:
- Не пишите очевидное — код читается сам.
- Используйте
// MARK: -для структурирования больших файлов. - Документируйте публичные методы с помощью
///(Xcode автоматически формирует Quick Help).
/// Вычисляет итоговую стоимость с учетом налога и скидки.
/// - Parameters:
/// - basePrice: Базовая цена товара.
/// - taxRate: Ставка налога (например, 0.2 для 20%).
/// - discount: Скидка в процентах (0.0 - 1.0).
/// - Returns: Итоговая стоимость.
func calculateFinalPrice(basePrice: Double, taxRate: Double, discount: Double) -> Double {
let priceWithTax = basePrice * (1 + taxRate)
return priceWithTax * (1 - discount)
}
4. Форматирование и структура кода
Swift — язык с четкими правилами форматирования, но это не отменяет необходимость думать о структуре. Чистый код всегда выглядит аккуратно.
Основные правила:
- Отступы: используйте 4 пробела (стандарт Xcode).
- Пустые строки: разделяйте логические блоки кода одной пустой строкой.
- Длина строки: старайтесь не превышать 120 символов (можно настроить в Xcode).
- Порядок объявлений: свойства → инициализаторы → методы (сначала public, потом private).
Пример структуры класса:
final class UserViewModel {
// MARK: - Properties
private let userService: UserServiceProtocol
private var currentUser: User?
// MARK: - Initialization
init(userService: UserServiceProtocol) {
self.userService = userService
}
// MARK: - Public Methods
func loadUser(by id: String) {
userService.fetchUser(id: id) { [weak self] result in
switch result {
case .success(let user):
self?.currentUser = user
case .failure(let error):
print("Ошибка загрузки: \(error.localizedDescription)")
}
}
}
// MARK: - Private Methods
private func validateUserData() -> Bool {
guard let user = currentUser else { return false }
return !user.email.isEmpty
}
}
Заключение
Clean Code на Swift — это не свод догм, а набор практик, которые делают вашу жизнь проще. Начните с малого: переименуйте одну переменную в день, разбейте одну большую функцию на несколько маленьких. Со временем писать чистый код станет привыч