September 13, 2024

84. Упрощаем работу с техдолгом

В процессе работы проект может начать накапливать "костыли", что усложняет поддержку и развитие проекта, раздувая техдолг. Покажу один из вариантов как можно упростить работу с техдолгом в iOS-разработке.

debugLog

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

Для примера напишем функцию debugLog, которая выводит в консоль название вызывающей функции, файл и строку, где находится вызывающий эту функцию код - она будет помогать идентифицировать "костыли".

Этап 1: делаем простой принт

Начнем с простой реализации функции debugLog, которая выводит сообщение без входных параметров:

func debugLog() {
    print("Костыль: этот код нужно доработать.")
}

При вызове этой функции разработчик получает общее сообщение, что вызвана функция с "костылем". Пользы от такого сообщения мало, но это уже больше, чем ничего.

Этап 2: добавим название функции

Теперь добавим параметр для передачи названия вызывающей функции:

func debugLog(functionName: String) {
    print("Костыль: доработать функцию \(functionName)")
}

Теперь, когда мы вызываем debugLog из других функций, мы можем видеть, какая именно функция была вызвана:

func addNumbers(_ a: Int, _ b: Int) -> Int {
    debugLog(functionName: #function)
    return a + b
}

В консоли выводится такое сообщение:

Костыль: доработать функцию addNumbers(_:_:)

Этап 3: добавим инфу о файле и строке

func debugLog(
  functionName: String,
  file: String = #file,
  line: Int = #line
) {
  print("Костыль: доработать функцию \(functionName), файл: \(file), строка №: \(line)")
}

После вызова нашей функции addNumbers из прошлого примера в консоли будет сообщение:

Костыль: доработать функцию addNumbers(_:_:), файл: DebugHelp.xcplaygroundpage, строка №: 12

Этап 4: меняем принт на OSLog

Про работу с OSLog я рассказывал в этой статье, поэтому сейчас можно сразу перейти к результату:

import OSLog

private let logger = Logger(subsystem: Bundle.main.bundleIdentifier ?? "MyAppID", category: "DebugLog")

/// Функция для вывода отладочных сообщений
func debugLog(
 functionName: String,
 file: String = #file,
 line: Int = #line
) {
  logger.debug("Костыль: доработать функцию \(functionName), файл: \(file), строка №: \(line)")
}

На момент публикации статьи OSLog не работает в Playground, но в любом обычном проекте Xcode он работает исправно.

Заключение

Логирование может ощутимо упростить управление техдолгом и улучшить качество кода. Это позволяет нам эффективнее выполнять рефакторинг и поддерживать проект в долгосрочной перспективе.

А еще можно добавить assertionFailure в места, которые вообще не реализованы (но костыли нуждаются в этом коде), и шансы обнаружить техдолг при тестировании могут вырасти еще сильнее 👍

Код для этой статьи можно посмотреть тут, другие статьи по разработке - тут, а про инвестиции - тут.