Что такое рефакторинг кода и когда вы его применяли?

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

Ответ

Рефакторинг — это процесс улучшения внутренней структуры кода без изменения его внешнего поведения. Основные цели: повышение читаемости, упрощение поддержки, устранение дублирования и улучшение архитектуры.

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

  1. Выделение повторяющегося кода в отдельные методы, классы или утилиты.
  2. Упрощение сложных методов (разделение на части, замена условных конструкций полиморфизмом).
  3. Улучшение именования переменных, функций и классов для ясности.
  4. Замена небезопасных паттернов (например, force unwrap в Swift на guard let или if let).
  5. Внедрение протоколов/интерфейсов для уменьшения связанности.

Пример рефакторинга сетевого запроса в Swift:

До (проблемы: force unwrap, отсутствие обработки ошибок):

func fetchData() {
    if let url = URL(string: "https://api.example.com/data") {
        URLSession.shared.dataTask(with: url) { data, _, _ in
            if let data = data {
                print(String(data: data, encoding: .utf8)!)
            }
        }.resume()
    }
}

После (использование Result, безопасные unwrap, обработка ошибок):

func fetchData(completion: @escaping (Result<String, Error>) -> Void) {
    guard let url = URL(string: "https://api.example.com/data") else {
        completion(.failure(URLError(.badURL)))
        return
    }

    URLSession.shared.dataTask(with: url) { data, _, error in
        if let error = error {
            completion(.failure(error))
            return
        }
        guard let data = data,
              let string = String(data: data, encoding: .utf8) else {
            completion(.failure(URLError(.cannotDecodeContentData)))
            return
        }
        completion(.success(string))
    }.resume()
}

Для поддержания качества кода также полезно использовать статические анализаторы (например, SwiftLint).