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

Публикация № 611221

Разработка - Языки и среды - OneScript

ООП OneScript 1Script

Описание метода создания объектов на 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 Ошнуров Андрей Михайлович г.Уфа

Специальные предложения

Комментарии
Избранное Подписка Сортировка: Древо развёрнутое
Свернуть все
1. baton_pk 401 17.04.17 11:07 Сейчас в теме
2. andreosh 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; SerebanSK; Fragster; the1; +9 Ответить
4. SerebanSK 26 17.04.17 18:16 Сейчас в теме
Да, со шрифтом перебор. И не хватает наглядного представления того, что происходит. Может схемы какие.
nvv1970; корум; gortol; +3 Ответить
5. ltfriend 500 06.06.17 08:29 Сейчас в теме
Выбрав такой шрифт, вы решили поиздеваться над теми, кто будет это читать?
nvv1970; корум; +2 Ответить
6. корум 311 06.06.17 09:36 Сейчас в теме
(5) именно эта цель и достигнута
7. v3rter 06.06.17 10:20 Сейчас в теме
Полиморфизм и комик санс )

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

См. также

Swagger для 1С.

OneScript WEB Бесплатно (free)

Решение для формирования Swagger спецификаций, описывающих HTTP сервисы конфигураций 1С.

21.10.2019    10241    0    botokash    35    

Автоматическое сравнение-объединение баз данных с мини-конфигурацией

OneScript v8 Бесплатно (free)

Представляю вашему вниманию скрипт на OneScript для автоматического сравнения-объединения по правилам ("мержевания") конфигураций нескольких баз с мини-конфигурацией.

14.10.2019    2628    0    artkor    2    

АИТП. Подсистема взаимодействия с рабочими серверами OneScript

OneScript v8 Бесплатно (free)

В статье описан механизм взаимодействия конфигурации АИТП с рабочими серверами OneScript.

22.05.2019    4893    0    blackhole321    33    

1Script.Web. Интернет-приложения на языке 1С

WEB OneScript Инструментарий разработчика v8 Бесплатно (free)

Запросы рынка таковы, что любое современное клиент-серверное приложение должно иметь веб-интерфейс. Почему бы не писать такие приложения на языке 1С? Андрей Овсянкин расскажет о возможностях разработки веб-приложений на базе 1Script, рассмотрит перспективы этого направления и в качестве демонстрации покажет «боевое» веб-приложение на новом движке – кроссплатформенную консоль администрирования парка кластеров 1С.

20.05.2019    18493    0    Evil Beaver    33    

Создание высокодоступной фермы рабочих серверов OneScript в ОС Centos 7

OneScript Бесплатно (free)

В статье описана методика создания высокодоступной фермы рабочих серверов OneScript, для конфигурации АИТП.

14.05.2019    4216    0    blackhole321    0    

Разворачиваем рабочий сервер OneScript для конфигурации АИТП

OneScript v8 Бесплатно (free)

В статье описана методика развертывания рабочего сервера OneScript для конфигурации АИТП, на ОС CentOS 7.

09.05.2019    5749    0    blackhole321    0    

Хостим OneScript.Web приложение (heroku)

OneScript Бесплатно (free)

Развертывание oscript.web в heroku.

19.12.2018    5962    0    pallid    6    

Хостим OneScript.Web приложение

OneScript Бесплатно (free)

Удобная возможность для размещения своего OneScript.Web приложение, это завернуть его в docker. Остается вопрос: где разместить контейнер, сделать это можно на vscale или DO, но хочется упростить и не делать установку самого docker на хосте. Один из вариантов - это сервис now https://zeit.co/.

04.07.2018    7420    0    pallid    3    

Добавляем онлайн-чат в web-приложение OneScript

OneScript v8 Бесплатно (free)

В статье рассмотрено подключение онлайн-чата к web-приложению на основе http-сервисов OneScript

24.06.2018    7151    0    blackhole321    1    

Сказ про то, как я DevOps-ом занимался (OneScript, Deployka, Jenkins)

OneScript DevOps Jenkins v8 1cv8.cf ИТ-компания Бесплатно (free)

Решаем задачу: автоматизировать обновление тестовых баз 1С из хранилища конфигурации при появлении в нём новых изменений. Данная статья родилась в муках хождения по граблям и поиска безопасного форватора среди подводных камней. Изложение постарался представить в виде инструкции для новичка, в которой собрал всё, с чем пришлось столкнуться. Сам я не DevOps-ер, ни на что не претендую, просто делюсь опытом :)

17.06.2018    20471    0    stas_ganiev    34    

Макеты в http-сервисах OneScript

