Мовні розширення RASE. Перевантаження операторів у Ac  Script

Чергова бета Realaxy Ac^ Script Editor містить кілька нових мовних розширень. Ми вже розповіли про мову Traits, що дозволяє використовувати переваги множинного спадкування, тепер же звернемося до іншої, не менш важливої можливості - перевантаження і створення операторів.


Завантажити редактор можна тут.

Якщо ви ще не знайомі з RASE - обов'язково прочитайте ввідну статтю.

Під час написання статті в збірці 8144 було виявлено. Якщо ви завантажили RASE beta 10 раніше 8 червня, то обов'язково завантажте свіжу версію.

Одна з основних фіч, доданих в RASE beta 10 - це перевантаження операторів.

Дана можливість, як і множинне спадкування, є об'єктом суперечок серед послідовників різних парадигм програмування.

Доводами в користьзу перевантаження операторів є компактність і природність.

Компактність - a * b * c або a.multiply (b) .multiply (с).

Природність - при складанні декількох змінних простіше уявити знак додавання, а не виклик методу. Наприклад, складаючи дві змінні типи Point, ми очікуємо побачити «point1 + point2», а не «point1.plus (point2)».

Противники перевантаження операторів вказують на втрату контролю над кодом. Не завжди зрозуміло, де оператор перевантажений, а де ні. Перевантаживши оператор, ми змінюємо поведінку існуючого коду - і тут можуть бути несподівані ефекти.

Немає перевантаження операторів у Ac^ Script (ECMA3). Але вони присутні в доступній на даний момент специфікації ECMA4. Перевантаження немає в Java, але воно є в Groovy («Java c цукром») і Scala. Є можливість перевантаження і в C #.

Ми не беремося стверджувати, наскільки добре чи погано перевантажувати оператори. Однак не викликає сумнівів, що в деяких випадках використання цієї можливості дійсно необхідне. Наприклад там, де код містить багато математичних операцій. Він буде виглядати рази компактніше при використанні операторів, а не викликів методів. А компактність, найчастіше, - це більший контроль.

Закінчимо з теорією, і перейдемо до практики.

У 10 беті редактора Realaxy Ac^ Script Editor (RASE) з'явилася мова overloadedOperators. Додати таку мову (як і будь-яку іншу) до свого проекту легко - потрібно лише натиснути комбінацію клавіш «ctrl + L».

До речі, overloadelOperators RASE - це порт мови overloadedOperators з платформи MPS. Ми вирішили не винаходити велосипед і, вивчивши предметну область, прийшли до висновку, що рішення з MPS-платформи самодостатньо і задовольняє всім нашим потребам. Однак ми додали деякі «смаколики» від себе.

Ми вважаємо, що це правильний шлях для LOP - брати найкраще з інших мов і пристосовувати для своїх потреб. Але про це пізніше, в наших статтях про створення мовних розширень.

Створимо проект і модуль для нашого проекту. У головному класі модуля додамо код для тестування.

У цьому коді ми створили дві змінні - p1 і p2 з типом Point, і хочемо отримати змінну p3, яка є результатом складання двох цих точок.

Далі ми виводимо на консоль значення всіх змінних: p1, p2, p3. Для формування рядкового повідомлення косолі ми скористалися виразом values з мови logging.

Наш код має повідомлення про помилку - «Operation can't applied to these operands». Компіляція неможлива.

Тепер створимо декларацію перевантаження операторів.

Імпортуємо мову overloadedOperators.

І додаємо новий рут «OverlodedOperatorsContainer». Права кнопка на пакунку і вибрати зі списку.

Назвемо його «MyOperators»

Всередині ми бачимо два блоки для додавання декларацій - «overloaded binary operators» і «custom operators declarations». Встановлюємо курсор на перший блок і натискаємо ENTER. Додано нову декларацію оператора.

Вибираємо оператор «+» і призначаємо тип Point для лівої і правої частини. Встановлюємо значення Point (змінюємо void на Point).

Тепер додамо код, який буде виконано, якщо ми будемо використовувати оператор додавання і в правій і лівій частині у нас будуть змінні типу Point.

І це все. Переходимо в наш клас, туди, де ми написали текстовий код - і бачимо, що червоного коду більше немає.

Запустимо компіляцію. Створимо run-configuration для нашого модуля.

Якщо ми ще цього не зробили встановимо main-class.

На консолі ми бачимо повідомлення:

Тепер зробимо більш складний приклад і перевизначимо операції віднімання, множення ділення. Причому як на Number так і на Point.

Уявімо, що у нас є завдання обчислити точку, що знаходиться вліво-вниз на 50 пікселів від центру відстані між двома точками.

або ще простіше:

Все дуже просто. Але не будемо забувати, що в реальному житті флешера це буде виглядати так:

Думаємо, що дві попередні ілюстрації самі по собі є аргументом до використання перевантажених операторів у флеш-проектах.

Тепер навчимося створювати свої оператори.

Перейдемо в декларації наших операторів «MyOperators» і перемістимо курсор на «custom operators declarations». Додамо декларацію натиснувши «Enter». Вкажемо візуальну виставу - «ауд =»

Наш оператор повинен перевіряти рядок на відповідність формальному виразу.

Опишемо поведінку нашого оператора. Додамо нове перевантаження - звичайну декларацію перевантаження, як раніше для Point, але в списку автокомпліту виберемо наш оператор. Лівий операнд повинен приймати рядок, а правий повинен приймати значення типу Regexp. Результатом роботи нашого оператора буде Boolean. Додамо код, який виконує наш оператор - виклик «test» у Regexp.

Створимо тестовий блок коду в класі Main.

Просто і зручно.

Щоб не заплутатися в нових операторах, на рівні редактора їх використання пов'язане з декларацією за допомогою навігації. Ctrl + B або Ctrl + Click на операторі - і ми переходимо в декларацію. Також можна визначити, що оператор перевантажений, якщо навести курсор на оператор і натиснути Ctrl.

На Mac - Ctrl змінюється на Command, звичайно.

Тепер навчимо наш оператор нової поведінки - «commutative».

Поставимо курсор і виберемо операцію «Flip Binary Operation». Права і ліва частина помінялася місцями. У коді з'явилася помилка: редактор не знає про оператора з такими операндами.

Переходимо в декларацію оператора. І встановлюємо «commutative» - true.

Повертаємося - код перестав бути червоним (іноді потрібно натиснути F5, щоб код оновився).

Тобто наше «commutative» - це, по суті, старе добре правило про суму, яка не змінюється при зміні місць доданків.

OOP гуру рекомендують користуватися такою поведінкою обережно. Тут можуть бути несподівані ефекти. Повіримо на слово і відкладемо собі в пам'яті на майбутнє.

Все, перевантаження операторів в Ac^ Script є.

Завантажити проект.

COM_SPPAGEBUILDER_NO_ITEMS_FOUND