Skip to content

Latest commit

 

History

History
386 lines (312 loc) · 31.6 KB

documentation.md

File metadata and controls

386 lines (312 loc) · 31.6 KB

Документация к проекту


🛠️ Установка и запуск

  1. Клонируйте репозиторий:
git clone https://github.com/LebedevSergeyVach/EltexSocialMedia.git
  1. Откройте проект в Android Studio.

  2. Соберите проект с помощью Gradle.

  3. Запустите приложение на эмуляторе или физическом устройстве.


🌟 Функциональность

1. Работа с постами и событиями

  • Реализован CRUD (Create, Read, Update, Delete) для работы с постами и событиями.
  • Возможность создания, чтения, обновления и удаления постов и событий через удаленный сервер.
  • Использование Retrofit для отправки запросов на сервер и получения данных в формате JSON.
  • Поддержка Coroutines для асинхронных операций, что упрощает код и повышает производительность.

2. Локальное хранение данных

  • Использование Jetpack Preferences DataStore для хранения настроек приложения и других локальных данных. DataStore предоставляет более современный и безопасный способ хранения данных по сравнению с SharedPreferences.
  • Работа с локальной базой данных SQLite через ORM Room. Room упрощает работу с базой данных, предоставляя абстракцию над SQLite.
  • Поддержка ksp (Kotlin Symbol Processing) для генерации кода на этапе компиляции, что ускоряет работу с Room.
  • Использование Prepopulate your Room database для удобства тестирования. Это позволяет заполнить базу данных начальными данными перед запуском приложения.

3. Сетевое взаимодействие

  • Работа с удаленным сервером через Retrofit2 и OkHttp3. Retrofit используется для создания HTTP-запросов, а OkHttp — для обработки сетевых запросов и ответов.
  • Обработка данных в формате JSON с использованием Kotlin Serialization.
  • Поддержка асинхронных операций через Coroutines. Coroutines предоставляют более простой и читаемый способ работы с асинхронным кодом.

4. Архитектура и паттерны

  • Проект построен на архитектуре MVI (Model-View-Intent), которая обеспечивает четкое разделение ответственности между компонентами приложения. Основные элементы MVI:

    • Model: Представляет собой состояние приложения. В нашем случае это данные о постах, событиях и текущем статусе загрузки.
    • View: Отвечает за отображение данных пользователю. В проекте это фрагменты и активити, которые отображают список постов и другие элементы интерфейса.
    • Intent: Представляет собой намерения пользователя, такие как загрузка постов, лайки, удаление и т.д. Эти намерения передаются в ViewModel, где обрабатываются и преобразуются в изменения состояния.
  • Проект построен на архитектуре MVVM (Model-View-ViewModel). MVVM разделяет логику приложения на три компонента: Model (данные), View (интерфейс) и ViewModel (логика представления).

    • Model: Отвечает за данные и бизнес-логику приложения. Включает в себя работу с локальной базой данных (Room), сетевыми запросами (Retrofit) и другими источниками данных.
    • View: Отвечает за отображение данных пользователю. Это фрагменты и активити, которые взаимодействуют с пользователем и отображают UI.
    • ViewModel: Связывает Model и View. ViewModel получает данные от Model и преобразует их в формат, который может быть отображен в View. Также ViewModel обрабатывает пользовательские действия и передает их в Model.
  • Использование следующих архитектурных паттернов и парадигм:

    • Строитель (Builder): Паттерн для создания сложных объектов.
    • Наблюдаемый (Observable): Паттерн для уведомления объектов об изменениях в данных.
    • Наблюдатель (Observer): Паттерн для подписки на изменения данных.
    • Адаптер (Adapter): Паттерн для преобразования интерфейса одного класса в интерфейс, ожидаемый клиентом.
    • Внедрение зависимостей (Dependency Injection): Паттерн для управления зависимостями между компонентами.
    • Архитектура с одной активностью (Single Activity Architecture): Подход, при котором все экраны приложения управляются одной Activity, что упрощает навигацию и управление состоянием.
    • Модульная архитектура (Modular Architecture): Разделение приложения на независимые модули для упрощения разработки и тестирования.
    • Реактивное программирование (Reactive Programming): Подход к программированию, основанный на асинхронных потоках данных.