OneScript v8 Бесплатно (free)

В статье описана библиотека, реализующая механизм макетов в http-сервисах OneScript, аналогично платформе 1С:Предприятие.

03.06.2018    7967    0    blackhole321    1    

Перечисления в http-сервисах OneScript

OneScript v8 Бесплатно (free)

В статье описывается библиотека, реализующая механизм перечислений в http-сервиах OneScript, аналогичный механизму платформы 1С:Предприятие

03.06.2018    7611    0    blackhole321    13    

Обработки в http-сервисах OneScript

OneScript Бесплатно (free)

В статье описана библиотека, реализующая механизм обработок в http-сервисах OneScript.

25.05.2018    7308    0    blackhole321    0    

Расширенные методы загрузки внешних библиотек в http-сервисах OneScript

OneScript Бесплатно (free)

В статье описаны расширенные методы загрузки внешних библиотек в http-сервисах OneScript на примере механизма фоновых заданий.

25.05.2018    7208    0    blackhole321    0    

Сборка, тестирование, доставка приложения на onescript с помощью gitlab-ci

OneScript v8 1cv8.cf Бесплатно (free)

Сборка, тестирование, доставка приложения на onescript с помощью gitlab-ci на примере портирования на onescript функции daСклонение.

14.05.2018    12263    0    pallid    3    

OneScript в облаке или Развертываем http-сервис OneScript на хостинге

OneScript Бесплатно (free)

В статье описан процесс развертывания web-приложения, созданного на базе http-сервисов OneScript на бесплатном хостинге.

05.05.2018    9136    0    blackhole321    0    

TMSSQL - работа с базами данных MS SQL Server в скриптах на OneScript и из командной строки

OneScript v8 Бесплатно (free)

Представляю вашему вниманию библиотеку TMSQL для работы с базами данных на MS SQL Server. Библиотека подключается в качестве модуля или класса в скрипты, написанные на OneScript, а также может работать как независимое консольное приложение.

26.04.2018    14096    0    Tavalik    22    

Развертывание http-сервиса OneScript на Raspberry Pi

OneScript Бесплатно (free)

В статье описан процесс настройки, а также процесс развертывания http-сервиса (web-приложения) OneScript на Raspbian (Raspberry Pi 2).

23.04.2018    10543    0    blackhole321    10    

Создаем свою библиотеку для OneScript

OneScript v8 Бесплатно (free)

Как упаковать свою библиотеку в пакет? Что такое загрузчик и зачем он нужен? Как вообще создать свою библиотеку? Разбираемся на примере.

06.03.2018    20773    0    nixel    36    

Развертывание http-сервиса (web-приложения) OneScript на Ubuntu Server 16.04

OneScript Бесплатно (free)

В статье описан процесс настройки сервера, а также процесс развертывания http-сервиса (web-приложения) OneScript на Ubuntu Server 16.04

04.03.2018    15004    0    blackhole321    14    

Обзор имеющихся библиотек OneScript

OneScript v8 Бесплатно (free)

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

14.11.2017    40867    0    nixel    86    

Начало работы с OneScript

OneScript Бесплатно (free)

Краткая инструкция по установке и начале работы с OneScript. Пишу потому что сам много шишек набил, пока нашел все инструменты. В статье рассмотрены: 1) Установка OneScript. 2) Установка редактора кода. 3) Настройка редактора кода под OneScript. 4) Запуск скриптов из редактора кода 5) Полезные ссылки

18.10.2017    38955    0    DmitrySinichnikov    53    

С чего начать разработку скриптов на OneScript? Первые шаги

OneScript Бесплатно (free)

После моего доклада на INFOSTART 2017 EVENT COMMUNITY ко мне многие обращались с таким вопросом: с чего начать разработку скриптов на OneScript? В этой статье привожу набор ссылок и некий порядок действий (как его вижу я) для людей, не знакомым с этим инструментом.

11.10.2017    25168    0    Tavalik    14    

Вебинтерфейс для OneScript и 1С

OneScript v8 Россия Бесплатно (free)

Пример создания вебинтерфейса для OneScript с использованием библиотеки UfaScript.osb

30.06.2017    13327    0    andreosh    7    

OneScript и Ajax. POST-запрос и мои дальнейшие планы с фантазиями о будущем

OneScript v8 Россия Бесплатно (free)

Моя библиотека для OneScript (версия 3.0 от 09.06.2017 см.GitHab UfaScript) https://github.com/andreosh/UfaScript теперь позволяет посылать POST-запросы на сервер без использования сторонних библиотек типа jquery.

09.06.2017    17552    0    andreosh    3