Re[4]: Слабое связывание в процедурном языке
От: zelenprog  
Дата: 29.07.24 06:35
Оценка: +1
vsb>Самый простой вариант это что-то вроде

  call_by_pointer
vsb>
vsb>function call_by_pointer(pointer: integer, argument: integer): integer {
vsb>  if (pointer == 1) return function_1(argument);
vsb>  if (pointer == 2) return function_2(argument);
vsb>  if (pointer == 3) return function_3(argument);
vsb>  throw error;
vsb>}
vsb>

vsb>Т.е. у нас указатель это некое число и при передаче его в функцию call_by_pointer мы вызываем целевую функцию. Далее в тех местах, где нужен указатель на функцию — мы храним это число, а при необходимости вызвать функцию мы вызываем call_by_pointer.

vsb>Если в языке есть строки, может быть лучше заменить число на строку, к примеру банально — названию функции:


  call_by_name
vsb>
vsb>function call_by_name(name: string, argument: integer): integer {
vsb>  if (name == "function_1") return function_1(argument);
vsb>  if (name == "function_2") return function_2(argument);
vsb>  if (name == "function_3") return function_3(argument);
vsb>  throw error;
vsb>}
vsb>}
vsb>


vsb>Для каждого сочетания аргументов и возвращаемого значения нужно будет делать новую такую функцию.


vsb>Этот подход можено улучшать в зависимости от того, что ещё в языке есть.


Идею понял. Спасибо.
Выше писали что-то похожее про диспетчер.

Если провести аналогию с ООП (внедрение зависимости), то получается следующая картина.
Допустим есть рабочий код (процедура), которая в ходе выполнения должна вызывать какой-то конкретный "внедренный" метод-обработчик (процедуру).
Для этого рабочий код вызывает что-то типа процедуры "call_by_name".
В данном случае "call_by_name" — по сути является "интерфейсной" процедурой.
А реальная процедура, которая будет вызываться в зависимости от параметра — это внедренная процедура.
Клиентский код для "внедрения" конкретной процедуры в рабочий код, передает в рабочий код параметр, обозначающий конкретную процедуру.
Верно?

Процедуру "call_by_name" можно назвать "интерфейсной" процедурой или "базовой" процедурой (процедурой базового класса).
Получается эта "базовая" процедура должна знать названия всех процедур-"наследников".
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.