Как сделать OneScript объектно-ориентированным

16.04.17

Разработка - OneScript

Описание метода создания объектов на OneScript и метода передачи функции в качестве параметра.

Когда-то, еще в 90-ых годах, вынуждено перейдя с Delphi на FoxPro 2.6 (работает в консоле под DOS), в связи необходимостью по работе переписывать большой чужой проект для компании, я решил сделать FoxPro 2.6 объектно ориентированным. Для того, чтоб реализовать псевдообъектно ориентированность я использовал массивы строк, в которых записывал методы в виде строки. Это выглядело примерно так Массив[4] = "myfunc()", а при вызове данного метода так &Массив[4]. Теперь, занявшись языком OneScript,  я понял, что могу повторить этот фокус. Как потом оказалось, повторение получилось более успешным, так как мой метод создания объектов в OneScript позволяет делать приватные свойства и приватные методы. К тому же, созданный налету программно, объект единожды проходит процедуру компиляции перед загрузкой, что, по сравнению с интерпретатором FoxPro, ускоряет выполнение кода. FoxPro каждый раз производит интерпретацию кода для выполнения. 

Для реализации объектно ориентированнности я использую функцию "ЗагрузитьСценарий()", но перед этим программно формирую файл сценария. Если в этом сценарии пишу "Перем Моя экспорт", то это общедоступная переменная, а если тоже самое пишу без слова "экспорт", то приватная. Если в сценарий вставляю строку

Функция Мояфункция() экспорт Возврат 2*2; КонецФункции

, то это общедоступная функция, а если без слова "экспорт", то приватная. Создание файла, для которого я придумал расширение "osm", так как это внешний модуль и его подключение через функцию "ЗагрузитьСценарий", я реализовал в одной функции, которую назвал "СоздатьООПОбъект" (см.библиотеку UfaScript).  Все это заработало, но кроме этого надо реализовать механизм наследования объектов, желательно реализовать особую функцию "конструктор", в которой можно инициализировать переменные объекта.

Для реализации конструктора достаточно в короткой функции "СоздатьООПОбъект" реализовать автозапуск функции с ключевым именем "конструктор". А для наследования пришлось сначала написать спец функцию "СоздатьНаследникаООПОбъекта", но так как список описания переменных и функций для объекта я реализовывал в виде строкового массива, то понял, что удобнее производить сборку итогового массива из двух при реализации механизма наследования, а массивы с перечнем переменных и функций называть образами объекта. Потому от функции "СоздатьНаследникаООПОбъекта" я отказался, заменив ее функцией "СоздатьООПОбъектИзМассива", благодаря которой я могу создать массив для объекта из цепочек массивов родителей.

Я реализовал, чтоб базовые переменные "ИмяОбъекта" - строковое имя объекта, "Родитель" - строковое имя родителя объекта, "UfaScript" - указатель на библиотеку "UfaScript", "НашОбъект" - указатель на созданный объект, вставлялись автоматически при использовании функции "СоздатьООПОбъект". Затем создал образ объекта "ОбразОбъектБазовый", в котором еще предопределил переменные "Экран" - указатель на экран, куда вставляется объект (экран - это указать на обычный массив с объектами, которые надо изобразить на экране), "Индекс" - указатель на порядковый номер объекта в массиве Экран, "ТипОбъекта" - просто номер типа, чтоб определять возможности объекта.  Затем начал создавать образы нужных объектов в виде функций, заполняющих массивы строк родительскими  переменными и методами, а так же добавляющими строки с переменными и методами текущего объекта. При создании нового итогового массива для объекта таким слиянием массивов, я произвожу сортировку, чтоб записи с  ключевым словом "Перем " были вначале.

Но этого механизма недостаточно, так как нужно еще обеспечить переопределение методов в объектах потомках. Для реализации всех возможностей нужного мне переопределения, я понял, что достаточно двух управляющих команд: "#Удалить" и "#Переименовать". Первая удаляет ненужный метод у родителя, а вторая переименовывает метод. Теперь у программиста появилась возможность удалить любой метод в массиве родителя и затем, если надо, определить  новый метод с таким же именем. Так же благодаря возможности переименовать любой метод, можно в любом месте тела функции нового метода вызывать старый переименованный метод родителя.

