Home

Awesome

FunCorpSteamApp

Приложение разработано для выполнения задания от FunCorp. Приложение позволяет просматривать, и накапливать информацию о своем аккаунте в стим, и аккаунте друзей.

В задании требовалось сделать детализацию для одной из игр - в качестве этой игры выбрана Dota2. Экран статистики (4 пункт) также сделан только для Dota2, но общая статистика накапливается и хранится история, и в будущем никто не мешает добавить визуализацию, для общей статистики - данные уже собираются.

Экран статистики (4 пункт) сделан на скорую руку - у него нет постраничной подгрузки. Что приводит к тому, что первый раз он будет грузиться очень долго - пока не загрузит детализацию по всем играм (максиум 500). Но пока она грузится можно погулять по другим экранам :) При последующих заходах будут грузиться только новые игры. Также он слегка подлагивает при скролле вверх вниз - было понятно изначально, но констрейны экономят много времени при разработке.

Для ios13 поддержана белая и темная тема. При этом поддержка кастомной цветой/шрифтовой схемы не составляет труда.

Экран поворачивается... не знаю зачем, но работает :) в прочем графики возможно так смотреть удобней.

Проверялось на:

Архитектура

Архитектура построена на основании опыта разворачивания модульных приложений, с учетом современных тенденций. Разворачивал архитектуру не с нуля - существует мой проект, в котором выстроена таже архитектура, но почти была не протестировано. Поэтому время на поддержку некоторых архитектурных вещей всеравно пришлось потратить. Архитектура построена с использованием SwiftPM, по этой причине при запуске проекта, будут закачены все внешние зависимости, что может потребовать некоторого времени - xCode это делает автоматически, и не нужно для этого вызывать аля pod install

По слоям

Архитектура имеет деление на слои, где каждый слой подчиняется следующим правилам:

0 слой - App 1 слой - Infrastructure/Network 1 слой - Infrastructure/Storage 1 слой - Infrastructure/UseCasesImpl 1 слой - UIS/Modules 1.5 слой - можно объединить в одно название UICore состоит из: UIS/AppUIComponents, UIS/UIComponents, UIS/Design 2 слой - Domain/UseCases, Domain/UseCasesContracts, Domain/Entities. 3 слой - Core

По модулям

UI модули

Общее для каждого модуля

Все модули имеют StartPoint - точка запуска. В этой точке обязательно есть правила для внедрения зависимостей, и возможность какой либо конфигурации каждого модуля. Для UI модулей, также есть StartPoint, но она более сложная, и в нее дополнительно входят правила для переходов (в том числе потенциально возможно поддержка deeplinks, без танцев с бубнами), и инициализация начального роутера, для возможности дальнейшей навигации внутри модуля.

Архитектура внутри UI модуля

Внутри UI модуля, используются следующие общие имена: Router - класс отвечающий за навигирование между экранами. Этот класс знает обо всех экранах внутри модуля, но экраны о нем ничего не знают. Screen - простой Generic класс, позволяющий убрать явную зависимость view на presenter, оставив только ссылку из presenter на view. ScreenView - правила визуальной работы с экраном. Является наследником UIViewController. Внутри обычно содержит ссылку на какую-то конкретную view. ScreenPresenter - отвечает за преобразование данных от сервисов, к ViewModel-ям (ничего общего с MVVM не имеют), и реализует логику реагирования на нажатия.

Вся бизнес логика уходит уже в UseCases. Для взаимосвязи между классами используется базовый механизм: Notifier. По факту это closure/observer с небольшими наворотами.

Зависимости

Realm и RealmCore

Используется для хранения данных. Выбрал эту так как с ней проще всего работать, и она по заданию разрешена

DITranquillity

Библиотека для внедрения зависимостей. Я её автор, и я жить без нее не могу (на самом деле могу). Но без внедрения зависимостей сложнее придерживаться принципа DIP, особенно в модульном приложении.

SwitLazy

Нужна для DITranquillity. Позволяет легко отложить моменты создания того или иного экземпляра класса

Steam API

Детально его можно легко посмотреть в модуле Network:

Планы