Функции как объекты
Добавить возможность работать с методами как с объектами. Хранить их в переменной и передавать дальше по коду, где в любой момент может быть выполнение.
Пример
Функция ВернутьЧтоТо(ПараметрыВыполнения)
ЧтоТо = Неопределено;
//<...>
Возврат ЧтоТо
КонецФункции
МояФункция = Новый Функция("ВернутьЧтоТо");
Параметры = Новый Структура();
Результат = МояФункция(Параметры);
Таким образом мы сможем хранить в переменной функции и выполнять их по мере необходимости.
Ещё как усложненный вариант (альтернативная реализация) давать возможность указывать "контекст" выполнения метода. В качестве простой реализации можно сделать так, чтобы контекст передавался автоматически первым параметром.
Пример:
Функция СложитьЗначения(КонтекстВыполнения, ДополнительныеПараметры = Неопределено) экспорт
Результат = КонтекстВыполнения.Число1 + КонтекстВыполнения.Число2;
Если ТипЗнч(ДополнительныеПараметры) = Тип("Число") Тогда
Результат = Результат + ДополнительныеПараметры;
КонецЕсли;
Возврат Результат;
КонецФункции
МойОбъект = Новый Структура();
МойОбъект.Вставить("Число1", 5);
МойОбъект.Вставить("Число2", 5);
//Здесь мы создаем объект функции и передаем в качестве контекста структуру
МояФункция = Новый Функция("СложитьЗначения", МойОбъект);
//Мы можем выполнить функцию так:
Результат = МояФункция() //Неявно передается первый параметр, указанный в момент создания функции
//А можем добавить этот метод внутрь самой структуры.
МойОбъект.Вставить("Сложить", МояФункция);
//Таким образом мы имеем возможность наделить структуру своим методом, который имеет контекст этой структуры
Результат = МойОбъект.Сложить();
//А так дополнительно передать параметр, который будет помещен в ДополнительныеПараметры
Результат = МойОбъект.Сложить(5); //Число 5 будет передано во второй параметр
Это позволит создавать на основе структур произвольные объекты, обладающие собственными методами.
идея супер, ток надеюсь если вендор решит делать такую фичу он придумает реализацию покрасивее. Так же куда проще
Процедура Тест()
коэф = 0.1;
Ф = Функция Сложить(Число1, Число2)
Возврат (Число1 + Число2) * коэф;
КонецФункции;
Сообщить(ф(1, 2));
КонецПроцедуры
Саму идею (только заголовок) поддерживаю.
но описанный пример как это можно было бы использовать - выглядит очень-очень дико!
какая ещё неявная передача контекста!? Какие методы у структур!? Давайте уже тогда объявим что хотим честное ООП, лямбды, и... да, есть уже такие ЯП, которые всё это позволяют.
Саму идею (только заголовок) поддерживаю. Какие методы у структур!?
То есть вы поддерживаете идею Функции как объекты, но хотите запретить помещать их в структуры ?
Добавил упрощенное описание без контекста.
//Мы можем выполнить функцию так: Результат = МояФункция() //Неявно передается первый параметр, указанный в момент создания функции
вот это дико выглядит. Т.к. человек смотрящий на эту запись будет недоумевать - какого фига МояФункция выдала какую-то чушь?! (А пойди догадайся что тут где был какой-то контекст, который платформа без твоего ведома взяла и засунула в функцию. А я этого хотел?)
Далее, очень смущает:
//Таким образом мы имеем возможность наделить структуру своим методом, который имеет контекст этой структуры Результат = МойОбъект.Сложить();
//А так дополнительно передать параметр, который будет помещен в ДополнительныеПараметры Результат = МойОбъект.Сложить(5); //Число 5 будет передано во второй параметр
Вот как тут вычислять типизацию результата, чтобы проверить что я могу (имею право) присваивать возвращаемый тип в мою переменную/реквизит/поле?
Это становится неализируемая жесть)) Тут говорю как человек разрабатывающий систему стат-анализа для 1С.
Я "ЗА" саму идею "функция как объект" (это ведь аналогично как сейчас уже существует "процедура как объект" - в описание оповещения, кстати!).
Но предлагаемые примеры смущают сильно.
Тож не понимаю что за КонтекстВыполнения и зачем его передавать, есть же замыкания, вот и напишите "хотим замыкания"
Ну не бейте меня. Я за идею. А примеры написал ну как смог. Что бы идею, как то передать.
Тож не понимаю что за КонтекстВыполнения и зачем его передавать, есть же замыкания, вот и напишите "хотим замыкания"
Чем сложнее реализовать, тем меньше шансов на реализацию. С контекстом выполнения можно и сейчас сделать более-менее универсально через общий модуль. Замыкания примерно тогда, когда 1С внедрит в платформу Паузу(). То есть никогда.
Отправлено боту 1С 19.05.2021 в 20:00
когда 1С внедрит в платформу Паузу(). То есть никогда.
В 8.3.25 будет родная пауза в фоновых заданиях =)
Слишком сложное предложение. Описал свой вариант "Простые ссылки на функции" https://github.com/SeiOkami/OneS/issues/205