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

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

то есть данный элемент может быть A или B (определяется функцией), если это B, то он может быть C или D (определяется другой функцией) и так далее вниз. На каждом этапе к каждой карте может быть добавлено больше данных, относящихся к классификации. Функции для выполнения классификации сами по себе довольно сложны, и для принятия решений может потребоваться ввод дополнительных данных.

Будет ли саморекурсивный мультиметод хорошим способом структурировать код для этого? Я бы отправил наиболее конкретный тип, определенный на данный момент для элемента, или вернул бы лучшую текущую классификацию, когда ничего больше нельзя сделать.

Я мог получить желаемый эффект с вложенными ifs внутри одной функции классификации, но, черт возьми, это ужасно.

Подходит ли здесь мультиметод, или я слишком усложняю вещи и пропускаю более простой способ структурирования кода?


person Alex Stoddard    schedule 01.03.2011    source источник


Ответы (2)


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

Другой способ думать об этом состоит в том, чтобы основывать его на обходе дерева решений, а не на вашем входе. Интересно, может ли использование clojure.zip для обхода дерева функций классификации быть интересным решением? Ваша классификационная функция в каждом узле может подсказать вам, как дальше пройти по дереву (к какому дочернему элементу перейти). Вам не обязательно нужен clojure.zip, но в нем уже есть древовидная навигация.

person Alex Miller    schedule 01.03.2011
comment
Да, ваш первый абзац отражает мое текущее мышление. Что касается вашего второго предложения, было бы интересно подумать о расширении моих горизонтов, но, конечно, оно не кажется более простым! (-: - person Alex Stoddard; 02.03.2011

мультиметоды хороши тем, что они допускают такой уровень диспетчеризации, когда этого требует сложность задачи. Я говорю, давай, если это делает то, что ты хочешь.

Возможно, вы могли бы построить isa иерархию, чтобы помочь

person Arthur Ulfeldt    schedule 01.03.2011