Все вышесказанное позволяет создавать полноценные объекты на OneScript и заявить, что теперь OneScript является объектно ориентированным языком программирования.

Дополнительно, в качестве бонуса, для тех кто дочитал до конца данную статью, я расскажу, как я реализовал механизм передачи функции в качестве параметра в OneScript.  Механизм передачи функции в виде параметра реализован двуми короткими функциями: ВызватьФункцию(Функ,Где)", где параметр "функ" - это строка с текстом вызова функции, а параметр "где" - это указатель на модуль, в  котором располагается вызываемая функция, "ВыполнитьКодИзМассива" - которая исполняет созданный код и возвращает результат выполнения через метод "Результат". В итоге передача функции в качестве параметра будет выглядеть так:

Сообщить("12) "+U.ВызватьФункцию("Итог(7)",ЭтотОбъект).Результат());

Как видно, из текста в функцию можно передавать любые параметры, но, возможно, придется писать так:

Сообщить("12) "+U.ВызватьФункцию("Итог("+Парам+")",ЭтотОбъект).Результат());

Потому что вызов данной функции будет происходить во внешнем модуле, созданном программно. А можно так:

Сообщить("12) "+U.ВызватьФункцию("Итог(ТотОбъект.Парам)",ЭтотОбъект).Результат());

Это возможно, так как в указатель "ТотОбъект" попадает ссылка на "ЭтотОбъект" с вызывающего модуля. Этот вызов лучше, так как позволит передать функции указатель на массив или другой объект. Теперь можно сказать, что OneScript - это не только объектно-ориентированный язык программирования, но так же язык, который поддерживает передачу функций в качестве параметра. Все это открывается большие возможности для программистов на OneScript. По сути, OneScript теперь - это уникальный язык программирования, который является гибридом интерпретатора с компилятором, тот язык, который я давно искал для реализации своих идей.

Он позволяет легко менять код программно, по ходу выполнения программы. Польза от этого несомненна. Не все пока понимают потенциал данного проекта. И возможно, что сам автор проекта OneScript не понимает этого.  Кроме того, OneScript - это руссифицированный язык, который, на мой взгляд, должен стать стандартом для  преподавания в нашей стране вместо устаревшего языка программирования "Паскаль", так как он более легок для освоения и обладает большими возможностями, к тому же реализован в стиле популярного языка програмирования 1С. Свою библиотеку UfaScript и примеры ее использования я выкладываю на https://github.com/andreosh/UfaScript Пользуйтесь хорошим и сами создавайте лучше, так как данные идеи можно реализовать иначе и, возможно, более эффективно. Конкуренция идей способствует развитию.                                        16.04.2017 Ошнуров Андрей Михайлович г.Уфа

ООП OneScript 1Script

См. также

OneScript Программист Бесплатно (free)

Отгремел Infostart Tech Event 2024, топовое событие в мире 1С-разработки, традиционно проходящее в Санкт-Петербурге. Ваш покорный слуга в этот раз отмечал там 10-летний юбилей проекта OneScript. Отмечание проводилось в форме игры-соревнования по забегу роботов в лабиринте. Участники пытались написать алгоритм движения робота на языке 1С и сделать это быстрее других. О том, как это было – под катом.

28.10.2024    1402    Evil Beaver    11    

24

OneScript Программист Бесплатно (free)

OneScript – это скриптовый движок для автоматизации всего и вся. О том, как OneScript помогает в разработке скриптов на языке 1С, пойдет речь в статье.

10.10.2024    2338    ardn    1    

6

Инструментарий разработчика OneScript Программист Руководитель проекта Бесплатно (free)

