Andriy Shyrokoryadov

.Net developer, data scientist

Команда. Шаблоны проектирования - видео №11. №69.

Текст к видео "#69 Команда" на канале YouTube

Всем привет!

Сегодня мы поговорим о шаблоне проектирования «Команда». «Команда» как действие, которое необходимо выполнить. Если представить себе графический интерфейс пользователя, то можно сказать, что любое нажатие кнопки в приложении – будь то обычное приложение Windows или веб-интерфейс – это всегда выполнение какой-то команды. Пользователь нашего приложения хотел бы выполнить какое-то действие, то есть нажимает определенную кнопку и тем самым даёт команду на выполнение. Я думаю, эта аналогия понятна. Однако в реальном мире не всё идеально. Если вы посмотрите на большинство приложений, особенно старых, то в таких приложениях добавлен обработчик событий «Нажата кнопка». Пользователь наживает кнопку, вызывается событие «Нажата кнопка» и всё, что было подвязано под это событие, начинает выполняться. Было бы неплохо иметь какой-то общий интерфейс, который можно было бы имплементировать по-разному, но интерфейс пользователя оставался неизменным. Речь идет о каком-то шаблоне проектирования как Model – View – Controller. Такой шаблон есть. Правда в нём нет части Controller. Называется он Model – View - ViewModel. Здесь как и раньше у нас определена структура данных в виде части Model, далее у нас определен слой интерфейса пользователя – View и, наконец, третья часть ViewModel , которая связывает слой интерфейса пользователя со структурой данный. Стоит заметить, что естественно эти 3 слоя приложения ничего не должна знать друг от друге, единственное исключение – это когда View зависит от ViewModel, а ViewModel в свою очередь зависит Model. В большом упрощении можно сказать, что ViewModel это слой в котором к модели добавляется бизнесс-логика, которая имеет свое отражение на слое графического интерфейса пользователя, но, как уже было сказано, не бинесс логика, не слой графического пользователя о своем существовании не знают. Такая изоляция слоев приложения, позволяет вносить изменения в эти слои без боязни затронуть и испортить другие слои.

Концепция Model – View – ViewModel возникла как ответ на решение задачи кода крепко связанного с со слоем графического интерфейса пользователя. Если вы работали со старыми приложениями Windows – Windows Forms, WPF, Web Pages – то там есть возможность размещать код, в так называемом code-behind. Как правило эти приложения написаны криво и протестировать логику в code-behind очень сложно, иногда невозможно. А если что-то нельзя протестировать, то скорей всего это что-то могло бы быть написано лучше.

Как уже было сказано, в слое ViewModel у нас находится бизнесс-логика. Эту логику нужно было бы привязать к графическому интерфейсу пользователя. Для этого используется специальный механизм связывания. По логике вещей мы должны привязать к кнопкам какой-то метод, однако мы не можем сделать привязку для любого метода. Чтоб это сделать мы должны представить наш метод, как часть определенного интерфейса и таком интерфейс нам предлагает шаблон проектирования «Команда».

Как работает шаблон «Команда» - с одной стороны у нас есть определенный элементы графического интерфейса пользователя, например кнопка, а с другой стороны у нас есть некоторая логика, которую необходимо выполнить, когда будет нажата кнопка. «Команда» — это то, что будет между нашей кнопкой и логикой. Такой себе посредник. Что дает этот посредник? Мы можем при помощи этого посредника изменять бизнес-логику не затрагивая графический интерфейс. Вы можете, конечно, сказать – можно привести методы бизнес-логики к одному интерфейсу и этот интерфейс подвязать к кнопке. Да, это возможно. Но иногда это невозможно и тогда нам на помощь приходить шаблон «Команда». Как это выглядит – посмотрим на практическом примере.

Если данное видео было вам полезно, я буду благодарен за лайк, подписку, комментарий. Спасибо за внимание и до новых встреч.

Пример кода из видео на GitHub

Для открытия файла проекта необходимо Visual Studio 2019.