Извиняюсь заранее за длинное сообщение.
В общем, я тут подумал, и мне кажется, что на эту проблему (OOP vs MD vs FP) можно смотреть с очень разных точек зрения и за счёт этого видеть разные проблемы или не видеть проблему вообще.
То, что обсуждается в том топике в дискурсе, это скорее всего про будни кор разработчиков. Сама по себе expression problem не является смертельной и разумеется она решабельна иначе у нас уже не было бы ни OOP ни каких-либо других языков программирования.
Наверное основным следствием этой проблемы является то, что её наличие значительно усложняет разработку и поддержку библиотек. Одно дело, когда тебе надо быстро что-то где-то подлатать - тут достаточно бесполезно спорить о том, что лучше, mulitple dispatch, mixin, extensions или что там ещё люди придумали. Другой вопрос, если ты разработчик, который сидит перед пустым экраном и готовится писать код, который теоретически должен будет использоваться сотнями других разработчиков на протяжении многих лет, и при этом будущая библиотека должна быть не просто используемой, но и легко расширяемой другими людьми.
В этом случае стоимость архитектурной ошибки возрастает чудовищно, так как любой рефакторинг это очень и очень болезненная процедура. Так вот, дискуссию о разных подходах я бы наверное рассматривал именно с этой позиции. Невозможно заглянуть в будущее и угадать, что именно и как именно будет использоваться, поэтому в OOP подходе очень легко ошибиться архитектурно - выбрать неправильную иерархию типов или где-то ещё просчитаться. Да, разные OOP языки предлагают определённые формы которые позволяют нивелировать такие ошибки до какой-то степени (тот же самый monkey patching), но это обычно воспринимается как латание дыр и в какой-то момент всё равно приходится производить существенный рефакторинг.
Вроде как в противоположность этому multiple dispatch гораздо менее требователен к прототипированию библиотеки и с его использованием сложнее ошибиться. Если ты написал функцию foo(bar, baz) то она будет работать для любых объектов bar и baz до тех пор пока они удовлетворяют какому-то набору условий нужному для работы функции. То есть потенциально твой код будет адекватно работать даже для библиотек, которые ещё не существуют в природе.
Вот как-то так. Предлагается сравнивать не текущие сиюминутные различия между подходами, а стоимость разработки/поддержки в long term с учётом рефакторингов. Разумеется эта оценка я думаю сейчас чисто эмпирическая, те кто руку набил на разработке сложных OOP проектов скажут (и скорее всего справедливо), что они могут с нуля написать библиотеку, которую не нужно будет переделывать и перевес будет в сторону OOP. Кто-то другой скажет, что он устал постоянно переделывать свои OOP библиотеки, а переход на MD позволил ему вообще не заботиться о такого сорта поддержке и рефакторинги стали быстрыми и декоративными.