Graff46
@Graff46
Программист любитель

Какая из 2-ух реализаций более приемлима?

Часто бывают ситуации когда можно приравнять какой-то объект к функции и эта ф-ция будет вызываться при определенных условиях и параметрах, но часто этого мало - хочется несколько ф-ций повесить на 1 объект. Для этой цели я написал 2 реализации. Собственно хочется узнать какой способ более приемлем, я делал тест на множественное выполнение 4 функций (2^20 раз) - по времени результат приблизительно равный.
Способ первый (в глубину)

Ф-ции записываются в таблицы, а таблицы одна в другую, у каждой таблицы в метатаблице указано, что при вызове оной выполнится ф-ция и вложенная таблица и так по цепочке: 
local noop = function() end

local storage = {noop}
setmetatable(storage, {__call = function(slf, ...) return slf[1](...) end})
local b = storage

function add(f) -- добавить ф-цию в линию выполнения
    local texe = {noop, f}
    setmetatable(texe, {__call = function(self, ...)
        self[2](...); 
        return self[1](...)
    end})
    b[1] = texe
    b = texe
end

function find(f_obj) -- поиск ф-ции из линии, если нашлась - возвращает её родительскую таблицу (сама найденная ф-ция 2 элемент в таблице)
    local stack, prevStack = storage, storage
    while (type(stack) == "table") do 
        stack = stack[1] 
        if stack[2] == f_obj then
            return prevStack
        end
        prevStack = stack
    end
end -- не громоздкий поиск ф-ции в линии

function del(fun) -- удаление ф-ции из линии
    local a = find(fun)
    a[1] = a[1][1] 
end

Способ 2 (в ширину)
local line = {test, test2, test3, test4}
    
local function iniciator(...)
    for i=1, #line do
        line[i](...)
    end
end

setmetatable(line, {__call = function(slf, ...) return iniciator(...) end})

Специальных ф-ций для получения и удаления ф-ций из таблицы не писал, подразумеваю, что пользователь сам умеет работать с простыми таблицами.

Первый способ содержит больше метатаблиц, подключенные ф-ции оборачиваются в талицу со своей метатаблицей и вызовом подключенной ф-ции, вызовом вложенной таблицы. Все хитро и не просто на первый взгляд. Второй способ проще, но там цикл с обходом. Интересно мнение и предложения знающих людей. 
  • Вопрос задан
  • 94 просмотра
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы