OneS icon indicating copy to clipboard operation
OneS copied to clipboard

Функции как объекты

Open Nivanchenko opened this issue 4 years ago • 11 comments

Добавить возможность работать с методами как с объектами. Хранить их в переменной и передавать дальше по коду, где в любой момент может быть выполнение.

Пример


Функция ВернутьЧтоТо(ПараметрыВыполнения)

   ЧтоТо = Неопределено;
    //<...>
   Возврат ЧтоТо

КонецФункции


МояФункция = Новый Функция("ВернутьЧтоТо");
Параметры = Новый Структура();
Результат = МояФункция(Параметры);

Таким образом мы сможем хранить в переменной функции и выполнять их по мере необходимости.

Ещё как усложненный вариант (альтернативная реализация) давать возможность указывать "контекст" выполнения метода. В качестве простой реализации можно сделать так, чтобы контекст передавался автоматически первым параметром.

Пример:

Функция СложитьЗначения(КонтекстВыполнения, ДополнительныеПараметры = Неопределено) экспорт
    
    Результат = КонтекстВыполнения.Число1 + КонтекстВыполнения.Число2;
    Если ТипЗнч(ДополнительныеПараметры) = Тип("Число") Тогда
         Результат = Результат + ДополнительныеПараметры;
    КонецЕсли;

   Возврат Результат;

КонецФункции

МойОбъект = Новый Структура();
МойОбъект.Вставить("Число1", 5);
МойОбъект.Вставить("Число2", 5);

//Здесь мы создаем объект функции и передаем в качестве контекста структуру
МояФункция = Новый Функция("СложитьЗначения", МойОбъект);

//Мы можем выполнить функцию так:
Результат = МояФункция() //Неявно передается первый параметр, указанный в момент создания функции

//А можем добавить этот метод внутрь самой структуры. 
МойОбъект.Вставить("Сложить", МояФункция);

//Таким образом мы имеем возможность наделить структуру своим методом, который имеет контекст этой структуры
Результат = МойОбъект.Сложить(); 

//А так дополнительно передать параметр, который будет помещен в ДополнительныеПараметры
Результат = МойОбъект.Сложить(5); //Число 5 будет передано во второй параметр

Это позволит создавать на основе структур произвольные объекты, обладающие собственными методами.

Nivanchenko avatar Apr 05 '21 23:04 Nivanchenko

идея супер, ток надеюсь если вендор решит делать такую фичу он придумает реализацию покрасивее. Так же куда проще

Процедура Тест()
	коэф = 0.1;
	Ф = Функция Сложить(Число1, Число2)
			Возврат (Число1 + Число2) * коэф;
		КонецФункции;
		
	Сообщить(ф(1, 2));	
КонецПроцедуры

LazarenkoA avatar May 18 '21 14:05 LazarenkoA

Саму идею (только заголовок) поддерживаю.

но описанный пример как это можно было бы использовать - выглядит очень-очень дико!

какая ещё неявная передача контекста!? Какие методы у структур!? Давайте уже тогда объявим что хотим честное ООП, лямбды, и... да, есть уже такие ЯП, которые всё это позволяют.

marmyshev avatar May 19 '21 22:05 marmyshev

Саму идею (только заголовок) поддерживаю. Какие методы у структур!?

То есть вы поддерживаете идею Функции как объекты, но хотите запретить помещать их в структуры ?

SeiOkami avatar May 20 '21 08:05 SeiOkami

Добавил упрощенное описание без контекста.

SeiOkami avatar May 20 '21 08:05 SeiOkami

//Мы можем выполнить функцию так: Результат = МояФункция() //Неявно передается первый параметр, указанный в момент создания функции

вот это дико выглядит. Т.к. человек смотрящий на эту запись будет недоумевать - какого фига МояФункция выдала какую-то чушь?! (А пойди догадайся что тут где был какой-то контекст, который платформа без твоего ведома взяла и засунула в функцию. А я этого хотел?)

Далее, очень смущает:

//Таким образом мы имеем возможность наделить структуру своим методом, который имеет контекст этой структуры Результат = МойОбъект.Сложить();

//А так дополнительно передать параметр, который будет помещен в ДополнительныеПараметры Результат = МойОбъект.Сложить(5); //Число 5 будет передано во второй параметр

Вот как тут вычислять типизацию результата, чтобы проверить что я могу (имею право) присваивать возвращаемый тип в мою переменную/реквизит/поле?

Это становится неализируемая жесть)) Тут говорю как человек разрабатывающий систему стат-анализа для 1С.

Я "ЗА" саму идею "функция как объект" (это ведь аналогично как сейчас уже существует "процедура как объект" - в описание оповещения, кстати!).

Но предлагаемые примеры смущают сильно.

marmyshev avatar May 20 '21 12:05 marmyshev

Тож не понимаю что за КонтекстВыполнения и зачем его передавать, есть же замыкания, вот и напишите "хотим замыкания"

LazarenkoA avatar May 20 '21 12:05 LazarenkoA

Ну не бейте меня. Я за идею. А примеры написал ну как смог. Что бы идею, как то передать.

Nivanchenko avatar May 20 '21 15:05 Nivanchenko

Тож не понимаю что за КонтекстВыполнения и зачем его передавать, есть же замыкания, вот и напишите "хотим замыкания"

Чем сложнее реализовать, тем меньше шансов на реализацию. С контекстом выполнения можно и сейчас сделать более-менее универсально через общий модуль. Замыкания примерно тогда, когда 1С внедрит в платформу Паузу(). То есть никогда.

SeiOkami avatar May 20 '21 18:05 SeiOkami

Отправлено боту 1С 19.05.2021 в 20:00

SeiOkami avatar Nov 10 '21 10:11 SeiOkami

когда 1С внедрит в платформу Паузу(). То есть никогда.

В 8.3.25 будет родная пауза в фоновых заданиях =)

tormozit avatar Apr 27 '23 05:04 tormozit

Слишком сложное предложение. Описал свой вариант "Простые ссылки на функции" https://github.com/SeiOkami/OneS/issues/205

tormozit avatar Apr 27 '23 05:04 tormozit