5. Настройки внешнего вида

  • Возможность выбора языка интерфейса: Русский, Английский или системный язык.
  • Выбор темы приложения: темная, светлая или системная тема.
  • Включение и отключение виброотклика в приложении.

6. Тестирование и отладка

  • Использование Prepopulate your Room database для удобного тестирования локальной базы данных.
  • Поддержка модульной архитектуры для упрощения тестирования отдельных компонентов.
  • Использование JUnit для модульного тестирования и Espresso для UI-тестирования.

7. Отображение скелетонов

  • Использование библиотеки SkeletonLayout для отображения анимированных заглушек (скелетонов) во время загрузки данных.
  • Скелетоны помогают улучшить пользовательский опыт, показывая, что данные загружаются, и предотвращая "мерцание" интерфейса.
  • Библиотека поддерживает настройку цвета анимации, фона и других параметров для создания адаптивных скелетонов.

🏗️ Архитектуры в проекте: MVVM и MVI

В проекте используются две архитектуры: MVVM (Model-View-ViewModel) и MVI (Model-View-Intent). Обе архитектуры помогают организовать код, разделяя ответственность между компонентами приложения, но они имеют свои особенности и применяются в разных частях проекта.


Архитектура MVVM (Model-View-ViewModel)

В проекте также используется архитектура MVVM (Model-View-ViewModel), которая обеспечивает четкое разделение ответственности между компонентами приложения. Основные элементы MVVM:

  • Model: Отвечает за данные и бизнес-логику приложения. Включает в себя работу с локальной базой данных (Room), сетевыми запросами (Retrofit) и другими источниками данных.
  • View: Отвечает за отображение данных пользователю. Это фрагменты и активити, которые взаимодействуют с пользователем и отображают UI.
  • ViewModel: Связывает Model и View. ViewModel получает данные от Model и преобразует их в формат, который может быть отображен в View. Также ViewModel обрабатывает пользовательские действия и передает их в Model.

Основные компоненты MVVM в проекте:

  1. PostRepository: Репозиторий, который управляет данными о постах. Он взаимодействует с локальной базой данных (Room) и сетевым API (Retrofit) для получения и обновления данных.
  2. PostViewModel: ViewModel, которая связывает View с репозиторием. Она получает данные от репозитория и предоставляет их View через LiveData или StateFlow.
  3. View: Фрагменты и активити, которые отображают данные пользователю и обрабатывают пользовательские действия, такие как лайки, удаление и обновление постов.

Работа с сервером:

  • Загрузка постов: Посты загружаются с сервера порциями (пагинация). ViewModel запрашивает данные у репозитория, который, в свою очередь, взаимодействует с Retrofit для выполнения сетевых запросов.
  • Лайки и удаление: Пользователь может лайкать посты и удалять их. Эти действия передаются в ViewModel, которая обновляет данные через репозиторий и уведомляет View об изменениях.
  • Обработка ошибок: В случае ошибок при загрузке данных или выполнении действий, ViewModel уведомляет View, и пользователю показываются соответствующие уведомления.

Используемые технологии:

  • Retrofit2: Для выполнения сетевых запросов к серверу.
  • Coroutines: Для асинхронной обработки запросов и обновления состояния.
  • Jetpack DataStore: Для хранения локальных настроек, таких как выбор темы и языка.
  • Room: Для работы с локальной базой данных SQLite.

Преимущества MVVM:

  • Разделение ответственности: Каждый компонент выполняет свою задачу, что упрощает поддержку и тестирование кода.
  • Жизненный цикл ViewModel: ViewModel сохраняет данные при изменении конфигурации (например, при повороте экрана), что улучшает пользовательский опыт.
  • Поддержка DataBinding: MVVM хорошо интегрируется с DataBinding, что позволяет автоматически обновлять UI при изменении данных.

Архитектура MVI (Model-View-Intent)

