Skip to content

Commit

Permalink
Update README.md
Browse files Browse the repository at this point in the history
  • Loading branch information
p0dyakov committed May 16, 2023
1 parent ecfea57 commit eacf15a
Showing 1 changed file with 64 additions and 96 deletions.
160 changes: 64 additions & 96 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@
- [Dart](#dart)
* [Final vs Const](#final-vs-const)
* [JIT vs AOT](#jit-vs-aot)
* [Hot restart vs hot reload](#hot-restart-vs-hot-reload)
* [Hot restart vs Hot reload](#hot-restart-vs-hot-reload)
* [HashCode](#hashcode)
* [Extension](#extension)
* [Миксины](#-2)
Expand All @@ -31,27 +31,27 @@
* [Аннотации](#-4)
- [Flutter](#flutter)
* [Stateless vs Stateful](#stateless-vs-stateful)
* [Жизненный цикл Stateful виджета](#-stateful-)
* [Жизненный цикл Stateful-виджета](#-stateful-)
* [BuildContext](#buildcontext)
* [InheritedWidget](#inheritedwidget)
* [Деревья ](#-5)
* [Widget](#widget)
* [Element](#element)
* [RenderObject](#renderobject)
* [Виды элементов](#--2)
* [Виды виджетов](#--3)
* [Жизненный цикл Element-а виджета](#-element-)
* [Виды виджетов](#--2)
* [Виды элементов](#--3)
* [Жизненный цикл Element-а](#-element-)
* [Режимы сборки ](#--4)
* [BuildContext](#buildcontext)
* [GlobalKeys](#globalkeys)
* [LocalKeys](#localkeys)
* [Package vs Plugin](#package-vs-plugin)
* [Shared vs Transitive зависимости](#shared-vs-transitive-)
* [FFI Plugin](#ffi-plugin)
* [InheritedWidget](#inheritedwidget)
* [Этапы анимации](#--5)
* [Виды анимаций](#--6)
* [Что такое Tween](#-tween)
* [Tween анимации](#tween-)
* [CustomPaint](#custompaint)
* [GlobalKeys](#globalkeys)
* [LocalKeys](#localkeys)
* [Sliver Protocol](#sliver-protocol)
* [WidgetsFlutterBinding](#widgetsflutterbinding)
* [Bindings](#bindings)
Expand All @@ -66,33 +66,31 @@
* [Task Runners](#task-runners)
- [Асинхронность](#-6)
* [Виды операций](#--11)
* [Что такое Future? ](#-future)
* [Какие есть конструкторы у Future?](#-future-1)
* [Что такое Event Loop?](#-event-loop)
* [Что такое Completer?](#-completer)
* [Что такое стримы? ](#--12)
* [Какие есть виды стримов?](#--13)
* [Что такое генераторы (sync* / async*)? ](#-sync-async)
* [Как работает await?](#-await)
* [Future ](#future)
* [Конструкторы Future](#-future)
* [Event Loop](#event-loop)
* [Completer](#completer)
* [Stream](#stream)
* [Генераторы (sync* / async*) ](#-sync-async)
* [Await под капотом](#await-)
- [Многопоточность](#-7)
* [Многопоточность в Dart и Flutter ](#-dart-flutter)
* [Что такое Isolate?](#-isolate)
* [Как работет Compute? ](#-compute)
* [Проблемы многопоточности](#--14)
* [Isolate](#isolate)
* [Compute ](#compute)
* [Проблемы многопоточности](#--12)
- [Архитектура](#-8)
* [Что такое архитектура?](#--15)
* [Чистая архитектура](#--16)
* [Управление состоянием](#--17)
* [Архитектура](#-9)
* [Чистая архитектура](#--13)
* [Управление состоянием](#--14)
* [Dependency Injection ](#dependency-injection)
* [Фреймворки](#-9)
* [Архитектурные патерны ](#--18)
* [Способы осуществления навигации](#--19)
* [Базы данных](#--20)
* [Архитектурные патерны ](#--15)
* [Способы осуществления навигации](#--16)
* [Базы данных](#--17)
- [Тестирование](#-10)
* [Что такое тестирование?](#--21)
* [Виды тестов](#--22)
* [Что такое TDD?](#-tdd)
- [Паттерны разработки](#--23)
* [Тестирование](#-11)
* [Виды тестов](#--18)
* [TDD](#tdd)
- [Паттерны разработки](#--19)

<!-- TOC end -->

Expand Down Expand Up @@ -197,7 +195,7 @@

---
<!-- TOC --><a name="hot-restart-vs-hot-reload"></a>
### Hot restart vs hot reload
### Hot restart vs Hot reload
- `Hot Reload` загружает изменения в Dart VM и ребилдит дерево виджетов, сохраняя состояние. Не перезапускает main() и initState()
- `Hot Restart` загружает изменения в Dart VM и перезагружает всё приложение. Состояние не сохраняется

Expand Down Expand Up @@ -343,7 +341,7 @@
`RenderObject` - это мутабельный объект дерева визуализации. У него есть родительский объект, а также поле с данными, которое родительский объект использует для хранения специфичной информации, касающейся самого этого объекта, например, его позицию. Данный объект отвечает за отрисовку, учёт размеров и ограничений, прослушивание и обработку нажатий. При необходимости перерисовки помечается как dirty. Перерисовывается, используя свой метод layer

---
<!-- TOC --><a name="--3"></a>
<!-- TOC --><a name="--2"></a>
### Виды виджетов
`Proxy` - это виджеты, которые хранят некоторую информацию и делают её доступной для потомков. Эти виджеты не принимают непосредственного участия в формировании пользовательского интерфейса, но используются для получения информации, которую они могут предоставить.
- `InheritedWidget`
Expand All @@ -366,7 +364,7 @@
- `Container`

---
<!-- TOC --><a name="--2"></a>
<!-- TOC --><a name="--3"></a>
### Виды элементов
![image](https://user-images.githubusercontent.com/80569772/205450564-87d6c2d0-a994-4d1d-bbaa-2c8f7fb07385.png)
`ComponentElement` - компоновочный элемент, который явно не содержит логику рисования/отображения. Есть метод build(), который возвращает виджет. Образуется только при создании виджетов StatelessWidget, StatefulWidget, InheritedWidget (ProxyWidget).
Expand Down Expand Up @@ -643,17 +641,17 @@
- `Асинхронные` НЕ блокируют другие операции до своего выполнения.

---
<!-- TOC --><a name="-future"></a>
### Что такое Future?
<!-- TOC --><a name="future"></a>
### Future
`Future` - это обёртка над результатом выполнения асинхронной операции. Код Future НЕ выполняется параллельно, а выполняется в последовательности, определяемой Event Loop.
Состояния Future:
- Uncompleted - операция не завершена
- Completed with Result - операция завершена успешно
- Completed with Error - операция завершена с ошибкой

---
<!-- TOC --><a name="-future-1"></a>
### Какие есть конструкторы у Future?
<!-- TOC --><a name="-future"></a>
### Конструкторы Future
- `Future(FutureOr<T> computation())`: создает объект future, который с помощью метода Timer.run запускает функцию computation асинхронно и возвращает ее результат.
- `FutureOr<T>`: указывает, что функция computation должна возвращать либо объект Future<T> либо объект типа T. Например, чтобы получить объект Future<int>, функция computation должна возвращать либо объект Future<int>, либо объект int
- `Future.delayed(Duration duration, [FutureOr<T> computation()])`: создает объект Future, который запускается после временной задержки, указанной через первый параметр Duration. Второй необязательный параметр указывает на функцию, которая запускается после этой задержки.
Expand All @@ -663,8 +661,8 @@
- `Future.value([FutureOr<T> value])`: создает объект Future, который содержит значение value.

---
<!-- TOC --><a name="-event-loop"></a>
### Что такое Event Loop?
<!-- TOC --><a name="event-loop"></a>
### Event Loop
`Event Loop` - вечный цикл, выполняющий все поступающие в изолят задачи.
В нём есть две FIFO очереди задач:

Expand All @@ -675,31 +673,27 @@
Используется для планирования операций, которые получают результат от внешних событий (операции ввода/вывода, жесты, рисование, таймеры, потоки)

---
<!-- TOC --><a name="-completer"></a>
### Что такое Completer?
<!-- TOC --><a name="completer"></a>
### Completer
`Completer` позволяет поставлять Future, отправлять событие о выполнении или событие об ошибке. Это может быть полезно, когда нужно сделать цепочку Future и вернуть результат.

---
<!-- TOC --><a name="--12"></a>
### Что такое стримы?
`Stream` - это последовательность асинхронных событий. Stream сообщает вам, что есть событие и когда оно будет готово

---
<!-- TOC --><a name="--13"></a>
### Какие есть виды стримов?
<!-- TOC --><a name="stream"></a>
### Stream
`Stream` - это последовательность асинхронных событий. Stream сообщает вам, что есть событие и когда оно будет готово
- `Single subscription` - это вид потока, при котором может быть только один подписчик.
- `Broadcast` - это вид потока, при котором может быть много подписчиков. При этом Broadcast стримы отдают свои данные вне зависимости от того, подписан ли кто-нибудь на них или нет. Подписчики стрима получают события только с момента подписки, а не с момента старта жизни стрима

---
<!-- TOC --><a name="-sync-async"></a>
### Что такое генераторы (sync* / async*)?
### Генераторы (sync* / async*)
`Генератор` это ключевое слово, которое позволяет создавать последовательность значений с помощью yield
- *sync** - это синхронный генератор. Возвращает Iterable
- *async** - это aсинхронный генератор. Возвращает Stream

---
<!-- TOC --><a name="-await"></a>
### Как работает await?
<!-- TOC --><a name="await-"></a>
### Await под капотом
Под капотом `await` перемещает весь последующий код в `then` у `Future`, которую мы дожидаемся

<!-- TOC --><a name="-7"></a>
Expand All @@ -709,17 +703,17 @@
`Dart` — однопоточный язык программирования. Он исполняет одновременно одну инструкцию. Но при этом мы можем запустить код в отдельном поток с помощью Isolate

---
<!-- TOC --><a name="-isolate"></a>
### Что такое Isolate?
<!-- TOC --><a name="isolate"></a>
### Isolate
`Isolate` - это легковесный процесс (поток исполнения), который выполняется параллельно с другими потоками и процессами в приложении. Каждый Isolate в Dart имеет свой собственный экземпляр виртуальной машины Dart, собственную память и управляется с помощью своей собственной очереди сообщений.

---
<!-- TOC --><a name="-compute"></a>
### Как работет Compute?
<!-- TOC --><a name="compute"></a>
### Compute
`Compute` - это функция, которая создаёт изолят и запускает переданный код.

---
<!-- TOC --><a name="--14"></a>
<!-- TOC --><a name="--12"></a>
### Проблемы многопоточности

- `Deadlock` — каждый из потоков ожидают событий, которые могут предоставить другие потоки
Expand All @@ -729,12 +723,12 @@

<!-- TOC --><a name="-8"></a>
## Архитектура
<!-- TOC --><a name="--15"></a>
### Что такое архитектура?
<!-- TOC --><a name="-9"></a>
### Архитектура
Архитектура - это набор решений по организации программы. Таких, как деление программы на слои, построение связей между ними, управление состоянием, связь с UI. Хорошая архитектура делает слои в приложении слабо связанными, что упрощает внесение изменений, повышает тестируемость кода, упрощает систему

---
<!-- TOC --><a name="--16"></a>
<!-- TOC --><a name="--13"></a>
### Чистая архитектура
По чистой архитектуре система делится на три слоя:
- `Data (datasources, models, repositories)` получение данных извне
Expand All @@ -744,7 +738,7 @@
[Пример](https://github.com/ResoCoder/flutter-tdd-clean-architecture-course)

---
<!-- TOC --><a name="--17"></a>
<!-- TOC --><a name="--14"></a>
### Управление состоянием

**Vanilla**
Expand Down Expand Up @@ -842,35 +836,9 @@
- Статика
- Нельзя слушать изменения
- Не Flutter ориентирован

---
<!-- TOC --><a name="-9"></a>
### Фреймворки
**Fish Redux**

`Плюсы`
- Coming soon

`Минусы`
- Большое количество boilerplate кода
- Coming soon

`Использование:`
- Coming soon

**GetX**

`Плюсы`
- Coming soon

`Минусы`
- Coming soon

`Использование:`
- Coming soon

---
<!-- TOC --><a name="--18"></a>
<!-- TOC --><a name="--15"></a>
### Архитектурные патерны
![](https://fuzeservers.ru/wp-content/uploads/2/6/8/268a107e69309f0529c18aae72769bdb.png)
**MVVM**
Expand Down Expand Up @@ -926,7 +894,7 @@
- Используется в ситуации, когда связь между представление и другими частями приложения невозможна (и Вы не можете использовать MVVM или MVP);

---
<!-- TOC --><a name="--19"></a>
<!-- TOC --><a name="--16"></a>
### Способы осуществления навигации
**Navigator**
- Идёт из коробки
Expand All @@ -944,7 +912,7 @@
- Разные варианты анимаций

---
<!-- TOC --><a name="--20"></a>
<!-- TOC --><a name="--17"></a>
### Базы данных
**Нереляционные (NoSQL):**
**Hive**
Expand Down Expand Up @@ -1062,23 +1030,23 @@

<!-- TOC --><a name="-10"></a>
## Тестирование
<!-- TOC --><a name="--21"></a>
### Что такое тестирование?
<!-- TOC --><a name="-11"></a>
### Тестирование
`Тестирование` — это процесс испытания приложения для проверки соответствия между реальным поведением и ожидаемым

---
<!-- TOC --><a name="--22"></a>
<!-- TOC --><a name="--18"></a>
### Виды тестов
- `Модульный тест` тестирует одну функцию, метод или класс. Его цель - проверить правильность работы определенной функции, метода или класса. Внешние зависимости для тестируемого модуля обычно передаются как параметр.
- `Виджет тест` тестирует один виджет. Цель такого теста — убедиться, что пользовательский интерфейс виджета выглядит и взаимодействует, как запланировано. Тестирование виджета происходит в тестовой среде, которая обеспечивает контекст жизненного цикла виджета. Также тестируемый виджет должен иметь возможность получать действия и события пользователя и отвечать на них .
- `Интеграционный тест` тестирует все приложение или его большую часть. Цель интеграционного теста — убедиться, что все тестируемые виджеты и сервисы работают вместе, как ожидалось. Кроме того, вы можете использовать интеграционные тесты для проверки производительности вашего приложения. Как правило, интеграционный тест выполняется на реальном устройстве или эмуляторе.

---
<!-- TOC --><a name="-tdd"></a>
### Что такое TDD?
<!-- TOC --><a name="tdd"></a>
### TDD
`TDD` — это методика разработки приложений, при которой сначала пишется тест, покрывающий желаемое изменение, а затем — код, который позволит пройти тест.

<!-- TOC --><a name="--23"></a>
<!-- TOC --><a name="--19"></a>
## Паттерны разработки
*Порождающие*. Отвечают за удобное и безопасное создание новых объектов или даже целых семейств объектов.
- Factory Method (Фабричный Метод). Порождающий паттерн проектирования, который определяет общий интерфейс для создания объектов в суперклассе, позволяя подклассам изменять тип создаваемых объектов.
Expand Down

0 comments on commit eacf15a

Please sign in to comment.