Skip to content

Commit 3978a1b

Browse files
author
Dmitriy Samaryan
committed
Исправил некоторые стилистические ошибки в предложении и поправил верстку текста
1 parent a3271af commit 3978a1b

File tree

1 file changed

+17
-9
lines changed

1 file changed

+17
-9
lines changed

cases/wizards/Wizards_article.md

Lines changed: 17 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,9 @@
2222

2323
Итак, начнем с простого. Каждый экран должен быть независим. И каждый экран представляет собой классический архитектурный слоеный пирог. Например, экран принятия лицензии внешне будет выглядеть вот так:<br>
2424
![image](https://habrastorage.org/web/c87/48f/d70/c8748fd702d0438e96ec6b248de11f73.png)
25+
2526
А архитектурно вот так:
27+
2628
![image](https://habrastorage.org/web/891/5b2/9fa/8915b29fa7324352a277c83752d4d063.png)
2729

2830
И так для каждого экрана. <br>
@@ -94,7 +96,7 @@ public class LicensePresenter extends MvpPresenter<LicenseView> {
9496
Поэтому введем новую сущность под названием **SmartRouter**:<br>
9597
![image](https://habrastorage.org/webt/59/ce/84/59ce848923d9d439944582.png)
9698
**SmartRouter** ответственен за навигацию между экранами, содержит некоторую логику, на основании которой принимает решение о следующем шаге, и содержит некоторые состояния (обычно одно состояние - текущий шаг).<br>
97-
Давайте посмотрим, как выглядит `WizardSmartRouter` вживую:<br>
99+
Давайте посмотрим, как выглядит `MainWizardSmartRouter` вживую:<br>
98100
```java
99101
public class MainWizardSmartRouter {
100102

@@ -184,8 +186,8 @@ public class MainWizardSmartRouter {
184186
Вы можете заметить имплементации известных нам уже `InfoWizardPart`, `LicenseWizardPart` и `ActivationWizardPart`. `currentWizardStep` - это состояние текущего шага Визарда. Ну а вопросы непосредственной навигации делегируются через также известный нам `Router`. Если количество используемых в Визарде экранов большое, то имплементации интерфейсов можно вынести в отдельные классы.<br>
185187
Таким образом мы получаем единую сущность, ответственную за организацию Визарда, сущность, которая объединяет все, по сути, независимые экраны.<br>
186188

187-
Детали реализации вы можете посмотреть в [примере](https://github.com/AndroidArchitecture/WizardCase/tree/sample_1). Как там это все выглядит с Dagger2 и Moxy. Обязательно просмотрите код, прежде чем продолжать читать дальше.<br>
188-
Что еще хочу добавить к деталям реализации. Визард реализован по канонам Андроида, то есть одна Активити для всего Визарда (`MainActivity`) с тремя в данном случае фрагментами (`InfoFragment`, `LicenseFragment`, `ActivationFragment`). Поэтому в `MainActivity` реализован `NavigatorHolder` для роутинга, и также стартуется Визард (вызов `wizardSmartRouter.startWizard()` в `onResume()`).<br>
189+
Детали реализации вы можете посмотреть в [примере](https://github.com/AndroidArchitecture/WizardCase/tree/sample_1) и как там это все выглядит вместе с Dagger2 и Moxy. Обязательно просмотрите код, прежде чем продолжать читать дальше.<br>
190+
Что еще хочу добавить к деталям реализации: визард реализован по канонам Андроида, то есть одна Активити для всего Визарда (`MainActivity`) с тремя в данном случае фрагментами (`InfoFragment`, `LicenseFragment`, `ActivationFragment`). Поэтому в `MainActivity` реализован `NavigatorHolder` для роутинга, и также стартуется Визард (вызов `wizardSmartRouter.startWizard()` в `onResume()`).<br>
189191
С точки зрения Даггера мы имеем два модуля (`WizardModule` и `WizardNavigationModule`), соединенных вместе в `WizardComponent`. Вообщем-то и все особенности.<br>
190192

191193
Начнем усложнять нашу жизнь. Представим, что нам необходимо реализовать такой Визард:<br>
@@ -294,30 +296,36 @@ public class InfoFinishFragment extends InfoFragment {
294296
В итоге получаем максимально простую переиспользуемость одного и того же экрана в рамках одного Визарда. Более подробно код [здесь (ветка sample_2)](https://github.com/AndroidArchitecture/WizardCase/tree/sample_2).<br>
295297

296298
А теперь представим такой пример:<br>
299+
297300
![image](https://habrastorage.org/web/10e/68d/808/10e68d808c994bcdb3f8000724f36ee9.png)
301+
298302
Активация немного усложнилась =) Рассмотрим поподробнее, что происходит. <br>
299-
Допустим, мы на экране Активации сейчас (**Activation screen**):<br>
303+
Допустим, что сейчас мы на экране Активации (**Activation screen**):<br>
304+
300305
![image](https://habrastorage.org/web/fe6/abf/2d2/fe6abf2d29194ff492010495874ffa4f.png)
301306

302307
По нажатию на кнопку "To personal account" пользователь попадает на экраны логина/регистрации.<br>
303308
Сначала нас ждет снова информационный экран (нижний в схеме **Information screen**):<br>
309+
304310
![image](https://habrastorage.org/web/091/fcc/6e4/091fcc6e49334173ba13dc218f5eb157.png)
305311

306312
Далее экран Логина (**Login screen**):<br>
313+
307314
![image](https://habrastorage.org/web/723/2ac/3c1/7232ac3c16f04f0991acbf2b122d56db.png)
308315

309-
На этом экране мы можем ввести свои креды и попасть на финальный экран Визарда. Либо же зарегистрировать новый аккаунт (**Registration screen**):<br>
316+
На этом экране мы можем ввести свои креды и попасть на финальный экран Визарда, либо же зарегистрировать новый аккаунт (**Registration screen**):<br>
317+
310318
![image](https://habrastorage.org/web/962/6ea/7c8/9626ea7c860c4dc4a1aeddcd21dc2861.png)
311319

312320
И если регистрация проходит успешно, то мы также попадем на финальный экран Визарда.<br>
313-
А теперь еще такая вводная. У нас есть несколько визардов, и во всех них может понадобиться логин/регистрация. Получается, что во всех визардах нам придется вводить эти три экрана, логика взаимодействия которых между друг другом везде одинаковая. <br>
321+
А теперь еще такая вводная: у нас есть несколько визардов, и в любом из них может понадобиться логин/регистрация. Получается, что во всех визардах нам придется вводить эти три экрана, логика взаимодействия которых между друг другом везде одинаковая. <br>
314322
Разве никак нельзя как-то избежать этого безжалостного дублирования кода? На самом деле можно. Давайте еще раз взглянем на схему:<br>
315323
![image](https://habrastorage.org/web/10e/68d/808/10e68d808c994bcdb3f8000724f36ee9.png)
316324

317325
На самом деле ее можно трансформитровать до такой схемы:<br>
318326
![image](https://habrastorage.org/web/b72/6ee/ab7/b726eeab7080457bb6a0258cfc2dd8db.png)
319327

320-
То есть последовательность экранов InformationScreen, LoginScreen и RegistrationScreen и логику их взаимодействия мы выделяем в новый **AccountWizard**. И данный **AccountWizard** может сообщить внешнему Визарду, допустим, только две вещи:<br>
328+
То есть последовательность экранов InformationScreen, LoginScreen и RegistrationScreen и логику их взаимодействия мы выделяем в новый **AccountWizard**. Этот **AccountWizard** может сообщить внешнему Визарду, допустим, только две вещи:<br>
321329
- пользователь вошел в нашу систему (залогинился или зарегистрировался, неважно),<br>
322330
- пользователь не вошел в нашу систему (будем полагать, что просто вышел с данных экранов, ошибки логина/регистрации вовне не выносим).<br>
323331

@@ -419,7 +427,7 @@ public class AccountWizardSmartRouter {
419427
```
420428

421429
Особо ничего нового за исключением того, что в необходимых местах дергается ```AccountWizardPart```.<br>
422-
Данный визард с технической точки зрения реализован точно также, как мы до этого реализовывали MainWizard. То есть это:<br>
430+
Данный визард с технической точки зрения реализован точно также, как мы до этого реализовывали ```MainWizardSmartRouter```. То есть это:<br>
423431
- android: отдельная активити (```AccountActivity```) с тремя фрагментами (```InfoAccountFragment```, ```LicenseFragment```, ```RegistrationFragment```),<br>
424432
- dagger2: два модуля (```AccountWizardModule```, ```AccountNavigationModule```), замыкающихся в одном компоненте (```AccountWizardComponent```) со своим скоупом (```AccountWizardScope```). ```AccountWizardComponent``` является сабкомпонентом от ```WizardComponent```.<br>
425433

@@ -548,5 +556,5 @@ public class MainWizardSmartRouter {
548556
}
549557
```
550558

551-
По сути добавился еще один ```...wizardPart``` интерфейс и все. А то, что под этим ```AccountWizardPart``` скрывается отдельный Визард, MainWizard не знает. И в этом основная красота построения Визардов через **SmartRouter** и интерфейсы **...wizardPart**.<br>
559+
По сути добавился еще один ```...wizardPart``` интерфейс и все. А то, что под этим ```AccountWizardPart``` скрывается отдельный Визард, ```MainWizardSmartRouter``` не знает. И в этом основная красота построения Визардов через **SmartRouter** и интерфейсы **...wizardPart**.<br>
552560
В итоге подобное построение Визардов позволяет достигнуть обозначенных выше целей.

0 commit comments

Comments
 (0)