HTML Diff
0 added 0 removed
Original 2026-01-01
Modified 2026-02-21
1 <p><a>#Мнения</a></p>
1 <p><a>#Мнения</a></p>
2 <ul><li>15 окт 2021</li>
2 <ul><li>15 окт 2021</li>
3 <li>0</li>
3 <li>0</li>
4 </ul><h2>Как проектируют приложения: разбираемся в архитектуре</h2>
4 </ul><h2>Как проектируют приложения: разбираемся в архитектуре</h2>
5 <p>Старший iOS-разработчик из "ВКонтакте" рассказывает, почему архитектура не главное в проекте и как сделать продукт поддерживаемым и масштабируемым.</p>
5 <p>Старший iOS-разработчик из "ВКонтакте" рассказывает, почему архитектура не главное в проекте и как сделать продукт поддерживаемым и масштабируемым.</p>
6 <p>Старший iOS-разработчик во "ВКонтакте". Раньше был фулстеком, бэкендером и DevOps, руководил отделом мобильной разработки, три года преподавал iOS-разработку в GeekBrains, был деканом факультета. Состоит в программном комитете конференции Podlodka iOS Crew, ведёт<a>YouTube-канал</a>с видеоуроками по Flutter. В Twitter пишет под ником<a>@tygeddar</a>.</p>
6 <p>Старший iOS-разработчик во "ВКонтакте". Раньше был фулстеком, бэкендером и DevOps, руководил отделом мобильной разработки, три года преподавал iOS-разработку в GeekBrains, был деканом факультета. Состоит в программном комитете конференции Podlodka iOS Crew, ведёт<a>YouTube-канал</a>с видеоуроками по Flutter. В Twitter пишет под ником<a>@tygeddar</a>.</p>
7 <p><strong>об авторе</strong></p>
7 <p><strong>об авторе</strong></p>
8 <p>Старший iOS-разработчик во "ВКонтакте". Раньше был фулстеком, бэкендером и DevOps, руководил отделом мобильной разработки, три года преподавал iOS-разработку в GeekBrains, был деканом факультета. Состоит в программном комитете конференции Podlodka iOS Crew, ведёт<a>YouTube-канал</a>с видеоуроками по Flutter. В Twitter пишет под ником<a>@tygeddar</a>.</p>
8 <p>Старший iOS-разработчик во "ВКонтакте". Раньше был фулстеком, бэкендером и DevOps, руководил отделом мобильной разработки, три года преподавал iOS-разработку в GeekBrains, был деканом факультета. Состоит в программном комитете конференции Podlodka iOS Crew, ведёт<a>YouTube-канал</a>с видеоуроками по Flutter. В Twitter пишет под ником<a>@tygeddar</a>.</p>
9 <p>Я люблю спорить о том, какая архитектура лучше. Может, из-за своего внутреннего перфекциониста или диплома архитектора информационных систем, а может, потому, что мне лень копаться в плохих проектах.</p>
9 <p>Я люблю спорить о том, какая архитектура лучше. Может, из-за своего внутреннего перфекциониста или диплома архитектора информационных систем, а может, потому, что мне лень копаться в плохих проектах.</p>
10 <p><strong>Спойлер:</strong>больше всего я люблю архитектуру MVC. Дальше расскажу, как она работает и почему мне не нравятся всякие MVVM, MVP и VIPER. Кстати, недавно я разобрался во Flux и её имплементации Redux и понял, что их я тоже недолюбливаю.</p>
10 <p><strong>Спойлер:</strong>больше всего я люблю архитектуру MVC. Дальше расскажу, как она работает и почему мне не нравятся всякие MVVM, MVP и VIPER. Кстати, недавно я разобрался во Flux и её имплементации Redux и понял, что их я тоже недолюбливаю.</p>
11 <p>В основе статьи -<a>тред</a>автора в Twitter.</p>
11 <p>В основе статьи -<a>тред</a>автора в Twitter.</p>
12 <p>Впервые с архитектурой Model-View-Controller (MVC) я столкнулся в 2009 году, когда изучал веб-фреймворк Zend. В его документации было написано, что Model - это база данных, View - HTML-шаблон, а Controller - логика, которая берёт данные из БД, обрабатывает их, кладёт в шаблон и отдаёт страницу.</p>
12 <p>Впервые с архитектурой Model-View-Controller (MVC) я столкнулся в 2009 году, когда изучал веб-фреймворк Zend. В его документации было написано, что Model - это база данных, View - HTML-шаблон, а Controller - логика, которая берёт данные из БД, обрабатывает их, кладёт в шаблон и отдаёт страницу.</p>
13 <p>Я тогда был студентом, делал курсовые и пет-проекты. У них была сложная вёрстка и непростая структура БД, но максимально простая логика. Код получался простым, но в целом меня такой подход устраивал.</p>
13 <p>Я тогда был студентом, делал курсовые и пет-проекты. У них была сложная вёрстка и непростая структура БД, но максимально простая логика. Код получался простым, но в целом меня такой подход устраивал.</p>
14 <p>Мне не приходило в голову, что можно делать не так, как написано в документации к инструментам и в примерах на форумах. Я был счастлив и не забивал голову чепухой.</p>
14 <p>Мне не приходило в голову, что можно делать не так, как написано в документации к инструментам и в примерах на форумах. Я был счастлив и не забивал голову чепухой.</p>
15 <p>Сомневаться в своём подходе я начал из-за статей на "Хабре", где говорили, что логику нужно закладывать в модель, чтобы контроллер оставался максимально простым. Так я узнал о двух версиях MVC - с тонким и толстым контроллером.</p>
15 <p>Сомневаться в своём подходе я начал из-за статей на "Хабре", где говорили, что логику нужно закладывать в модель, чтобы контроллер оставался максимально простым. Так я узнал о двух версиях MVC - с тонким и толстым контроллером.</p>
16 <p>Я пробовал поменять логику в своём проекте - перенёс её из одного файла в другой, но разницы не заметил. По факту ничего и не изменилось, только код теперь лежал в другом файле.</p>
16 <p>Я пробовал поменять логику в своём проекте - перенёс её из одного файла в другой, но разницы не заметил. По факту ничего и не изменилось, только код теперь лежал в другом файле.</p>
17 <p>Изучая дискуссии в интернете и рассуждая самостоятельно, я понял, что "толстая" модель мне не нравится. Пусть лучше модель остаётся базой данных, а контроллер и дальше управляет логикой.</p>
17 <p>Изучая дискуссии в интернете и рассуждая самостоятельно, я понял, что "толстая" модель мне не нравится. Пусть лучше модель остаётся базой данных, а контроллер и дальше управляет логикой.</p>
18 <p>Со временем мои проекты становились всё сложнее, а контроллеры пухлее (правда, не как UIViewController в iOS). Я пробовал с этим бороться, выносил логику в сторонние файлы, которые включал в контроллеры, но это мало что меняло: архитектура сохранялась, просто код переносился из одного файла в другой.</p>
18 <p>Со временем мои проекты становились всё сложнее, а контроллеры пухлее (правда, не как UIViewController в iOS). Я пробовал с этим бороться, выносил логику в сторонние файлы, которые включал в контроллеры, но это мало что меняло: архитектура сохранялась, просто код переносился из одного файла в другой.</p>
19 Кадр: сериал "Счастливы вместе"<p>В 2013 году я пересел на Laravel, разобрался с автозагрузкой классов в PHP, начал разбираться с ООП и прочитал "Совершенный код" Стива Макконнелла.</p>
19 Кадр: сериал "Счастливы вместе"<p>В 2013 году я пересел на Laravel, разобрался с автозагрузкой классов в PHP, начал разбираться с ООП и прочитал "Совершенный код" Стива Макконнелла.</p>
20 <p>Стало ясно, что не стоит складывать всё в один файл - код и классы должны организовывать структуру, а некоторые фрагменты кода лучше убрать из MVC и выделить в самостоятельные части, которые можно переиспользовать.</p>
20 <p>Стало ясно, что не стоит складывать всё в один файл - код и классы должны организовывать структуру, а некоторые фрагменты кода лучше убрать из MVC и выделить в самостоятельные части, которые можно переиспользовать.</p>
21 <p>С этого момента я начал писать проекты по-другому. В них появились иерархии классов, которые хранили логику, а контроллер сильно похудел - он получал данные от базы, передавал их в разные пакеты, получал от них результат и отправлял на HTML-страницу.</p>
21 <p>С этого момента я начал писать проекты по-другому. В них появились иерархии классов, которые хранили логику, а контроллер сильно похудел - он получал данные от базы, передавал их в разные пакеты, получал от них результат и отправлял на HTML-страницу.</p>
22 <p>Архитектура проектов не была идеальной, потому что не подошла бы ни для одной сложной системы. Но для моих целей она была крутой и удобной: код получался читабельный, а все элементы проекта оставались довольно независимы.</p>
22 <p>Архитектура проектов не была идеальной, потому что не подошла бы ни для одной сложной системы. Но для моих целей она была крутой и удобной: код получался читабельный, а все элементы проекта оставались довольно независимы.</p>
23 <p>Следующий качественный скачок случился, когда я отошёл от веб-разработки и углубился в бэкенд. Мне пришлось проектировать и разрабатывать сложную систему управления VDS-сервером. Там были API, плагины, менеджер зависимостей для плагинов, асинхронный код, много режимов работы, связь с операционной системой и разным софтом. Основная задача проекта - чтобы у системы было ядро и самостоятельные плагины, которые бы умели работать вместе.</p>
23 <p>Следующий качественный скачок случился, когда я отошёл от веб-разработки и углубился в бэкенд. Мне пришлось проектировать и разрабатывать сложную систему управления VDS-сервером. Там были API, плагины, менеджер зависимостей для плагинов, асинхронный код, много режимов работы, связь с операционной системой и разным софтом. Основная задача проекта - чтобы у системы было ядро и самостоятельные плагины, которые бы умели работать вместе.</p>
24 <p>В сложной системе нельзя передавать все данные через один контроллер, поэтому каждый плагин отдельно реализовывал веб- и API-интерфейсы, доступ к данным и бизнес-логику, вынесенную в пакеты для переиспользования.</p>
24 <p>В сложной системе нельзя передавать все данные через один контроллер, поэтому каждый плагин отдельно реализовывал веб- и API-интерфейсы, доступ к данным и бизнес-логику, вынесенную в пакеты для переиспользования.</p>
25 <p>Получилось так: HTML ⟷ JavaScript (модели, общение с API) ⟷ API ⟷ переиспользуемые пакеты ⟷ бизнес-логика и доступ к данным. Всё это не было похоже на MVC.</p>
25 <p>Получилось так: HTML ⟷ JavaScript (модели, общение с API) ⟷ API ⟷ переиспользуемые пакеты ⟷ бизнес-логика и доступ к данным. Всё это не было похоже на MVC.</p>
26 <p>Потом я ушёл в iOS-разработку и временно перестал думать про архитектуру. Изучал UIKit, а компоненты располагал по наитию. HTML и CSS превратились в разные UIView, тонкий контроллер - в UIViewController, бизнес-логика - в сервисы.</p>
26 <p>Потом я ушёл в iOS-разработку и временно перестал думать про архитектуру. Изучал UIKit, а компоненты располагал по наитию. HTML и CSS превратились в разные UIView, тонкий контроллер - в UIViewController, бизнес-логика - в сервисы.</p>
27 <p>C MVC всё работало хорошо, но я читал и про другие архитектуры. Люди рассказывали, как MVVM, MVP или VIPER упростили им жизнь, поэтому я тоже решил их попробовать.</p>
27 <p>C MVC всё работало хорошо, но я читал и про другие архитектуры. Люди рассказывали, как MVVM, MVP или VIPER упростили им жизнь, поэтому я тоже решил их попробовать.</p>
28 <p>Когда я увидел, как это реализуют в других компаниях, то осознал несколько важных нюансов.</p>
28 <p>Когда я увидел, как это реализуют в других компаниях, то осознал несколько важных нюансов.</p>
29 <p><strong>Архитектура не даёт преимуществ.</strong>Ни одна продвинутая архитектура не была лучше того, что я делал в самом начале. За всё время я перепробовал разные подходы и поэтому мог оценить их пользу для проекта. Но между MVC и MVP не было разницы - кроме названий классов и правил вроде тех, когда элементы вызывают друг друга.</p>
29 <p><strong>Архитектура не даёт преимуществ.</strong>Ни одна продвинутая архитектура не была лучше того, что я делал в самом начале. За всё время я перепробовал разные подходы и поэтому мог оценить их пользу для проекта. Но между MVC и MVP не было разницы - кроме названий классов и правил вроде тех, когда элементы вызывают друг друга.</p>
30 <p><strong>Компании понимают архитектуру по-разному.</strong>Одни говорят, что используют MVVM, у других то же самое называется MVC. Я видел пять MVVM-систем, и все были разными. Исключение - VIPER, у которой благодаря<a>Егору Толстому</a>есть подробная документация и много примеров. Но даже там были отличия.</p>
30 <p><strong>Компании понимают архитектуру по-разному.</strong>Одни говорят, что используют MVVM, у других то же самое называется MVC. Я видел пять MVVM-систем, и все были разными. Исключение - VIPER, у которой благодаря<a>Егору Толстому</a>есть подробная документация и много примеров. Но даже там были отличия.</p>
31 <p><strong>Популярная архитектура не значит лучшая.</strong>Выбирать архитектуру из-за мейнстримности бесполезно. Кто-то решает использовать MVVM, но одни и те же компоненты кладёт в разные части проекта.</p>
31 <p><strong>Популярная архитектура не значит лучшая.</strong>Выбирать архитектуру из-за мейнстримности бесполезно. Кто-то решает использовать MVVM, но одни и те же компоненты кладёт в разные части проекта.</p>
32 <p><strong>Архитектура не спасёт проект.</strong>Сама по себе она не решает проблемы и не гарантирует успеха.</p>
32 <p><strong>Архитектура не спасёт проект.</strong>Сама по себе она не решает проблемы и не гарантирует успеха.</p>
33 <p>Я постоянно изучал архитектуры, читал книги и спорил с коллегами, несколько раз пересматривал идею MVC в языке Smalltalk и несколько раз менял к ней отношение.</p>
33 <p>Я постоянно изучал архитектуры, читал книги и спорил с коллегами, несколько раз пересматривал идею MVC в языке Smalltalk и несколько раз менял к ней отношение.</p>
34 <p>В итоге я понял, что MVC - это не три файла, и даже не несколько классов для каждого элемента. Модель - не про данные и не про бизнес-логику, а контроллер давно не нужен, и пора использовать MV.</p>
34 <p>В итоге я понял, что MVC - это не три файла, и даже не несколько классов для каждого элемента. Модель - не про данные и не про бизнес-логику, а контроллер давно не нужен, и пора использовать MV.</p>
35 <p>Приложения с бизнес-логикой и доступом к данным были и до MVC, им не хватало только пользовательского интерфейса. Главная задача MVC - связать UI со всем остальным. Единственная рекомендация от создателя - при надобности создавать для каждой View свой фасад для Model и слушать его через паттерн-наблюдатель.</p>
35 <p>Приложения с бизнес-логикой и доступом к данным были и до MVC, им не хватало только пользовательского интерфейса. Главная задача MVC - связать UI со всем остальным. Единственная рекомендация от создателя - при надобности создавать для каждой View свой фасад для Model и слушать его через паттерн-наблюдатель.</p>
36 <p>View - это и есть пользовательский интерфейс, Model - остальное приложение. Задача Controller - не быть прослойкой между V и M, а всего лишь принимать информацию от пользователя.</p>
36 <p>View - это и есть пользовательский интерфейс, Model - остальное приложение. Задача Controller - не быть прослойкой между V и M, а всего лишь принимать информацию от пользователя.</p>
37 <p>Принцип MVC - не мешать UI с бизнес-логикой, базой данных и другими частями приложения. А как это реализовать, уже пускай думает архитектор. Это не космическая инженерия.</p>
37 <p>Принцип MVC - не мешать UI с бизнес-логикой, базой данных и другими частями приложения. А как это реализовать, уже пускай думает архитектор. Это не космическая инженерия.</p>
38 <p>Важно понимать, что MVP, MVVM или VIPER не заменяют MVC, а только дополняют её. Контроллер уже не нужен, потому что за ввод данных отвечает View, это стало его неотъемлемой частью.</p>
38 <p>Важно понимать, что MVP, MVVM или VIPER не заменяют MVC, а только дополняют её. Контроллер уже не нужен, потому что за ввод данных отвечает View, это стало его неотъемлемой частью.</p>
39 <p>Получается, что MVC в Apple, MVVM и другие варианты - это MV, где контроллер убрали за ненадобностью. Из всех современных MV(x) именно MVVM больше всего похожа на каноническую MVC.</p>
39 <p>Получается, что MVC в Apple, MVVM и другие варианты - это MV, где контроллер убрали за ненадобностью. Из всех современных MV(x) именно MVVM больше всего похожа на каноническую MVC.</p>
40 <p>Все эти термины усложняют общение. Иногда сложно понять, о чём тебе говорят, хотя задача архитектуры в том, чтобы всё было проще и понятнее.</p>
40 <p>Все эти термины усложняют общение. Иногда сложно понять, о чём тебе говорят, хотя задача архитектуры в том, чтобы всё было проще и понятнее.</p>
41 Кадр: из фильма "Хищник"<p>Может показаться, что все архитектуры одинаковые, и им вообще не стоит уделять внимания. Но это не так. У меня есть несколько правил.</p>
41 Кадр: из фильма "Хищник"<p>Может показаться, что все архитектуры одинаковые, и им вообще не стоит уделять внимания. Но это не так. У меня есть несколько правил.</p>
42 <p><strong>Главное - реализация.</strong>Глобальная архитектура не так важна, как её воплощение. Всё зависит от того, как вы называете классы, где храните элементы и как классы общаются между собой. Все из команды должны соблюдать ваш стандарт, и тогда проект будет проще поддерживать.</p>
42 <p><strong>Главное - реализация.</strong>Глобальная архитектура не так важна, как её воплощение. Всё зависит от того, как вы называете классы, где храните элементы и как классы общаются между собой. Все из команды должны соблюдать ваш стандарт, и тогда проект будет проще поддерживать.</p>
43 <p><strong>Model - ваша ответственность.</strong>Архитектура MVC не даёт инструкций, как правильно написать основную часть приложения. Ваша ответственность в том, чтобы не устраивать в Model кашу, где половина классов - Service, а вторая половина - Helper.</p>
43 <p><strong>Model - ваша ответственность.</strong>Архитектура MVC не даёт инструкций, как правильно написать основную часть приложения. Ваша ответственность в том, чтобы не устраивать в Model кашу, где половина классов - Service, а вторая половина - Helper.</p>
44 <p><strong>Нужно разбираться в основах.</strong>Не стоит изучать конкретную архитектуру, лучше понять, из чего она логически следует. Тут поможет история, объектно-ориентированное и функциональное программирование, паттерны, SOLID и всё остальное. Обязательно надо прочитать "Совершенный код" Стива Макконнелла.</p>
44 <p><strong>Нужно разбираться в основах.</strong>Не стоит изучать конкретную архитектуру, лучше понять, из чего она логически следует. Тут поможет история, объектно-ориентированное и функциональное программирование, паттерны, SOLID и всё остальное. Обязательно надо прочитать "Совершенный код" Стива Макконнелла.</p>
45 <p>Когда вы разобрались с основами, можно подходить к архитектуре Flux и библиотеке Redux. Я выделил их, потому что Facebook* сформулировал подробный гайд по Flux, а также выпустил под неё библиотеку. Неожиданно, но это тоже MVC - M и V разделены, и V слушает изменения в M. Правда, тут появились дополнительные ограничения, которые все тоже трактуют по-своему.</p>
45 <p>Когда вы разобрались с основами, можно подходить к архитектуре Flux и библиотеке Redux. Я выделил их, потому что Facebook* сформулировал подробный гайд по Flux, а также выпустил под неё библиотеку. Неожиданно, но это тоже MVC - M и V разделены, и V слушает изменения в M. Правда, тут появились дополнительные ограничения, которые все тоже трактуют по-своему.</p>
46 <p>Redux - хорошая штука, но и у неё есть проблемы. Я использовал эту библиотеку в проекте, который писал и поддерживал сам. Всем компонентам старался давать правильные названия, завязывал на Store не все View, а только начальную сцену, группировал middleware и редюсеры, даже связывал их со стейтом.</p>
46 <p>Redux - хорошая штука, но и у неё есть проблемы. Я использовал эту библиотеку в проекте, который писал и поддерживал сам. Всем компонентам старался давать правильные названия, завязывал на Store не все View, а только начальную сцену, группировал middleware и редюсеры, даже связывал их со стейтом.</p>
47 <p>С какого-то момента я начал теряться в проекте. У меня появилась куча сущностей с похожими названиями и похожими данными, я создал миллиард экшенов. В итоге сам запутался, что, как и с чем взаимодействует.</p>
47 <p>С какого-то момента я начал теряться в проекте. У меня появилась куча сущностей с похожими названиями и похожими данными, я создал миллиард экшенов. В итоге сам запутался, что, как и с чем взаимодействует.</p>
48 <p>Код был расширяемый и поддерживаемый, но, если я хотел что-то изменить, приходилось править гору файлов. Это очень больно. А если учесть, что проект работал на бойлерплейтном Flutter, то боль усиливалась на порядок.</p>
48 <p>Код был расширяемый и поддерживаемый, но, если я хотел что-то изменить, приходилось править гору файлов. Это очень больно. А если учесть, что проект работал на бойлерплейтном Flutter, то боль усиливалась на порядок.</p>
49 <p>Redux хороша для больших проектов, ориентированных на офлайн, где одновременно происходит куча асинхронных неблокируемых событий. Там этот бойлерплейт стоит терпеть, потому что он спасёт вам жизнь. Но в обычном тонком клиенте лучше использовать стандартную MV и не париться.</p>
49 <p>Redux хороша для больших проектов, ориентированных на офлайн, где одновременно происходит куча асинхронных неблокируемых событий. Там этот бойлерплейт стоит терпеть, потому что он спасёт вам жизнь. Но в обычном тонком клиенте лучше использовать стандартную MV и не париться.</p>
50 <p>Настоящая архитектура - та, которая описывает ваши подходы, она должна быть понятна всей команде. Если я буду делать приложение на SwiftUI, то выберу классическую MV - ту, где View следит за Model (многие называют это MVVM). И вам рекомендую поступать так же.</p>
50 <p>Настоящая архитектура - та, которая описывает ваши подходы, она должна быть понятна всей команде. Если я буду делать приложение на SwiftUI, то выберу классическую MV - ту, где View следит за Model (многие называют это MVVM). И вам рекомендую поступать так же.</p>
51 <p>* Решением суда запрещена "деятельность компании Meta Platforms Inc. по реализации продуктов - социальных сетей Facebook* и Instagram* на территории Российской Федерации по основаниям осуществления экстремистской деятельности".</p>
51 <p>* Решением суда запрещена "деятельность компании Meta Platforms Inc. по реализации продуктов - социальных сетей Facebook* и Instagram* на территории Российской Федерации по основаниям осуществления экстремистской деятельности".</p>
52 <a>Научитесь: Архитектор ПО Узнать больше</a>
52 <a>Научитесь: Архитектор ПО Узнать больше</a>