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 в места, которые вообще не реализованы (но костыли нуждаются в этом коде), и шансы обнаружить техдолг при тестировании могут вырасти еще сильнее 👍
Код для этой статьи можно посмотреть тут, другие статьи по разработке - тут, а про инвестиции - тут.