Проект также построен на архитектуре MVI (Model-View-Intent), которая обеспечивает четкое разделение ответственности между компонентами приложения. Основные элементы MVI:

  • Model: Представляет собой состояние приложения. В нашем случае это данные о постах, событиях и текущем статусе загрузки.
  • View: Отвечает за отображение данных пользователю. В проекте это фрагменты и активити, которые отображают список постов и другие элементы интерфейса.
  • Intent: Представляет собой намерения пользователя, такие как загрузка постов, лайки, удаление и т.д. Эти намерения передаются в ViewModel, где обрабатываются и преобразуются в изменения состояния.

Основные компоненты MVI в проекте:

  1. PostStore: Хранилище, которое управляет состоянием постов и эффектами. Оно обрабатывает сообщения (Intents) и обновляет состояние (Model).
  2. PostEffectHandler: Обработчик эффектов, который выполняет побочные эффекты, такие как загрузка данных с сервера, лайки и удаление постов.
  3. PostReducer: Редьюсер, который обрабатывает сообщения и обновляет состояние приложения. Он определяет, как состояние изменяется в ответ на действия пользователя.
  4. PostViewModel: ViewModel, которая связывает View с хранилищем (Store). Она принимает сообщения от пользователя и передает их в хранилище для обработки.

Работа с сервером:

  • Загрузка постов: Посты загружаются с сервера порциями (пагинация). Когда пользователь приближается к концу списка, автоматически загружается следующая порция данных.
  • Лайки и удаление: Пользователь может лайкать посты и удалять их. Эти действия отправляются на сервер, и состояние приложения обновляется в реальном времени.
  • Обработка ошибок: В случае ошибок при загрузке данных или выполнении действий, пользователю показываются соответствующие уведомления, а состояние приложения корректно обновляется.

Используемые технологии:

  • Retrofit2: Для выполнения сетевых запросов к серверу.
  • Coroutines: Для асинхронной обработки запросов и обновления состояния.
  • Jetpack DataStore: Для хранения локальных настроек, таких как выбор темы и языка.
  • Room: Для работы с локальной базой данных SQLite.

Преимущества MVI:

  • Предсказуемость: Состояние приложения всегда ясно и предсказуемо, так как все изменения происходят через редьюсер.
  • Тестируемость: Компоненты MVI легко тестируются, так как они изолированы и имеют четкие обязанности.
  • Масштабируемость: Архитектура MVI позволяет легко добавлять новые функции и изменять существующие без нарушения работы приложения.

Сравнение MVVM и MVI

Характеристика MVVM MVI
Состояние Состояние может быть распределено между ViewModel и View. Состояние централизовано и неизменно.
Поток данных Двусторонний: View может обновлять ViewModel, и наоборот. Односторонний: View отправляет Intents, а ViewModel обновляет состояние.
Тестируемость Легко тестировать ViewModel, но сложнее тестировать взаимодействие с View. Легко тестировать все компоненты, так как они изолированы.
Сложность Проще в реализации для небольших проектов. Более сложная архитектура, но лучше подходит для больших проектов.
Поддержка Широко используется в Android-разработке. Менее распространен, но набирает популярность.

Когда использовать MVVM и MVI?

  • MVVM лучше подходит для небольших проектов или экранов с простой логикой. Она проще в реализации и поддерживается большинством Android-разработчиков.
  • MVI лучше подходит для сложных проектов, где важно управление состоянием и предсказуемость. MVI помогает избежать багов, связанных с изменением состояния, и упрощает тестирование.

📦 Зависимости проекта

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

1. Основные зависимости

  • AndroidX Core KTX: Утилиты для работы с Kotlin в Android.

        implementation(libs.androidx.core.ktx)

    Документация

  • AndroidX AppCompat: Поддержка обратной совместимости для новых функций Android.

        implementation(libs.androidx.appcompat)

    Документация

  • Material Design: Компоненты Material Design для создания современного интерфейса.

        implementation(libs.material)

    Документация

  • AndroidX Activity: Упрощение работы с Activity в Android.

        implementation(libs.androidx.activity)

    Документация

  • AndroidX ConstraintLayout: Гибкий и мощный макет для создания сложных интерфейсов.

        implementation(libs.androidx.constraintlayout)

    Документация

2. Локальное хранение данных

  • Room: ORM для работы с SQLite.

        implementation(libs.androidx.room.runtime)
        implementation(libs.androidx.room.ktx)
        ksp(libs.androidx.room.compiler)

    Документация

  • DataStore: Хранение ключевых данных и настроек.

        implementation(libs.androidx.datastore.preferences)
        implementation(libs.androidx.datastore)
        implementation(libs.androidx.datastore.core)

    Документация

3. Сетевое взаимодействие

  • Retrofit: HTTP-клиент для работы с REST API.

        implementation(libs.retrofit)
        implementation(libs.retrofit2.kotlinx.serialization.converter)

    Документация

  • OkHttp: Клиент для работы с HTTP-запросами.

        implementation(platform(libs.okhttp.bom))
        implementation(libs.okhttp)
        implementation(libs.logging.interceptor)

    Документация

4. Асинхронные операции

  • Coroutines: Упрощение работы с асинхронными операциями.
        testImplementation(libs.kotlinx.coroutines.test)
    Документация

5. UI и анимации

  • ViewParticleEmitter: Анимации для создания эффектов.

        implementation(libs.confetti)

    Документация

  • SplashScreen: Поддержка экрана загрузки.

        implementation(libs.androidx.core.splashscreen)

    Документация

  • SwipeRefreshLayout: Поддержка "pull-to-refresh" для обновления данных.

        implementation(libs.androidx.swiperefreshlayout)

    Документация

  • SkeletonLayout: Библиотека для отображения скелетонов (заглушек) во время загрузки данных.

        implementation(libs.skeletonlayout)

    Документация

  • Glide: Быстрая и эффективная платформа для управления мультимедиа и загрузки изображений с открытым исходным кодом для Android.

        implementation(libs.glide)

    Документация

6. Тестирование

  • JUnit: Фреймворк для модульного тестирования.

        testImplementation(libs.junit)

    Документация

  • AndroidX Test: Инструменты для тестирования Android-приложений.

        androidTestImplementation(libs.androidx.junit)
        androidTestImplementation(libs.androidx.espresso.core)

    Документация

7. Прочие зависимости

  • Protobuf: Сериализация данных для хранения и передачи.

        implementation(libs.protobuf.javalite)

    Документация

  • Kotlin Serialization: Сериализация данных в формате JSON.

        implementation(libs.kotlinx.serialization.json)

    Документация

  • Desugaring: Поддержка Java 8 API на старых версиях Android.

        coreLibraryDesugaring(libs.desugar.jdk.libs)

    Документация

  • Dagger2-Hill: Внедрение зависимостей с помощью Hilt — это библиотека внедрения зависимостей для Android, которая упрощает шаблонное внедрение зависимостей вручную в ваш проект.

        implementation(libs.hilt.android)
        ksp(libs.hilt.android.compiler)

    Документация


🚀 Стек используемых технологий

  • Kotlin: Основной язык программирования.
  • Retrofit: HTTP-клиент для работы с REST API.
  • Room: ORM для работы с SQLite.
  • DataStore: Хранение ключевых данных и настроек.
  • Coroutines: Упрощение работы с асинхронными операциями.
  • Material Design: Компоненты для создания современного интерфейса.
  • SkeletonLayout: Библиотека для отображения скелетонов во время загрузки данных.
  • Glide: Библиотека для управления мультимедиа и загрузки изображений с открытым исходным кодом для Android.

🚀 Стек используемых технологий (не отображается на GitHub)

kotlin logo

Kotlin

retrofit logo

Retrofit

rxjava logo

RxJava

SkeletonLayout logo

SkeletonLayout

gradle logo

Gradle

androidx jetpack logo

AndroidX Jetpack

android logo

Android

Glide logo

Android


📄 Лицензия

Проект распространяется под лицензией AGPL v3. Подробнее см. LICENSE.