2025-05-13 18:14:42 +03:00
|
|
|
|
# Стиль кода
|
|
|
|
|
|
|
|
|
|
|
|
Мы придерживаемся рекомендаций, описанных в
|
|
|
|
|
|
[Effective Dart](https://dart.dev/guides/language/effective-dart/design)
|
|
|
|
|
|
|
|
|
|
|
|
Перед каждым PR необходимо отформатировать код и проверить анализатор на отсутствие сообщений.
|
|
|
|
|
|
|
|
|
|
|
|
## Именование
|
|
|
|
|
|
|
|
|
|
|
|
### Интерфейсы
|
2025-09-17 12:46:45 +03:00
|
|
|
|
|
2025-05-13 18:14:42 +03:00
|
|
|
|
Утверждены два вида объявления интерфейсов:
|
2025-09-17 12:46:45 +03:00
|
|
|
|
|
2025-05-13 18:14:42 +03:00
|
|
|
|
1. Все интерфейсы в приложении должны начинаться с заглавной буквы "**I**".
|
|
|
|
|
|
|
|
|
|
|
|
Например: **IAuthRepository**, **IProfileRepository**, **IMainRunner** и т.д.
|
|
|
|
|
|
|
|
|
|
|
|
Таким образом, сразу видно, что работаешь с интерфейсом.
|
|
|
|
|
|
Пример:
|
2025-09-17 12:46:45 +03:00
|
|
|
|
|
2025-05-13 18:14:42 +03:00
|
|
|
|
```dart
|
|
|
|
|
|
/// Интерфейс - **IUserRepository**
|
|
|
|
|
|
abstract interface class IUserRepository {}
|
|
|
|
|
|
/// Основная реализация (prod и stage окружения)
|
|
|
|
|
|
class UserRepository implements IUserRepository {}
|
|
|
|
|
|
/// Иная реализация (мок, локальное хранилище) должна содержать
|
|
|
|
|
|
/// постфикс функциональности:
|
|
|
|
|
|
/// - Network - сетевое взаимодействие.
|
|
|
|
|
|
/// - Local - локальное хранилище.
|
|
|
|
|
|
/// - Mock - мок репозиторий.
|
|
|
|
|
|
class UserRepositoryLocal implements IUserRepository {}
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
### Классы - Репозитории
|
2025-09-17 12:46:45 +03:00
|
|
|
|
|
2025-05-13 18:14:42 +03:00
|
|
|
|
Репозитории должны содержать в конце название источника данных (если используется мок или локальное хранилище).\
|
|
|
|
|
|
Основная реализация, не должна содержать постфикса.
|
|
|
|
|
|
|
|
|
|
|
|
Например: Интерфейс - **IAuthRepository**\
|
|
|
|
|
|
Основная реализация (prod и stage окружения) - **AuthRepository**
|
|
|
|
|
|
Мок (мок данные) - **AuthRepositoryMock**\
|
|
|
|
|
|
Локальное хранилище (например бд или просто имитация данных) - **AuthRepositoryLocal**
|
2025-09-17 12:46:45 +03:00
|
|
|
|
|
2025-05-13 18:14:42 +03:00
|
|
|
|
### Файлы
|
2025-09-17 12:46:45 +03:00
|
|
|
|
|
2025-05-13 18:14:42 +03:00
|
|
|
|
Используется snake_case.
|
|
|
|
|
|
Название файла должно иметь следующую структуру: [раздел]_[тип].dart
|
|
|
|
|
|
|
|
|
|
|
|
Пример: user_details_screen.dart, shop_entity.dart
|
|
|
|
|
|
|
|
|
|
|
|
### Классы
|
2025-09-17 12:46:45 +03:00
|
|
|
|
|
2025-05-13 18:14:42 +03:00
|
|
|
|
Название классов UpperCamelCase.
|
|
|
|
|
|
Для создание приватных классов используем префикс _ . Название класса в конце должно содержать в себе тип.
|
|
|
|
|
|
|
|
|
|
|
|
Пример: **UserEntity**, **AdultDialog**
|
|
|
|
|
|
|
|
|
|
|
|
## Методы
|
2025-09-17 12:46:45 +03:00
|
|
|
|
|
2025-05-13 18:14:42 +03:00
|
|
|
|
Название метода в начале должно содержать в себе действие(глагол):
|
|
|
|
|
|
|
2025-09-17 12:46:45 +03:00
|
|
|
|
- fetch
|
|
|
|
|
|
- put
|
|
|
|
|
|
- update
|
|
|
|
|
|
- delete и так далее
|
2025-05-13 18:14:42 +03:00
|
|
|
|
|
2025-09-17 12:46:45 +03:00
|
|
|
|
Пример:
|
|
|
|
|
|
|
2025-05-13 18:14:42 +03:00
|
|
|
|
```dart
|
|
|
|
|
|
int fetchFirstElement(){}
|
|
|
|
|
|
```
|
2025-09-17 12:46:45 +03:00
|
|
|
|
|
2025-05-13 18:14:42 +03:00
|
|
|
|
Пример:
|
2025-09-17 12:46:45 +03:00
|
|
|
|
|
2025-05-13 18:14:42 +03:00
|
|
|
|
```dart
|
|
|
|
|
|
void updateFirstElement(){};
|
|
|
|
|
|
```
|
2025-09-17 12:46:45 +03:00
|
|
|
|
|
2025-05-13 18:14:42 +03:00
|
|
|
|
Название метода не должно содержать в себе And/Or
|
|
|
|
|
|
и метод соответственно не должен выполнять подобную логику.
|
|
|
|
|
|
|
|
|
|
|
|
## Переменные и константы
|
2025-09-17 12:46:45 +03:00
|
|
|
|
|
2025-05-13 18:14:42 +03:00
|
|
|
|
Константы именуются также lowerCamelCase.
|
2025-09-17 12:46:45 +03:00
|
|
|
|
Пример:
|
|
|
|
|
|
|
2025-05-13 18:14:42 +03:00
|
|
|
|
```dart
|
|
|
|
|
|
const String carItem
|
|
|
|
|
|
```
|
2025-09-17 12:46:45 +03:00
|
|
|
|
|
|
|
|
|
|
или
|
|
|
|
|
|
|
2025-05-13 18:14:42 +03:00
|
|
|
|
```dart
|
|
|
|
|
|
final userName;
|
|
|
|
|
|
```
|
2025-09-17 12:46:45 +03:00
|
|
|
|
|
2025-05-13 18:14:42 +03:00
|
|
|
|
## Виджеты
|
2025-09-17 12:46:45 +03:00
|
|
|
|
|
2025-05-13 18:14:42 +03:00
|
|
|
|
Виджеты именуются UpperCamelCase.
|
|
|
|
|
|
В названии виджетов не должно содержаться слово widget.
|
|
|
|
|
|
|
|
|
|
|
|
### Экраны
|
2025-09-17 12:46:45 +03:00
|
|
|
|
|
|
|
|
|
|
Экраны, используемые в роутинге, именуются с постфиксом Screen.
|
2025-05-13 18:14:42 +03:00
|
|
|
|
Например, **ShopListScreen**.
|
|
|
|
|
|
|
|
|
|
|
|
### Содержимое экрана
|
2025-09-17 12:46:45 +03:00
|
|
|
|
|
|
|
|
|
|
Виджеты, отображающие содержимое экрана, именуются с постфиксом View.
|
2025-05-13 18:14:42 +03:00
|
|
|
|
Например, **ShopListView**.
|
|
|
|
|
|
|
|
|
|
|
|
### Глобальные виджеты
|
2025-09-17 12:46:45 +03:00
|
|
|
|
|
|
|
|
|
|
Глобальные виджеты именуются с приставкой App.
|
2025-05-13 18:14:42 +03:00
|
|
|
|
Например, **AppButton**.
|
|
|
|
|
|
|
|
|
|
|
|
## Структура класса
|
2025-09-17 12:46:45 +03:00
|
|
|
|
|
2025-05-13 18:14:42 +03:00
|
|
|
|
Объявления элементов класса должны располагаться в следующем порядке:
|
2025-09-17 12:46:45 +03:00
|
|
|
|
|
2025-05-13 18:14:42 +03:00
|
|
|
|
1. **Constructors**
|
|
|
|
|
|
- constructors
|
|
|
|
|
|
- named-constructors
|
|
|
|
|
|
- factory-constructors
|
|
|
|
|
|
2. **Static**
|
|
|
|
|
|
- public-static-methods
|
|
|
|
|
|
- private-static-methods
|
|
|
|
|
|
- public-static-const-fields
|
|
|
|
|
|
- private-static-const-fields
|
|
|
|
|
|
- public-static-final-fields
|
|
|
|
|
|
- private-static-final-fields
|
|
|
|
|
|
- public-static-fields
|
|
|
|
|
|
- private-static-fields
|
|
|
|
|
|
3. **Fields**
|
|
|
|
|
|
- public-final-fields
|
|
|
|
|
|
- private-final-fields
|
|
|
|
|
|
- public-fields
|
|
|
|
|
|
- private-fields
|
|
|
|
|
|
4. **Getters/Setters**
|
|
|
|
|
|
- public-getters-setters
|
|
|
|
|
|
- private-getters-setters
|
|
|
|
|
|
5. **Methods**
|
|
|
|
|
|
- overridden-methods
|
|
|
|
|
|
- public-methods
|
|
|
|
|
|
- protected-methods
|
|
|
|
|
|
- private-methods
|