Перевод статьи Била Сандерса о реализации классического мета паттерна MVC на Smalltalk-80. 

Это мой вольный перевод статьи Била Сандерса о реализации классического мета паттерна MVC на Smalltalk-80. Так как это мой первый опыт, строго не судите и в комментариях желательно оставлять какие либо замечания по тексту. Переводил не дословно, немного из русскоязычных источников накопал (:grin: и каюсь, перевёл не всё).


Предисловие

Это не введение в модель MVC, а обзор его осуществления на Smalltalk-80 для понимания первоначальных намерений и функций триады. Классическая MVC поможет лучше понять последующее развитие паттернов, которые появились позже. Посмотрим, как простое MVC приложение работает в Smalltalk-80 и изучим как оно может быть реализовано на языке ActionScript.

Model-view-controller (MVC, «Модель-представление-поведение», «Модель-представление-контроллер») — архитектура программного обеспечения, в которой модель данных приложения, пользовательский интерфейс и управляющая логика разделены на три отдельных компонента, так, что модификация одного из компонентов оказывает минимальное воздействие на другие компоненты.

Реализация Model-View-Controller в Smalltalk-80.

Модель MVC облегчает разделение ответственности при разработке интерактивных графических приложений. Логика и состояние приложения, как пользователи взаимодействуют с приложением, и как состояние приложения представляется пользователю по средствам отдельных элементов триады MVC. Smalltalk-80 использует метафору MVC, что обеспечивает встроенную поддержку для интерактивной разработки приложений.

Идея заключалась в том, чтобы обеспечить набор встроенных компонентов пользовательского интерфейса, таких как кнопки, меню и списки, которые могут быть подключены к GUI приложения. Для эффективного использования этих встроенных элементов интерфейса, реализация должна была быть построена в соответствии с MVC. Давайте посмотрим на концептуальную диаграмму приложения Smalltalk-80.


:point_up:Диаграмма MVC в Smalltalk-80 (Krasner & Pope)


Диаграмма MVC в Smalltalk-80 (Krasner & Pope) Все объекты в Smalltalk общаться друг с другом при помощи сообщений, которые является способом вызова методов объекта. На первый взгляд, диаграмма MVC кажется немного странной. Model-View и Controller-Model имеют зависимости направленные в обе стороны. Вторым интересным аспектом было то, что пользовательский ввод идет непосредственно через контроллер. Это является существенным изменением, как правило мы ожидаем от пользователя взаимодействия с элементами интерфейса в представлении (View), а не в корнтроллере.

В Smalltalk-80, все данные с устройства ввода подаются непосредственно в контроллер. Давайте кратко рассмотрим, как MVC поддерживается в Smalltalk-80.


MVC классы в Smalltalk-80.

Есть три абстрактных класса называемые Модель, Вид и Контроллер. Все конкретные реализации модели, вида и контроллера должны иметь подклассы этих абстрактных суперклассов. Давайте взглянем на классы (это сокращенное описание — см. Krasner & Pope).

  • Модель: абстрактный суперкласс Model реализует общую модель поведения. Он реализует механизм зависимости обслуживания.

Вид может зарегистрироваться на конкретную модель чтобы стать подписчиком и получать оповещения об изменениях. Если конкретная модель рассылает свои сообщения, то они будут автоматически отправлены всем своим подписанным представлениям. Это реализация паттерна Наблюдатель (паттерн поведения объектов). Конкретная модель напрямую не знает о зависимых от него представлениях.

  • Представление: абстрактный суперкласс View реализует общие поведения представления. Встроенный набор компонентов подкласса представления (например, StandardSystemView — стандартное окно и TextEditorView — текстовый редактор).

Представления могут быть вложенными для разработки сложного пользовательского интерфейса. Например, StandardSystemView (т.е. окна) содержит компонент представления, называемые TextEditorView. Каждое представление может иметь одну модель и один контроллер. Встроенный компоненты по умолчанию имеют заранее определенный класс контроллера для реализации своего стандартного поведения. Чтобы создать экземпляр компонента, вам нужно настроить свою модель и отобразить компонент. Компонент затем будет инициализировать по умолчанию контроллер со своим экземпляром модели и регистрироваться в ней для получения сообщений. При закрытии компонента, освобождаются все вложенные компоненты. Когда представление освободилось, оно удаляет свои подписки на сообщения из модели. Если вы хотите чтобы компоненты имели своё уникальное поведения, вы можете создать свой контроллер для него.

  • Контроллер: абстрактный суперкласс Controller реализующий общие поведения. Каждый контроллер имеет ссылку на одну модель, один контроллер, и глобальную переменную называемую сенсор, который предоставляет интерфейс взаимодействия для устройств ввода (мышь, клавиатура). Абстрактный класс контроллера реализующий его общие поведения для определения уже конкретного контроллера и соответствующего ему представления. Если конкретное представление является активным (которое в данный момент использует пользователь), то егоконтроллер осуществляет управление всего пользовательского ввода.

Контроллер должен иметь прямую ссылку на представление, например для того чтобы знать расположен ли сейчас курсора мыши над конкретным представлением. Важно отметить, что только контроллеры, а не представление, получает информацию о вводе данных (с клавиатуры или мышки).


Ключевые особенности реализации MVC на Smalltalk-80:

  • представления могут быть вложенными;
  • каждый встроенный компонент (например ListBox) это представление;
  • каждый вид имеет соответствующий контроллер;
  • контроллер осведомляет своё представление, если оно активно;
  • активные контроллер (чье представление в данный момент активно) получает данные которые изменил пользователь при помощи устройств ввода;
  • контроллер может обновить представление (компонент) на основе действий пользователя;
  • контроллер изменяет модель на действий пользователя;
  • представление обновляет себя пир помощи наблюдателя, синхронизированного с моделью.