Как сделать 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 Программист Платформа 1С v8.3 Россия Бесплатно (free)

Графический интерфейс с применением веб-технологий в коллекцию инструментария сценарного языка OneScript. Библиотека создает десктопное приложение имеющее декларативный пользовательский интерфейс (GUI), построенный веб-браузером. Возможности веб-технологий по представлению информации огромны. Эти возможности соответственно добавляются и к сценариям OneScript.

23.01.2025    404    0    ahyahy    4    

8

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

Вместе создадим библиотеку на Oscript с нуля, шаг за шагом: от базовой структуры проекта до перевода на ОСень. Разберем структуру проекта, работу с файлом конфигурации, логирование, уведомления, консольный интерфейс и многое другое. Освоим весь цикл разработки и сделаем первый шаг к созданию собственных инструментов на Oscript!

13.01.2025    2322    leobrn    16    

57

OneScript Программист Платформа 1С v8.3 Бесплатно (free)

Если вы, так же как и я, давно хотели попробовать сделать что-то свое на OneScript, но никак не могли к нему подступиться, то, возможно, эта статья пригодится вам в качестве некоего вводного материала.

10.01.2025    2076    KamranV21    12    

38

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

В мире OneScript давно существуют библиотеки для облегчения работы с каким-либо классом программного обеспечения, например v8runner - помощник выполнения команд конфигуратора или gitrunner - программная обертка для запуска команд git. Есть библиотека и для работы с автономным сервером 1с. Однако библиотеке ibcmdrunner уже три года, а про нее нет ни одной публикации на инфостарте. Исправляю эту несправедливость.

09.01.2025    1368    ardn    0    

22

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

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

28.10.2024    1771    Evil Beaver    11    

25

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

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

10.10.2024    4223    ardn    2    

9

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

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

23.09.2024    854    0    stopa85    5    

5

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

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

02.07.2024    5305    vkrivov@yandex.ru    8    

20
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. dmpas 418 17.04.17 11:07 Сейчас в теме
2. andreosh 103 17.04.17 11:16 Сейчас в теме
(1) Код с комментариями на https://github.com/andreosh/UfaScript. С кодом статья получится большая не все осилят.
3. TODD22 20 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 Ответить
Оставьте свое сообщение