Все мы хотя бы раз работали с конструктором запросов. Результатом его работы является синтаксически верный запрос, оформленный по некоторому стандарту. Нравится - не нравится, а привыкаешь быстро, и на запрос, написанный руками, уже не хочется смотреть... А почему бы не попробовать сделать то же самое с исходным кодом 1С? Ну я и попробовал...

23.09.2024    610    0    stopa85    4    

5

Групповая разработка (Git, хранилище) OneScript Программист Платформа 1С v8.3 Бесплатно (free)

Скрипт для работы с SonarQube и локальным репозиторием Git.<br> Цель проекта – возможность выполнить быструю проверку качества кода перед тем, как помещать доработки в рабочее хранилище. В Sonar и Git выгружается не вся конфигурация, а только объекты из заданного списка.<br> https://github.com/vkrivov/go/

02.07.2024    3506    vkrivov@yandex.ru    8    

19

DevOps и автоматизация разработки OneScript Системный администратор Программист Стажер Бесплатно (free)

Рассмотрим создание самоформирующейся документации через комментарии и соглашения: как это сделать и зачем, с описанием полного цикла от исходников конфигурации до странички в интернете

17.06.2024    5207    bayselonarrend    5    

61

OneScript Программист Стажер Бесплатно (free)

Поговорим про меню, спиннеры, прогресс-бары и прочие свистелки для CLI приложений на OneScript

20.05.2024    2903    bayselonarrend    18    

70

Групповая разработка (Git, хранилище) OneScript Системный администратор Программист Бесплатно (free)

Сегодня мы посмотрим на Github Actions - встроенный инструментарий Github для автоматизации рабочих процессов. Разберем, что это такое, зачем и причем тут OneScript.

25.03.2024    2623    bayselonarrend    3    

42

DevOps и автоматизация разработки Групповая разработка (Git, хранилище) OneScript Системный администратор Программист Платформа 1С v8.3 Бесплатно (free)

Продолжение истории с прокси хранилища, но уже не на HTTP, а на TCP и без падений по памяти веб-сервера. Проверяем комментарии хранилища, вызываем веб-хуки, старты пайплайнов, gitsync по событию помещения версии в хранилище. И все это полностью на знакомом и понятном OneScript.

17.01.2024    5424    kamisov    23    

65
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. dmpas 418 17.04.17 11:07 Сейчас в теме
2. andreosh 103 17.04.17 11:16 Сейчас в теме
(1) Код с комментариями на https://github.com/andreosh/UfaScript. С кодом статья получится большая не все осилят.
3. TODD22 19 17.04.17 11:30 Сейчас в теме
(2) Ещё шрифт замените в статье на более читаемый. И вообще как то надо разредить... Больше параграфов... может код, примеры небольшие...
nvv1970; CyberCerber; корум; gortol; kuzyara; json; troubleshooter; Fragster; ixijixi; +9 Ответить
4. troubleshooter 27 17.04.17 18:16 Сейчас в теме
Да, со шрифтом перебор. И не хватает наглядного представления того, что происходит. Может схемы какие.
nvv1970; корум; gortol; +3 Ответить
5. ltfriend 06.06.17 08:29 Сейчас в теме
Выбрав такой шрифт, вы решили поиздеваться над теми, кто будет это читать?
nvv1970; корум; +2 Ответить
6. корум 288 06.06.17 09:36 Сейчас в теме
(5) именно эта цель и достигнута
7. v3rter 06.06.17 10:20 Сейчас в теме
Полиморфизм и комик санс )

Мало кто из программистов одинаково хорошо владеет классическими методами программирования и объектно-ориенторованными. Собственно, само ООП изнутри так и выглядит - в структуре данных (участке памяти) вместе с типом объекта и его свойствами хранятся также ссылки (адреса вызовов) на его методы, а поскольку хранятся вместе, то, копируя блок данных, мы копируем и ссылки, получая наследование, подменяя - получаем полиморфизм. Икапсуляция же выходит побочным эффектом, так как "снаружи" на объекте "не написано" где какие данные и ссылки хранятся.
kote; CyberCerber; +2 Ответить
Оставьте свое сообщение