Складнощі логіки повторних спроб і резервних механізмів у розробці застосунків

Рано чи пізно кожен розробник стикається з тими самими завданнями: повторити дію після невдачі й передбачити резервний варіант, якщо всі спроби виявляться невдалими. Особливо часто це трапляється з мережевими запитами, фоновими завданнями та взаємодіями з користувачем. Наприклад:
- Що робити, якщо мережевий запит не вдався через тимчасовий збій? Застосунок має аварійно завершитися чи автоматично повторити запит?
- Якщо всі повторні спроби виявилися невдалими, як не залишити користувача без виходу? Чи варто виконати резервну дію, щоб повідомити його або записати помилку до журналу?
Це не лише гіпотетичні ситуації, а й реальні проблеми, з якими рано чи пізно стикається кожен розробник. Коли вирішувати їх вручну, код часто виходить повторюваним, схильним до помилок і складним у підтримці. Наприклад, для реалізації повторних спроб можуть знадобитися вкладені цикли, таймери або складне керування станом. Резервні дії так само потребують додаткових перевірок та альтернативних сценаріїв, які швидко захаращують кодову базу.
Як розв’язати ці проблеми елегантно? Один із дієвих підходів – композиція: розбиття складних сценаріїв на менші компоненти, які можна використовувати повторно. Компонуючи дії, повторні спроби та резервні варіанти, можна побудувати зрозумілу модульну систему, яку легко тестувати й підтримувати.
Тут і стає в пригоді DMAction – бібліотека, яку я нещодавно опублікував. DMAction дає Swift-застосункам надійну основу для повторних спроб і резервних дій. Вона виносить складнощі керування діями в компоненти на основі протоколів, які можна використовувати повторно, щоб розробники могли зосередитися на функціях, а не на шаблонному коді.
Знайомство з DMAction: елегантність композиції
За своєю суттю DMAction (далі – просто this SDK) – це легкий, але потужний SDK, який спрощує роботу з діями у Swift-застосунках. Незалежно від того, працюєте ви з UIKit чи SwiftUI, цей SDK надає зрозумілий та зручний API для керування повторними спробами, резервними діями й асинхронними операціями, спираючись на принципи композиції.
Ось як цей SDK розв’язує дві ключові проблеми, про які йшлося вище:
1. Механізм повторних спроб
Уявімо, що ви завантажуєте дані із сервера. Якщо запит не вдався через тимчасову проблему з мережею, не хочеться залишати користувача чекати безрезультатно. За допомогою цього SDK можна налаштувати механізм, який автоматично повторюватиме запит у межах заданої кількості спроб, а якщо спроби не допоможуть – коректно завершиться з помилкою.
let action = DMButtonAction {
print("Performing task...")
}
let retriedAction = action.retry(3)
retriedAction { result in
switch result.unwrapValue() {
case .success(let value):
print("Success: \(value)")
case .failure(let error):
print("Failed after retries: \(error)")
}
}Цей фрагмент показує, як SDK бере повторні спроби на себе й заощаджує ваш час та зусилля. Замість вкладених циклів або ручного керування станом ви просто задаєте кількість повторних спроб, а решту робить SDK.
2. Підтримка резервних дій
Що робити, якщо дія остаточно не вдалася навіть після повторних спроб? Цей SDK дає змогу визначити резервні дії, щоб застосунок залишався надійним. Наприклад, якщо не вдалося надіслати форму, резервна дія може повідомити користувача або записати помилку до журналу.
let primaryAction = DMButtonAction {
print("Primary action performed")
}
let fallbackAction = DMButtonAction {
print("Fallback action performed")
}
let actionWithFallback = primaryAction.fallbackTo(fallbackAction)
actionWithFallback.action { result in
// Handle result
}Це гарантує, що користувач ніколи не залишиться без виходу, навіть коли виникне помилка. Поєднання повторних спроб і резервних дій дає змогу побудувати стійку систему, яка коректно обробляє збої.
Як працює DMAction?
Цей SDK побудовано на архітектурі, орієнтованій на протоколи, тому його можна гнучко інтегрувати в будь-який проєкт. Ось його основні складові:
- Протокол DMAction:
- Визначає структуру дій.
- Містить властивості, зокрема currentAttempt, id та action.
- Надає допоміжні методи, зокрема fallbackTo та retry.
- Механізм повторних спроб:
- Автоматично повторює невдалі дії до заданої кількості спроб.
- Забезпечує стійкість мережевих запитів, фонових завдань та інших операцій.
- Поведінка резервної дії:
- Виконує іншу дію, якщо основна не вдалася.
- Забезпечує коректне обмеження функціональності у разі збою.
- Спрощене виконання:
- Використовуйте simpleAction, щоб виконувати дії без потреби обробляти результат.
Візуалізація процесу та структури
Структура протоколу DMAction і пов’язаних із ним компонентів:
Як працює механізм повторних спроб:
Як працюють резервні дії:
Чому варто обрати DMAction?
- Прості повторні спроби: автоматично повторюйте невдалі дії в межах заданої кількості спроб без повторюваного коду.
- Резервні дії на випадок збоїв: визначайте їх, щоб застосунок залишався працездатним, навіть коли щось іде не так.
- Дизайн на основі протоколів: DMAction побудовано навколо однойменного протоколу, тому бібліотеку легко розширювати, а її компоненти – поєднувати.
- Сумісність із різними фреймворками: працює і з UIKit, і зі SwiftUI, даючи свободу вибору на різних платформах.
- Відкритий код і участь спільноти: SDK має відкритий код, активно підтримується й відкритий до внесків таких розробників, як ви.
Почніть користуватися вже сьогодні
Хочете спростити роботу з діями? У репозиторії GitHub є інструкції зі встановлення, документація та приклади.
Установити цей SDK просто: додайте його до проєкту через Swift Package Manager або CocoaPods.
На завершення
DMAction – це більше ніж бібліотека: вона допомагає писати чистіший код, який легше підтримувати. Виносячи типові сценарії роботи з діями в окремі компоненти, вона дає розробникам змогу зосередитися на головному – створенні чудових застосунків.
Спробуйте DMAction і розкажіть, що думаєте! Ваші відгуки допоможуть визначити подальший розвиток цього SDK.
Успіхів у програмуванні! 🚀
Щиро дякую @mapostolakis та @caiozullo за підхід до розв’язання таких завдань.