Ключевым моментом здесь является «разрешить открытое расширение». Любой может добавить новые ветки для ваших мультиметодов - cond
жестко запрограммирован: новые отправления должны быть добавлены к cond
коду на месте.
Допустим: у вас есть несколько виджетов, и вы хотите рисовать их. Виджеты имеют :type
, и вы хотите отправить, как draw
для этого типа.
Запись большого cond
для всех виджетов , о которых вы знаете, будет работать. Но теперь для каждого нового виджета вам нужно коснуться исходного кода cond
и изменить его. Это может идеально подходить, например, для реального приложения, которое не требует расширения.
То же самое с мультиметодами, любой может реализовать draw
для своих виджет. Итак, вы не знаете их всех при написании кода. Это делает этот подход лучше (или даже обязательным), например, для библиотек.
А теперь представьте, что вы выбрали подход cond
для библиотеки, которую пишете. Любой, у кого есть новый виджет, должен написать свой собственный draw
, сначала отправить его dr aws, а затем позвонить на draw
. Также им нужно будет убедиться, что их draw
вызывается везде, где ваш draw
был вызван, чтобы он работал (что часто просто невозможно в чистом виде).
Один популярный пример для multimethod прямо в ядре Clojure: print-method
. Таким образом, любой может реализовать «сериализацию» для своего типа и играть красиво.
Другие достойные упоминания примеры, на которые стоит обратить внимание: clojure.test и integnt .