Как сделать 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

См. также

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

Когда в компании используется более 500 внешних обработок для 20 различных баз, процесс их параллельной разработки превращается в борьбу. Расскажем о тернистом пути от ручных скриптов к масштабируемой DevOps-системе, позволяющей централизованно управлять внешними обработками, автоматизировать сборки, интегрироваться с таск-трекером, запускать автотесты и разворачивать окружение в пару кликов.

12.08.2025    3560    untru    13    

21

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

В 2024 году главному инструменту DevOps в 1С исполнилось 10 лет. Расскажем о том, что представляет собой экосистема 1Script в 2024 году и почему её важно включить в свой рабочий процесс.

16.06.2025    5949    Evil Beaver    43    

58

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

В данной публикации рассматривается пример реализации скрипта, который автоматизирует получение ветки из GIT репозитория и обновление конфигурации, если разработка проекта ведется в EDT.

11.06.2025    2632    AlexF1    4    

7

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

Библиотека для работы с базами MySQL на основе внешней компоненты. Для Linux и Windows, бесплатно и с открытым исходным кодом!

08.04.2025    4324    bayselonarrend    27    

49

Внешние источники данных OneScript Программист Стажер 1С v8.3 Бесплатно (free)

Библиотека для работы с базами PostgreSQL на основе внешней компоненты. Для Linux и Windows, бесплатно и с открытым исходным кодом!

20.02.2025    5695    bayselonarrend    30    

47

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

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

23.01.2025    1388    0    ahyahy    15    

11

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

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

13.01.2025    4535    leobrn    16    

60

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

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

10.01.2025    4135    KamranV21    13    

41
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. dmpas 419 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 Ответить
Оставьте свое сообщение