[OFFTOP, продолжаем обсуждение упоротых вариантов]
Цитата:
т.к. настройку этой матрицы замучаешься писать
|
Её же совершенно не обязательно заполнять вручную
. Сделать функцию Register(a, b, handler) и все. Решение почти совпадает с твоим, только учитывает, что по условию задачи, видимо, для каждой пары чисел не более 1 обработчика: не приходится для каждого обработчика вызывать
Код:
if CanExecute(a,b) then DoExecute(a,b);
Короче говоря, логика самой функции CanExecute просто вынесена на уровень выше, т.е. на уровень
ExecuteDynamicAction в твоих терминах, что чуть быстрее (не полный перебор всех хендлеров, а бинарный поиск a и b в массивах).
Можно построить то же самое не на двумерном массиве, а на каком-нибудь TDictionary<int, TDictionary<int, Handler>>, если в возможных значениях много неиспользуемых пар. Тогда просто вызывается handlers[a][b]() и ловится эксепшен, если обработчика нет.
Короче, вариантов может быть много.