Чистая архитектура в Android

В пе­ри­од ро­ста тех­но­ло­гий очень важ­но пра­виль­но вы­брать ар­хи­тек­ту­ру, ес­ли вы хо­ти­те со­здать фан­та­сти­че­скую про­грам­му, вот по­че­му это так важ­но. Ес­ли вы за­ин­те­ре­со­ва­ны в со­зда­нии при­ло­же­ний для Android с по­мо­щью чи­стой ар­хи­тек­ту­ры, то вы по­па­ли в нуж­ное ме­сто. Здесь мы не про­сто предо­став­ля­ем вам ру­ко­вод­ство по MVVM (Model View-View model), но мы бу­дем ис­поль­зо­вать MVVM для его под­клю­че­ния через чи­стую ар­хи­тек­ту­ру. В этой ста­тье мы рас­смот­рим, как ис­поль­зо­вать этот ди­зайн для со­зда­ния несвя­зан­но­го, про­те­сти­ро­ван­но­го и под­дер­жи­ва­е­мо­го ко­да. Преж­де чем мы пе­рей­дем к на­ше­му ос­нов­но­му об­суж­де­нию, да­вай­те сна­ча­ла раз­бе­рем­ся с MVVM.

МВВМ

Model-View-ViewModel (MVVM) — это струк­ту­ра раз­ра­бот­ки про­грамм­но­го обес­пе­че­ния, ко­то­рая от­де­ля­ет про­грамм­ную ло­ги­ку от эле­мен­тов управ­ле­ния поль­зо­ва­тель­ско­го ин­тер­фей­са. Он был пред­став­лен дву­мя из­вест­ны­ми ар­хи­тек­то­ра­ми Microsoft Ке­ном Ку­пе­ром и Джо­ном Госс­ма­ном в 2005 го­ду. Кро­ме то­го, MVVM так­же из­ве­стен как model-view-binder . Как и мно­гие дру­гие шаб­ло­ны про­ек­ти­ро­ва­ния, MVVM по­мо­га­ет в ор­га­ни­за­ции ко­да и раз­де­ле­нии про­грамм на мо­ду­ли, что упро­ща­ет и уско­ря­ет раз­ра­бот­ку, об­нов­ле­ние и по­втор­ное ис­поль­зо­ва­ние ко­да. Ди­зайн ча­сто ис­поль­зу­ет­ся в Windows и про­грамм­ном обес­пе­че­нии для пре­зен­та­ций веб-гра­фи­ки. Windows Presentation Foundation (WPF) ра­бо­та­ет на плат­фор­ме Microsoft .NET и ис­поль­зу­ет ди­зайн MVVM. MVVM так­же ис­поль­зу­ет­ся Silverlight, муль­ти­ме­дий­ным под­клю­ча­е­мым мо­ду­лем Microsoft WPF, со­по­ста­ви­мым с Ин­тер­не­том.

Чи­стая ар­хи­тек­ту­ра в Android

Чи­стая ар­хи­тек­ту­ра — это ме­тод раз­ра­бот­ки про­грамм­но­го обес­пе­че­ния, при ко­то­ром вы долж­ны быть в со­сто­я­нии опре­де­лить, что де­ла­ет про­грам­ма, про­сто взгля­нув на ее ис­ход­ный код. Язык про­грам­ми­ро­ва­ния, ап­па­рат­ные и про­грамм­ные биб­лио­те­ки, необ­хо­ди­мые для до­сти­же­ния це­ли про­грам­мы, долж­ны стать уста­рев­ши­ми. Как и дру­гие фило­со­фии раз­ра­бот­ки про­грамм­но­го обес­пе­че­ния, чи­стая ар­хи­тек­ту­ра на­прав­ле­на на обес­пе­че­ние эко­но­ми­че­ски эф­фек­тив­но­го про­цес­са раз­ра­бот­ки ка­че­ствен­но­го ко­да, ко­то­рый ра­бо­та­ет луч­ше, его лег­че из­ме­нять и ко­то­рый име­ет мень­ше за­ви­си­мо­стей. Ро­берт С. Мар­тин со­здал чи­стую ар­хи­тек­ту­ру и про­дви­гал ее в сво­ем бло­ге Uncle Bob в 2011 го­ду.

Ну, вы, долж­но быть, за­да­е­тесь во­про­сом, по­че­му ар­хи­тек­ту­ра необ­хо­ди­ма? Ко­па­ем внутрь. Це­лью всех ар­хи­тек­тур яв­ля­ет­ся управ­ле­ние слож­но­стью ва­ше­го при­ло­же­ния. В неболь­шом про­ек­те вам, воз­мож­но, не нуж­но об этом бес­по­ко­ить­ся, но это мо­жет спа­сти жизнь в бо­лее круп­ных про­ек­тах. Ду­маю, вы уже ви­де­ли эту кар­тин­ку.

Чистая архитектура в Android

Вы­ше­упо­мя­ну­тые коль­ца пред­став­ля­ют раз­лич­ные уров­ни про­грамм­но­го обес­пе­че­ния в ва­шем при­ло­же­нии. Преж­де чем мы дви­нем­ся даль­ше, необ­хо­ди­мо пом­нить о двух важ­ных мо­мен­тах:

  1. Са­мый аб­стракт­ный круг на­хо­дит­ся в цен­тре, а са­мое кон­крет­ное коль­цо — сна­ру­жи. Прин­цип аб­страк­ции — вот как это на­зы­ва­ет­ся. В со­от­вет­ствии с прин­ци­пом аб­страк­ции внут­рен­ние кру­ги долж­ны вклю­чать биз­нес-ло­ги­ку, то­гда как внеш­ние кру­ги долж­ны со­дер­жать де­та­ли ре­а­ли­за­ции;
  2. Пра­ви­ло за­ви­си­мо­сти — еще один прин­цип чи­стой ар­хи­тек­ту­ры. Это пра­ви­ло гла­сит, что каж­дый круг мо­жет по­ла­гать­ся толь­ко на бли­жай­ший к нему внут­рен­ний круг, что поз­во­ля­ет ар­хи­тек­ту­ре функ­ци­о­ни­ро­вать.

Воз­мож­но, сей­час са­мое вре­мя по­нять, по­че­му MVVM с чи­стой ар­хи­тек­ту­рой?

MVVM с чи­стой ар­хи­тек­ту­рой

Ва­ше пред­став­ле­ние, то есть (ак­тив­ность и фраг­мен­ты), от­де­ле­но от ва­шей биз­нес-ло­ги­ки с по­мо­щью MVVM. Для неболь­ших про­ек­тов до­ста­точ­но MVVM, но по ме­ре ро­ста ва­шей ко­до­вой ба­зы ва­ши ViewModels на­чи­на­ют раз­ду­вать­ся. Раз­де­лить обя­зан­но­сти ста­но­вит­ся слож­но. В та­ких слу­ча­ях MVVM с чи­стой ар­хи­тек­ту­рой яв­ля­ет­ся под­хо­дя­щим вы­бо­ром. Это де­ла­ет шаг впе­ред в раз­де­ле­нии обя­зан­но­стей ва­шей ко­до­вой ба­зы. Ло­ги­ка дей­ствий, ко­то­рые мо­гут быть вы­пол­не­ны в ва­шем при­ло­же­нии, аб­стра­ги­ро­ва­на. Те­перь чи­стую ар­хи­тек­ту­ру так­же мож­но ком­би­ни­ро­вать с ар­хи­тек­ту­рой Model-View-Presenter (MVP). Итак, мы вы­би­ра­ем MVVM, а не MVP, по­то­му что в Android Architecture Components уже есть встро­ен­ный класс ViewModel — фрейм­ворк MVVM не ну­жен!

Преж­де чем мы дви­нем­ся даль­ше, вы долж­ны чет­ко по­ни­мать, что ис­поль­зо­ва­ние чи­стой ар­хи­тек­ту­ры мо­жет иметь свои пре­иму­ще­ства и недо­стат­ки . Да­вай­те про­ве­рим это один за дру­гим.

Пре­иму­ще­ство чи­стой ар­хи­тек­ту­ры

  • Код лег­че те­сти­ро­вать, чем со стан­дарт­ным MVVM;
  • Иде­аль­но вы­ве­рен­ное раз­де­ле­ние (са­мое зна­чи­тель­ное пре­иму­ще­ство);
  • Удоб­ная струк­ту­ра па­ке­та;
  • Лег­ко под­дер­жи­вать про­ект в ра­бо­чем со­сто­я­нии;
  • Ва­ша ко­ман­да смо­жет внед­рять но­вые функ­ции еще быст­рее.

Недо­стат­ки чи­стой ар­хи­тек­ту­ры

  • Кри­вая обу­че­ния немно­го кру­тая. Мо­жет по­тре­бо­вать­ся неко­то­рое вре­мя, чтобы узнать, как вза­и­мо­дей­ству­ют все уров­ни, осо­бен­но ес­ли вы ис­поль­зу­е­те та­кие ар­хи­тек­ту­ры, как про­стые MVVM или MVP;
  • Он со­дер­жит мно­го до­пол­ни­тель­ных клас­сов, по­это­му не под­хо­дит для при­ло­же­ний с низ­ким уров­нем слож­но­сти.

Кри­вая обу­че­ния немно­го кру­тая. Мо­жет по­тре­бо­вать­ся неко­то­рое вре­мя, чтобы узнать, как вза­и­мо­дей­ству­ют все уров­ни, осо­бен­но ес­ли вы ис­поль­зу­е­те та­кие ар­хи­тек­ту­ры, как про­стые MVVM или MVP. Он со­дер­жит мно­го до­пол­ни­тель­ных клас­сов, по­это­му не под­хо­дит для при­ло­же­ний с низ­ким уров­нем слож­но­сти.

Те­перь да­вай­те про­ве­рим слои, участ­ву­ю­щие в этом про­цес­се.

Со­че­та­ние MVVM с чи­стой ар­хи­тек­ту­рой

Ни­же мы по­ка­зы­ва­ем вам гра­фи­че­ское пред­став­ле­ние MVVM с чи­стой ар­хи­тек­ту­рой.

Сочетание MVVM с чистой архитектурой
Hуж­но за­пом­нить:
  • Толь­ко внеш­ние уров­ни мо­гут по­ла­гать­ся на внут­рен­ние уров­ни для свя­зи;
  • Ко­ли­че­ство сло­ев пол­но­стью за­ви­сит от вас: сде­лай­те так, чтобы оно со­от­вет­ство­ва­ло ва­шим тре­бо­ва­ни­ям;
  • В уз­ких кру­гах все ста­но­вит­ся бо­лее аб­стракт­ным.

Слои MVVM

Су­ще­ству­ют раз­ные точ­ки зре­ния на ко­ли­че­ство уров­ней, ко­то­рые долж­на иметь чи­стая ар­хи­тек­ту­ра. Ди­зайн не опре­де­ля­ет от­дель­ные слои, а вме­сто это­го за­кла­ды­ва­ет ос­но­ву. Кон­цеп­ция за­клю­ча­ет­ся в том, что вы на­стра­и­ва­е­те ко­ли­че­ство сло­ев в со­от­вет­ствии с ва­ши­ми по­треб­но­стя­ми. Здесь, для крат­ко­сти, мы бу­дем ис­поль­зо­вать пять, взгля­ни­те на них.

  • Пред­став­ле­ние: это уро­вень, ко­то­рый вза­и­мо­дей­ству­ет с поль­зо­ва­тель­ским ин­тер­фей­сом (UI);
  • До­мен: здесь хра­нит­ся биз­нес-ло­ги­ка при­ло­же­ния;
  • Ва­ри­ан­ты ис­поль­зо­ва­ния: ин­тер­ак­то­ры — это дру­гое их на­зва­ние;
  • Дан­ные: все ис­точ­ни­ки дан­ных опре­де­ля­ют­ся в ши­ро­ком смыс­ле;
  • Framework: ре­а­ли­зу­ет ин­тер­фейс с Android SDK, а так­же кон­крет­ные ре­а­ли­за­ции уров­ня дан­ных.

Ко­гда ис­поль­зо­вать чи­стую ар­хи­тек­ту­ру?

Крайне важ­но пом­нить, что чи­стая ар­хи­тек­ту­ра не яв­ля­ет­ся ле­кар­ством, но мо­жет быть при­ме­не­на к лю­бой плат­фор­ме. На ос­но­ве про­ек­та сле­ду­ет опре­де­лить, со­от­вет­ству­ет ли он ва­шим тре­бо­ва­ни­ям. На­при­мер, ес­ли ваш про­ект боль­шой и слож­ный, с боль­шим ко­ли­че­ством биз­нес-ло­ги­ки, чи­стая ар­хи­тек­ту­ра име­ет мно­го пре­иму­ществ. Од­на­ко для бо­лее мел­ких и про­стых за­дач пре­иму­ще­ства мо­гут быть то­го не сто­ит — в ко­неч­ном ито­ге вам при­дет­ся пи­сать боль­ше ко­да и уве­ли­чи­вать слож­ность со все­ми сло­я­ми, а так­же тра­тить боль­ше вре­ме­ни.

Ис­точ­ник