Чергова бета 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 є.
Завантажити проект.