docs(readme): обновить структуру и содержание README.md, улучшить оформление (#27)

Co-authored-by: petrovyuri <petrovyuri@example.com>
This commit is contained in:
Yuri Petrov
2025-09-17 12:46:45 +03:00
committed by GitHub
parent 03e189e46b
commit c295412f4d
9 changed files with 223 additions and 171 deletions

View File

@@ -1,3 +1,5 @@
<!-- markdownlint-disable MD033 -->
<!-- markdownlint-disable MD041 -->
## Ссылка на задачу или issue (обязательно) ## Ссылка на задачу или issue (обязательно)
<!--- https://tracker.yandex.ru/XXX --> <!--- https://tracker.yandex.ru/XXX -->
@@ -5,6 +7,7 @@
<!--- Напишите здесь какую проблему решают изменения в этом запросе. --> <!--- Напишите здесь какую проблему решают изменения в этом запросе. -->
## Чек лист (обязательно) ## Чек лист (обязательно)
- [ ] Код соответствует рекомендациям и требованиям проекта. - [ ] Код соответствует рекомендациям и требованиям проекта.
- [ ] Проверил анализатор на предмет ошибок и предупреждений. - [ ] Проверил анализатор на предмет ошибок и предупреждений.
- [ ] Название ПР соответствует [требованиям проекта](../tools/rfc/RFC-documentation.md). - [ ] Название ПР соответствует [требованиям проекта](../tools/rfc/RFC-documentation.md).
@@ -12,6 +15,7 @@
- [ ] Добавлены необходимые тесты, если требуется. - [ ] Добавлены необходимые тесты, если требуется.
## Скриншоты (желательно) ## Скриншоты (желательно)
<details> <details>
<summary>Показать</summary> <summary>Показать</summary>

View File

@@ -1,21 +1,15 @@
<div align="center">
# 🚀 Friflex Flutter Starter - Корпоративный шаблон # 🚀 Friflex Flutter Starter - Корпоративный шаблон
</div>
<div align="center">
![Flutter](https://img.shields.io/badge/Flutter-3.32.0+-02569B?style=for-the-badge&logo=flutter&logoColor=white) ![Flutter](https://img.shields.io/badge/Flutter-3.32.0+-02569B?style=for-the-badge&logo=flutter&logoColor=white)
![Dart](https://img.shields.io/badge/Dart-3.8.0+-0175C2?style=for-the-badge&logo=dart&logoColor=white) ![Dart](https://img.shields.io/badge/Dart-3.8.0+-0175C2?style=for-the-badge&logo=dart&logoColor=white)
![Version](https://img.shields.io/badge/Version-v0.0.1-green?style=for-the-badge) ![Version](https://img.shields.io/badge/Version-v0.0.1-green?style=for-the-badge)
![License](https://img.shields.io/badge/License-MIT-blue?style=for-the-badge) ![License](https://img.shields.io/badge/License-MIT-blue?style=for-the-badge)
**Корпоративный стартовый шаблон для разработки масштабируемых Flutter-приложений** Корпоративный стартовый шаблон для разработки масштабируемых Flutter-приложений
[📋 Документация](#-документация) • [🏗️ Архитектура](#-архитектура) • [🚀 Быстрый старт](#-быстрый-старт) • [🔧 Конфигурация](#-конфигурация) [📋 Документация](#-документация) • [🏗️ Архитектура](#-архитектура) • [🚀 Быстрый старт](#-быстрый-старт) • [🔧 Конфигурация](#-конфигурация)
</div>
--- ---
## 📖 Описание проекта ## 📖 Описание проекта
@@ -162,33 +156,33 @@ enum AppEnv {
### 🛠️ Установка ### 🛠️ Установка
1. **Клонирование проекта** #### Клонирование проекта
```bash ```bash
git clone https://github.com/smmarty/friflex_starter.git git clone https://github.com/smmarty/friflex_starter.git
cd friflex_starter cd friflex_starter
``` ```
2. **Установка зависимостей** #### Установка зависимостей
```bash ```bash
flutter pub get flutter pub get
``` ```
3. **Генерация файлов** #### Генерация файлов
```bash ```bash
dart run build_runner build --delete-conflicting-outputs dart run build_runner build --delete-conflicting-outputs
flutter packages pub run flutter_gen flutter packages pub run flutter_gen
``` ```
4. **Запуск приложения** #### Запуск приложения
```bash ```bash
flutter run flutter run
``` ```
5. **Замените название пакета на ваш** #### Замените название пакета на ваш
### 🎯 Запуск с разными окружениями ### 🎯 Запуск с разными окружениями
@@ -263,7 +257,7 @@ dart run build_runner build --delete-conflicting-outputs
| 🏗️ [RFC-projects_structure.md](./tools/rfc/RFC-projects_structure.md) | Структура проекта | | 🏗️ [RFC-projects_structure.md](./tools/rfc/RFC-projects_structure.md) | Структура проекта |
| 📝 [RFC-documentation.md](./tools/rfc/RFC-documentation.md) | Правила документирования | | 📝 [RFC-documentation.md](./tools/rfc/RFC-documentation.md) | Правила документирования |
| 🔧 [RFC-managing_generated_files.md](./tools/rfc/RFC-managing_generated_files.md) | Рекомендации по управлению сгенерированными файлами | | 🔧 [RFC-managing_generated_files.md](./tools/rfc/RFC-managing_generated_files.md) | Рекомендации по управлению сгенерированными файлами |
| 🌐 [RFC-managing_pubspec_lock.md](./tools/rfc/RFC-managing_pubspec_lock.md) | Рекомендации по управлению pubspec.lock | 🌐 [RFC-managing_pubspec_lock.md](./tools/rfc/RFC-managing_pubspec_lock.md) | Рекомендации по управлению pubspec.lock |
## 🎯 Особенности и нюансы ## 🎯 Особенности и нюансы
@@ -294,9 +288,4 @@ Copyright © 2025 Friflex LLC. Все права защищены.
--- ---
### Разработано с любовью командой Friflex ❤️
<div align="right">
*Разработано с любовью командой Friflex ❤️*
</div>

View File

@@ -1,11 +1,12 @@
## Рекомендованный Readme для проектов # Приложение [ProjectName]
#### Приложение [ProjectName]
## Структура проекта ## Структура проекта
- проект архитектурно делится на три слоя: data, domain и presentation; - проект архитектурно делится на три слоя: data, domain и presentation;
- все [features] реализуются в отдельных папках, с внутренним делением на слои; - все [features] реализуются в отдельных папках, с внутренним делением на слои;
## Основные пакеты и реализации (обновляется при добавлении или изменении) ## Основные пакеты и реализации (обновляется при добавлении или изменении)
- управление роутингом: [go_router](https://pub.dev/packages/go_router); - управление роутингом: [go_router](https://pub.dev/packages/go_router);
- основной state manager: [flutter_bloc](https://pub.dev/packages/flutter_bloc); - основной state manager: [flutter_bloc](https://pub.dev/packages/flutter_bloc);
- di: ручная реализация через InheritedWidget; - di: ручная реализация через InheritedWidget;
@@ -16,16 +17,21 @@
- для работы с API - [dio](https://pub.dev/packages/dio); - для работы с API - [dio](https://pub.dev/packages/dio);
## Инструкция по запуску проекта ## Инструкция по запуску проекта
- [Инструкция по запуску проекта](./tools/rfc/RFC-build.md) - [Инструкция по запуску проекта](./tools/rfc/RFC-build.md)
## Стиль написания кода ## Стиль написания кода
- [Стиль написания кода](./*ools*/rfc/RFC-codestyle.md) - [Стиль написания кода](./*ools*/rfc/RFC-codestyle.md)
## Внесение изменений в код ## Внесение изменений в код
- [Внесение изменений в код](./tools/rfc/RFC-gitflow.md) - [Внесение изменений в код](./tools/rfc/RFC-gitflow.md)
## Структура проекта ## Документация по структуре проекта
- [Структура проекта](./tools/rfc/RFC-projects_structure.md) - [Структура проекта](./tools/rfc/RFC-projects_structure.md)
## Ведение документации и комментариев в проекте ## Ведение документации и комментариев в проекте
- [Ведение документации и комментариев в проекте](./tools/rfc/RFC-documentation.md) - [Ведение документации и комментариев в проекте](./tools/rfc/RFC-documentation.md)

View File

@@ -8,13 +8,16 @@
## Именование ## Именование
### Интерфейсы ### Интерфейсы
Утверждены два вида объявления интерфейсов: Утверждены два вида объявления интерфейсов:
1. Все интерфейсы в приложении должны начинаться с заглавной буквы "**I**". 1. Все интерфейсы в приложении должны начинаться с заглавной буквы "**I**".
Например: **IAuthRepository**, **IProfileRepository**, **IMainRunner** и т.д. Например: **IAuthRepository**, **IProfileRepository**, **IMainRunner** и т.д.
Таким образом, сразу видно, что работаешь с интерфейсом. Таким образом, сразу видно, что работаешь с интерфейсом.
Пример: Пример:
```dart ```dart
/// Интерфейс - **IUserRepository** /// Интерфейс - **IUserRepository**
abstract interface class IUserRepository {} abstract interface class IUserRepository {}
@@ -29,6 +32,7 @@ class UserRepositoryLocal implements IUserRepository {}
``` ```
### Классы - Репозитории ### Классы - Репозитории
Репозитории должны содержать в конце название источника данных (если используется мок или локальное хранилище).\ Репозитории должны содержать в конце название источника данных (если используется мок или локальное хранилище).\
Основная реализация, не должна содержать постфикса. Основная реализация, не должна содержать постфикса.
@@ -38,18 +42,21 @@ class UserRepositoryLocal implements IUserRepository {}
Локальное хранилище (например бд или просто имитация данных) - **AuthRepositoryLocal** Локальное хранилище (например бд или просто имитация данных) - **AuthRepositoryLocal**
### Файлы ### Файлы
Используется snake_case. Используется snake_case.
Название файла должно иметь следующую структуру: [раздел]_[тип].dart Название файла должно иметь следующую структуру: [раздел]_[тип].dart
Пример: user_details_screen.dart, shop_entity.dart Пример: user_details_screen.dart, shop_entity.dart
### Классы ### Классы
Название классов UpperCamelCase. Название классов UpperCamelCase.
Для создание приватных классов используем префикс _ . Название класса в конце должно содержать в себе тип. Для создание приватных классов используем префикс _ . Название класса в конце должно содержать в себе тип.
Пример: **UserEntity**, **AdultDialog** Пример: **UserEntity**, **AdultDialog**
## Методы ## Методы
Название метода в начале должно содержать в себе действие(глагол): Название метода в начале должно содержать в себе действие(глагол):
- fetch - fetch
@@ -58,44 +65,59 @@ class UserRepositoryLocal implements IUserRepository {}
- delete и так далее - delete и так далее
Пример: Пример:
```dart ```dart
int fetchFirstElement(){} int fetchFirstElement(){}
``` ```
Пример: Пример:
```dart ```dart
void updateFirstElement(){}; void updateFirstElement(){};
``` ```
Название метода не должно содержать в себе And/Or Название метода не должно содержать в себе And/Or
и метод соответственно не должен выполнять подобную логику. и метод соответственно не должен выполнять подобную логику.
## Переменные и константы ## Переменные и константы
Константы именуются также lowerCamelCase. Константы именуются также lowerCamelCase.
Пример: Пример:
```dart ```dart
const String carItem const String carItem
``` ```
или или
```dart ```dart
final userName; final userName;
``` ```
## Виджеты ## Виджеты
Виджеты именуются UpperCamelCase. Виджеты именуются UpperCamelCase.
В названии виджетов не должно содержаться слово widget. В названии виджетов не должно содержаться слово widget.
### Экраны ### Экраны
Экраны, используемые в роутинге, именуются с постфиксом Screen. Экраны, используемые в роутинге, именуются с постфиксом Screen.
Например, **ShopListScreen**. Например, **ShopListScreen**.
### Содержимое экрана ### Содержимое экрана
Виджеты, отображающие содержимое экрана, именуются с постфиксом View. Виджеты, отображающие содержимое экрана, именуются с постфиксом View.
Например, **ShopListView**. Например, **ShopListView**.
### Глобальные виджеты ### Глобальные виджеты
Глобальные виджеты именуются с приставкой App. Глобальные виджеты именуются с приставкой App.
Например, **AppButton**. Например, **AppButton**.
## Структура класса ## Структура класса
Объявления элементов класса должны располагаться в следующем порядке: Объявления элементов класса должны располагаться в следующем порядке:
1. **Constructors** 1. **Constructors**
- constructors - constructors
- named-constructors - named-constructors

View File

@@ -2,7 +2,8 @@
## Документация ## Документация
### Основные правила ведения документации в проекте: ### Основные правила ведения документации в проекте
- документация оформляется над описываемым объектом с использованием '///'; - документация оформляется над описываемым объектом с использованием '///';
- документацией необходимо покрывать все классы, конструкторы, поля, геттеры, сеттеры, методы, фабрики, все кастомные объекты; - документацией необходимо покрывать все классы, конструкторы, поля, геттеры, сеттеры, методы, фабрики, все кастомные объекты;
- документация должна: - документация должна:
@@ -13,14 +14,17 @@
## Шаблоны и примеры документации объектов ## Шаблоны и примеры документации объектов
### Документация классов: ### Документация классов
```dart ```dart
/// {@template new_class} /// {@template new_class}
/// Класс для реализации {описание назначения и реализуемого функционала в классе}. /// Класс для реализации {описание назначения и реализуемого функционала в классе}.
/// {@endtemplate} /// {@endtemplate}
class NewClass {} class NewClass {}
``` ```
Пример: Пример:
```dart ```dart
/// {@template app_button} /// {@template app_button}
/// Класс для реализации кастомизированной кнопки. /// Класс для реализации кастомизированной кнопки.
@@ -28,11 +32,12 @@
class AppButton {} class AppButton {}
``` ```
### Документация конструкторов и фабрик: ### Документация конструкторов и фабрик
Если конструктор один, то достаточно указать {@macro new_class}. Если конструктор один, то достаточно указать {@macro new_class}.
{@macro new_class} дублирует на конструктор указанную в рамках описания класса документацию, поэтому описание класса должно в таком случае включать все передаваемые в конструктор параметры {@macro new_class} дублирует на конструктор указанную в рамках описания класса документацию, поэтому описание класса должно в таком случае включать все передаваемые в конструктор параметры
Если конструкторов несколько, описания должны отражать их отличия друг от друга. Фабрики описываются по такому же принципу. Если конструкторов несколько, описания должны отражать их отличия друг от друга. Фабрики описываются по такому же принципу.
```dart ```dart
///{@macro new_class} ///{@macro new_class}
const NewClass(); const NewClass();
@@ -43,8 +48,10 @@
factory NewClass.fromJson(Map<String, dynamic> json) factory NewClass.fromJson(Map<String, dynamic> json)
``` ```
### Документация полей классов: ### Документация полей классов
В классе необходимо описывать каждое поле по отдельности. Если поле ссылается на другое поле или зависит от него, необходимо это указывать в описании. В классе необходимо описывать каждое поле по отдельности. Если поле ссылается на другое поле или зависит от него, необходимо это указывать в описании.
```dart ```dart
/// Возраст пользователя. /// Возраст пользователя.
final int age; final int age;
@@ -53,7 +60,8 @@
final bool isAdult; final bool isAdult;
``` ```
### Документация геттеров/сеттеров: ### Документация геттеров/сеттеров
```dart ```dart
/// Получения доступа к {описание данных, которые получает геттер} /// Получения доступа к {описание данных, которые получает геттер}
int get newGetter => ... int get newGetter => ...
@@ -62,8 +70,10 @@
set newSetter (int setterValue) => ... set newSetter (int setterValue) => ...
``` ```
### Документация методов: ### Документация методов
Методы должны описывать их основное назначение. Если метод сложный, требуется указывать дополнительное описание его работы ниже через пропущенную строку. Если метод принимает какие-либо параметры, каждый параметр должен быть описан по отдельности списком с прямой ссылкой. Если метод возвращает какие-либо значения, они должны быть описаны. Желательно указать, что вернет метод в случае возникновения ошибки. Методы должны описывать их основное назначение. Если метод сложный, требуется указывать дополнительное описание его работы ниже через пропущенную строку. Если метод принимает какие-либо параметры, каждый параметр должен быть описан по отдельности списком с прямой ссылкой. Если метод возвращает какие-либо значения, они должны быть описаны. Желательно указать, что вернет метод в случае возникновения ошибки.
```dart ```dart
/// Метод для {описание назначения метода}. /// Метод для {описание назначения метода}.
/// {описание особенностей работы метода}. /// {описание особенностей работы метода}.
@@ -73,7 +83,9 @@
... ...
} }
``` ```
Пример: Пример:
```dart ```dart
/// Метод для расчета температуры. /// Метод для расчета температуры.
/// Принимает: /// Принимает:
@@ -88,16 +100,20 @@
## Комментарии ## Комментарии
### Основные правила комментирования кода в проекте: ### Основные правила комментирования кода в проекте
- комментарии оформляются над описываемым участком кода с использованием '//'; - комментарии оформляются над описываемым участком кода с использованием '//';
- комментировать необходимо те участки кода, которые действительно нуждаются в дополнительном описании; - комментировать необходимо те участки кода, которые действительно нуждаются в дополнительном описании;
- комментарий не должен повторять легко читаемые участки кода - комментарий не должен повторять легко читаемые участки кода
Например: Например:
```dart ```dart
if(flag != true) // не нужно описывать как "Если значение не равно true... if(flag != true) // не нужно описывать как "Если значение не равно true...
``` ```
Например: Например:
```dart ```dart
if(isAurora){ if(isAurora){
// Так как Аврора не может открывать WebView, // Так как Аврора не может открывать WebView,
@@ -107,7 +123,8 @@
## TODO ## TODO
### Основные правила создания TODO в проекте: ### Основные правила создания TODO в проекте
- TODO оформляются согласно условиям форматирования линтера с указанием имени разработчика, кто находится в контексте проблемы и сможет ее прокомментировать; - TODO оформляются согласно условиям форматирования линтера с указанием имени разработчика, кто находится в контексте проблемы и сможет ее прокомментировать;
- TODO необходимо оставлять на тех участках кода, которые требуют дальнейшей доработки; - TODO необходимо оставлять на тех участках кода, которые требуют дальнейшей доработки;
- если известно, в рамках какой задачи будет доработан помечаемый участок кода, ссылку на задаче необходимо оставить в скобках. - если известно, в рамках какой задачи будет доработан помечаемый участок кода, ссылку на задаче необходимо оставить в скобках.

View File

@@ -1,21 +1,26 @@
# Ведение проекта в git # Ведение проекта в git
## Создание commits/pull-request ## Создание commits/pull-request
- язык описания PR - Русский; - язык описания PR - Русский;
- описание должно отражать краткую суть изменений; - описание должно отражать краткую суть изменений;
- коммит/PR должен содержать: - коммит/PR должен содержать:
- исчерпывающую информацию об изменениях; - исчерпывающую информацию об изменениях;
- ссылку на задачу в таск-трекер; - ссылку на задачу в таск-трекер;
- Перечисление deprecated-кода (если есть). - Перечисление deprecated-кода (если есть).
### Типы коммитов согласно convention ### Типы коммитов согласно convention
* **feat**: — новая функция
* **fix**: — исправление ошибок - **feat**: — новая функция
* **refactor**: — Изменение кода, которое не исправляет ошибку и не добавляет функции (рефакторинг кода).
* **build**: — изменения, влияющие на систему сборки или внешние зависимости (примеры областей (scope): android, ios, linux и так далее). - **fix**: — исправление ошибок
* **docs**: — изменения только в документации - **refactor**: — Изменение кода, которое не исправляет ошибку и не добавляет функции (рефакторинг кода).
* **chore** - добавление/обновление/настройка инструментов и библиотек (пример: pubspec.yaml). - **build**: — изменения, влияющие на систему сборки или внешние зависимости (примеры областей (scope): android, ios, linux и так далее).
* **test**: — добавление недостающих тестов или исправление существующих тестов. - **docs**: — изменения только в документации
* **ci**: — изменения в файлах конфигурации и скриптах CI (примеры областей: папка CI). - **chore** - добавление/обновление/настройка инструментов и библиотек (пример: pubspec.yaml).
- **test**: — добавление недостающих тестов или исправление существующих тестов.
- **ci**: — изменения в файлах конфигурации и скриптах CI (примеры областей: папка CI).
### Правила именования веток ### Правила именования веток
@@ -28,29 +33,33 @@
Пример: Пример:
* `feat/PRIME-123_authentication` - `feat/PRIME-123_authentication`
* `fix/PRIME-456_typo_in_button` - `fix/PRIME-456_typo_in_button`
* `fix/PRIME-456-typo-in-button` - `fix/PRIME-456-typo-in-button`
## Схема разработки новой features ## Схема разработки новой features
![](./tools/res/images/developing.jpg)
![Схема разработки новой features](./tools/res/images/developing.jpg)
## Создание релиза ## Создание релиза
![](./tools/res/images/release.jpg)
![Схема создания релиза](./tools/res/images/release.jpg)
### Добавление новых features ### Добавление новых features
- создаем ветку feat/(уникальный номер задачи) (название feature), - создаем ветку feat/(уникальный номер задачи) (название feature),
Пример: <b>PRIME-17 Добавить_локальный_репозиторий</b>; Пример: **PRIME-17 Добавить_локальный_репозиторий**;
- вносим изменения; - вносим изменения;
- делаем коммит только на то, что касается изменений связанных с этой задачей; - делаем коммит только на то, что касается изменений связанных с этой задачей;
- по завершению задачи - создаем Pull Request с названием по правилам https://commitlint.io/. - по завершению задачи - создаем Pull Request с названием по правилам <https://commitlint.io/>.
Пример: <b>feat(app,di,auth,scripts,pubspec): PRIME-17 Добавить локальный репозиторий</b>. Пример: **feat(app,di,auth,scripts,pubspec): PRIME-17 Добавить локальный репозиторий**.
Где, PRIME- это обязательный префикс(с помощью него автоматически подтягивается ссылка на задачу), число 17 это уникальный номер задачи из трекера. Где, PRIME- это обязательный префикс(с помощью него автоматически подтягивается ссылка на задачу), число 17 это уникальный номер задачи из трекера.
В описание к PR добавляем ссылку на задачу и описание внесенных изменений, и пояснения(если требуется); В описание к PR добавляем ссылку на задачу и описание внесенных изменений, и пояснения(если требуется);
- после завершения CodeReview создаем squash commit в ветку main (название коммит(а), должно быть такое же как название pull request) ; - после завершения CodeReview создаем squash commit в ветку main (название коммит(а), должно быть такое же как название pull request) ;
- после того как ветка с новой feature попало в main - удаляем ветку; - после того как ветка с новой feature попало в main - удаляем ветку;
### Создание release ### Создание release
- создаем ветку из main (release/release_0.0.1+1); - создаем ветку из main (release/release_0.0.1+1);
- добавляем в changelog.md описание изменений в этой версии (обычно это список коммитов, от предыдущей версии): - добавляем в changelog.md описание изменений в этой версии (обычно это список коммитов, от предыдущей версии):
- делаем сборки, отправляем на тестирование; - делаем сборки, отправляем на тестирование;

View File

@@ -1,4 +1,4 @@
### Управление сгенерированными файлами # Управление сгенерированными файлами
На проекте встречаются файлы, автоматически создаваемые инструментами генерации кода На проекте встречаются файлы, автоматически создаваемые инструментами генерации кода
(например, файлы с расширениями *.g.dart,*.freezed.dart, (например, файлы с расширениями *.g.dart,*.freezed.dart,
@@ -6,21 +6,21 @@
Необходимость контролировать такие файлы в репозитории вызывает ряд обсуждений. Необходимость контролировать такие файлы в репозитории вызывает ряд обсуждений.
См [issue](https://github.com/smmarty/flutter_team/issues/22). См [issue](https://github.com/smmarty/flutter_team/issues/22).
### Проблемы включения сгенерированных файлов в репозиторий ## Проблемы включения сгенерированных файлов в репозиторий
1. Частые изменения. Сгенерированные файлы могут автоматически обновляться даже при отсутствии изменений в исходном коде, что приводит к ненужным изменениям в репозитории. 1. Частые изменения. Сгенерированные файлы могут автоматически обновляться даже при отсутствии изменений в исходном коде, что приводит к ненужным изменениям в репозитории.
2. Конфликты при слиянии веток. Различия в таких файлах могут вызывать конфликты, которые не связаны с реальными изменениями, усложняя процесс работы над кодом. 2. Конфликты при слиянии веток. Различия в таких файлах могут вызывать конфликты, которые не связаны с реальными изменениями, усложняя процесс работы над кодом.
3. Усложнение кода при проверке. Изменения в автоматически сгенерированных файлах попадают в PR, затрудняя код-ревью. 3. Усложнение кода при проверке. Изменения в автоматически сгенерированных файлах попадают в PR, затрудняя код-ревью.
4. Недостоверность содержимого main. Нет гарантии, что в основной ветке всегда будут корректные версии сгенерированных файлов. 4. Недостоверность содержимого main. Нет гарантии, что в основной ветке всегда будут корректные версии сгенерированных файлов.
### Проблемы при добавлении сгенерированных файлов в .gitignore ## Проблемы при добавлении сгенерированных файлов в .gitignore
1. Необходимость предварительной генерации. При добавлении таких файлов в .gitignore для проверки кода в пайплайне необходимо добавлять этап генерации при каждом изменении в PR. 1. Необходимость предварительной генерации. При добавлении таких файлов в .gitignore для проверки кода в пайплайне необходимо добавлять этап генерации при каждом изменении в PR.
Это критично на крупных проектах, так как генерация файлов может занимать несколько минут. Это критично на крупных проектах, так как генерация файлов может занимать несколько минут.
2. Неудобства для разработчиков. Разработчикам потребуется вручную генерировать файлы на локальной машине при каждом чекауте. 2. Неудобства для разработчиков. Разработчикам потребуется вручную генерировать файлы на локальной машине при каждом чекауте.
3. Неактуальный код в main. Основная ветка без предварительно сгенерированных файлов станет неработоспособной, а сборка потребует добавления этапа генерации, что увеличит время и нагрузку на серверы. 3. Неактуальный код в main. Основная ветка без предварительно сгенерированных файлов станет неработоспособной, а сборка потребует добавления этапа генерации, что увеличит время и нагрузку на серверы.
### Рекомендации: ## Рекомендации
1. Оставлять сгенерированные файлы в репозитории. 1. Оставлять сгенерированные файлы в репозитории.
Это позволит сохранить работоспособность основного кода без необходимости постоянной генерации файлов на всех этапах. Это позволит сохранить работоспособность основного кода без необходимости постоянной генерации файлов на всех этапах.

View File

@@ -5,18 +5,18 @@
Оба варианта имеют свои преимущества и недостатки, которые следует учесть. Оба варианта имеют свои преимущества и недостатки, которые следует учесть.
См [issue](https://github.com/smmarty/flutter_team/issues/20) См [issue](https://github.com/smmarty/flutter_team/issues/20)
#### Аргументы за хранение pubspec.lock ## Аргументы за хранение pubspec.lock
1. Повторяемость сборки. Файл фиксирует конкретные версии зависимостей, обеспечивая единообразие версий для всех разработчиков и сред сборки. 1. Повторяемость сборки. Файл фиксирует конкретные версии зависимостей, обеспечивая единообразие версий для всех разработчиков и сред сборки.
2. Избежание неожиданных изменений. Новые версии зависимостей могут внести изменения, способные нарушить сборку или логику приложения. Наличие pubspec.lock позволяет контролировать изменения и избегать неожиданных обновлений. 2. Избежание неожиданных изменений. Новые версии зависимостей могут внести изменения, способные нарушить сборку или логику приложения. Наличие pubspec.lock позволяет контролировать изменения и избегать неожиданных обновлений.
3. Стабильность CI/CD. Зафиксированные версии зависимостей способствуют стабильным сборкам и тестам в CI-процессах. 3. Стабильность CI/CD. Зафиксированные версии зависимостей способствуют стабильным сборкам и тестам в CI-процессах.
4. Рекомендации Dart. Dart рекомендует хранить pubspec.lock в репозитории для приложений, чтобы обеспечить стабильность окружения. (См. документацию.) 4. Рекомендации Dart. Dart рекомендует хранить pubspec.lock в репозитории для приложений, чтобы обеспечить стабильность окружения. (См. документацию.)
#### Аргументы против хранения pubspec.lock ## Аргументы против хранения pubspec.lock
1. Частые изменения. pubspec.lock обновляется при каждом изменении зависимостей, что увеличивает количество коммитов и PR, связанных только с обновлением зависимостей. 1. Частые изменения. pubspec.lock обновляется при каждом изменении зависимостей, что увеличивает количество коммитов и PR, связанных только с обновлением зависимостей.
### Рекомендации: ## Рекомендации
1. ХРАНИТЬ pubspec.lock для ПРИЛОЖЕНИЙ. 1. ХРАНИТЬ pubspec.lock для ПРИЛОЖЕНИЙ.
2. НЕ ХРАНИТЬ pubspec.lock ДЛЯ ПАКЕТОВ. 2. НЕ ХРАНИТЬ pubspec.lock ДЛЯ ПАКЕТОВ.

View File

@@ -30,7 +30,6 @@
- **/dev.dart** - сборка разработки на моковых репозиториях - **/dev.dart** - сборка разработки на моковых репозиториях
- **/stage.dart** - сборка для stage окружения - **/stage.dart** - сборка для stage окружения
## Пример структуры feature папок ## Пример структуры feature папок
- **/data** - слой данных - **/data** - слой данных
@@ -44,31 +43,37 @@
- **/presentation** - слой представления - **/presentation** - слой представления
- **/screens** - все экраны должны заканчиваться на Screen, например UserProfileScreen. - **/screens** - все экраны должны заканчиваться на Screen, например UserProfileScreen.
- **/components** - виджеты, которые необходимы для работы в presentation слое. Например: SuperButton, AppTextFields итд. - **/components** - виджеты, которые необходимы для работы в presentation слое. Например: SuperButton, AppTextFields итд.
# Пояснение к структуре feature папок
## Data (слой данных) Этот слой является поставщиком данных. ## Пояснение к структуре feature папок
### Data (слой данных) Этот слой является поставщиком данных
- Repository - сущность, которая реализует внутри себя предоставление данных. Должен реализовывать какой либо интерфейс репозитория из domain слоя. - Repository - сущность, которая реализует внутри себя предоставление данных. Должен реализовывать какой либо интерфейс репозитория из domain слоя.
- DTO - Dto(Data Transfer Object) модели, и модели с которыми происходит работа в data слое. Например: UserDto; - DTO - Dto(Data Transfer Object) модели, и модели с которыми происходит работа в data слое. Например: UserDto;
## Domain (слой бизнес логики) ### Domain (слой бизнес логики)
- Entity - должны быть в максимально удобном виде для работы внутри Domain и Presentation. Например: UserEntity, ShopEntity; - Entity - должны быть в максимально удобном виде для работы внутри Domain и Presentation. Например: UserEntity, ShopEntity;
- State - управления состоянием - state manager - State - управления состоянием - state manager
- Service - различные сервисы, для выполнения различных задач. - Service - различные сервисы, для выполнения различных задач.
- interfaces - интерфейсы репозиториев, которые используются в domain слое. - interfaces - интерфейсы репозиториев, которые используются в domain слое.
## Presentation (слой представления) ### Presentation (слой представления)
- сomponents - widget'ы которые реализуют работу какого либо визуального компонента(Buttons,TextFields,Lists, итд). Например: ShopList, RateButton. Модальные окна. - сomponents - widget'ы которые реализуют работу какого либо визуального компонента(Buttons,TextFields,Lists, итд). Например: ShopList, RateButton. Модальные окна.
- screens - widget'ы которые представляют собой экран приложения. Например: UserInfoScreen. - screens - widget'ы которые представляют собой экран приложения. Например: UserInfoScreen.
# Основные правила общения объектов между папками ## Основные правила общения объектов между папками
### В рамках всего приложения
## В рамках всего приложения
- объекты внутри фичи должны быть инкапсулированы и не могут использоваться в других feature; - объекты внутри фичи должны быть инкапсулированы и не могут использоваться в других feature;
- если есть необходимость использовать объект в нескольких feature, его нужно вынести в папку app и использовать как глобальный для всего приложения; - если есть необходимость использовать объект в нескольких feature, его нужно вынести в папку app и использовать как глобальный для всего приложения;
- сервис, который должен быть использован в нескольких feature, создается как отдельная feature; - сервис, который должен быть использован в нескольких feature, создается как отдельная feature;
- если создаваемый сервис является платформно-зависимым, его необходимо выносить в app_services. В приложении должен быть только интерфейс. - если создаваемый сервис является платформно-зависимым, его необходимо выносить в app_services. В приложении должен быть только интерфейс.
## В рамках одной feature ### В рамках одной feature
- объекты data слоя не должны ничего знать про объекты слоя presentation. Имеют доступ к объектам entity из domain слоя для преобразования DTO в Entity ; - объекты data слоя не должны ничего знать про объекты слоя presentation. Имеют доступ к объектам entity из domain слоя для преобразования DTO в Entity ;
- объекты domain слоя не должны ничего знать про объекты слоя data, используемый экземпляр репозитория передается в объекты domain слоя через интерфейс репозитория, расположенного в этом же domain слое; - объекты domain слоя не должны ничего знать про объекты слоя data, используемый экземпляр репозитория передается в объекты domain слоя через интерфейс репозитория, расположенного в этом же domain слое;
- объекты domain слоя не должны ничего знать про слой presentation, не должны использовать компоненты библиотек ui, material, cupertino, widget и прочих, не должны использовать context; - объекты domain слоя не должны ничего знать про слой presentation, не должны использовать компоненты библиотек ui, material, cupertino, widget и прочих, не должны использовать context;