30 May 2011

Множественное наследование в ActionScript. Язык Traits в RASE Beta 10

Adobe Flash
image

Пару дней назад мы опубликовали новую, десятую по счету бету нашей новой IDE для флэшеров. Эта статья рассказывает о языковом расширении Traits.

Action Script — современный OOP язык. На сегодняшний момент толкование OOP предполагает, что множественное наследование — это порочная практика. Средствами языка реализовать множественное наследование возможно только через интерфейсы. Это правильно и хорошо — спорить тут бессмыслено.

Но ведь хочется! Часто, из-за отсутствия возможности добавить функционал через наследование, нам, разработчикам, приходится городить уж слишком много огородов.


Например, имеем класс Creature. Мы хотим научить его говорить. “Правильный” OOP предписывает нам, что нужно делать композицию. Мы создаем интерфейс ISpeaker. Добавляем в него метод speak(); Реализуем этот интерфейс — класс Speaker. Наш класс наследуем от ISpeaker и добавляем делегата. И метод Speak переадресует вызовы методы speak() делагату. Готово.

Теперь представим, что у нас есть множественное наследование. Мы сделаем класс Speaker. И отнаследуем наш класс Creature от Speaker. Все.

А теперь представим, что наш Creature должен многое уметь: ходить, двигать руками-ногами, есть, улыбаться, плакать. Может быть, летать. Да мало ли какие требования поставит перед нами Задача. В итоге мы имеем кучу “правильного” OOP кода, который делает все настолько многословно, что понять реальное назначение этого кода становится трудно даже самому разработчику. А еще время, время.

Ну мы, бывалые, конечно, понимаем, что описанная ситуация надумана. Кто будет создавать кучу интерфейсов на каждый аспект поведения? Даже если эти аспекты нужно будет применять не только у Creature. Нет, реальный код будет выглядеть по-другому — не так красиво, не по учебному, но зато ближе к жизни. Попроще.

Вот и получается, что намерения разработчиков ECMA Script и, позже, разработчиков ActionScript, сделать хороший (правильный) OOP язык выходят нам боком в реальной повседневной работе.

Пожалуй, хватит жалоб. У нас есть инструмент, позволяющий это исправить. RASE. Realaxy ActionScript Editor. Это решение — язык traits — языковое расширение ActionScript.

Сразу практика.

Создадим новый проект в редакторе и модуль testTraits c main-классом Creature.

1.
image
2.
image
3.
image
4.
image

Импортируем язык traits — ctrl+L (cmd+L).

image

Создадим интерфейс Speak. В котором создадим один метод — “speak”.

image

В нижней части окна редактирования видим две закладки — “Interface” и “Trait”.

Выделяем закладку “Trait” (он пока подкрашен серым) и кликаем на пустое поле редактора. Появляется диалоговое окно, предлагающее нам создать трейт.

image

Выбираем “OK” и редактор создал реализацию по умолчанию.

image

Добавим тело метода “speak” — просто выведем “Hello!” на консоль.

image

Перейдем к классу Creature и добавим в implements интерфейс “Speak”.

image

Редактор добавил справа от названия интерфейса букву “i”. Это означает, что интерфейс имеет имплементацию по умолчанию — он имеет поведение trait.

image

Редактор знает, что при таком поведении методы добавлены в класс и не подсвечивает никаких ошибок.

Все. Наш Creature умеет говорить! Остается проверить это на практике. Добавим в конструктор класса вызов метода “speak()”.

image

Добавим run-configuration.

1.
image
2.
image
3.
image
4.

image

Запустим нашу флэшку. На консоли видим сообщение “Hello”.

image

Что мы получили:
  1. Код интерфейса и реализации связан “физически” — закладки в редакторе, навигация.
  2. Код организован. Реализация имеет имя — имя интерфейса плюс “Impl”.
  3. Легкость и удобство использования. В классе, где используется такое поведение, мы лишь добавляем наш интерфейс в список implemented.
  4. Отделяем мух от котлет. Код класса Creature не “замусорен” ненужными сущностями. Сказали существу “говори” и все.


Мы имеем поведение, которое действительно похоже на множественное наследование, но при этом опирается на “правильные” OOP техники.

Посмотрим как это работает. Какой код мы получаем в итоге.
“Build->Generate (obsolute)->Generate Text from Current Model”. Появилось окно “Output”. Нас интересует код класса Creature.

image

Мы видим код, который реализует классическую композицию. То есть языковое расширение trait по сути лишь прячет от нас лишне и организует артефакты кода. Но на самом деле мы имеем чистый OOP.

Теперь несложно представить, как научить наше существо любым действиям легко и удобно. Но главное — это поведение: просто, как никогда ранее, мы можем применить те же принципы для других классов.

Сделаем это. 10 минут.

image

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

image

На этом откланиваюсь и жду вопросов, предложений и комментариев.

Загрузить редактор вы можете по адресу.
Рабочий проект вы сможете получить по адресу.
Если вы новичок в редакторе, обязательно перед пробой, прочитайте статью “первые шаги” на нашем сайте или на Хабре.
Tags:RASErealaxyflashactionscriptmps
Hubs: Adobe Flash
+35
1.6k 6
Comments 30
Popular right now
Дизайнер digital
from 80,000 ₽CreativePeopleМоскваRemote job
Дизайнер интерфейсов
from 70,000 ₽IdaprojectRemote job
UX/UI дизайнер
from 40,000 to 70,000 ₽МедиасетьКостромаRemote job
Top of the last 24 hours