Clean Code на Swift: принципы и примеры для начинающих

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

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 — это не свод догм, а набор практик, которые делают вашу жизнь проще. Начните с малого: переименуйте одну переменную в день, разбейте одну большую функцию на несколько маленьких. Со временем писать чистый код станет привыч

Блоги

Рекомендаций по книгам