#14.3 Подпрограммы-обертки. Изменение сигнатуры функции/Процедуры

Понятие обертки

Подпрограмма-обертка:

  • В широком смысла: подпрограмма, которая использует другую подпрограмму
  • В более узком смысле: подпрограмма, которая использует другую подпрограмму, и при этом решает похожу/близкую по смыслу или вообще ту же самую задачу.

Без смены сигнатуры

Есть функция, которая умеет считать сумму или разность двух чисел (в зависимости от переданного знака)

function sum_difference(int_1, int_2: integer; symb: char) :integer;
begin
    if symb = '-' then
      result := int_1 - int_2
    else
      result  := int_1 + int_2;
end;

Задача: написать фунцию-обертку над данной, которая сможет поддерживать также и умножение (при этом для уже поддержанных в sum_difference() операций, наша новая функция соответственно должна использовать вызовы sum_difference().

Возможное решение:

function sum_difference_mult(int_1, int_2: integer; symb: char) :integer;
begin
  if symb = '*' then
    result  := int_1 * int_2
  else
    result := sum_difference(int_1, int_2, symb);
end;

-- в данном случае функции sum_difference_mult() называют оберткой [над] sum_difference()

Со сменой сигнатуры

Ради упрощения вызова в клиентском коде

Простой пример: предположим, что в нашей программе или ее части нужно только складывать числа, при этом у нас уже есть готовая реализация function sum_difference(), тогда мы можем реализовать вспомогательную функцию-обертку с более простой сигнатурой:

function sum(int_1, int_2: integer;) :integer;
begin
    result := sum_difference(int_1, int_2, '+');
end;

- т.е. теперь мы можем использовать функцию, в которую нужно передавать только два параметра.

Задачи для самостоятельного решения

  1. Есть функция:
    function sum(int_1, int_2: integer;) :integer;
    begin
        result := int_1 + int_2;
    end;
    

    -- реализовать обертку над ней, которая будет уметь не только складывать, но и вычитать числа.