Object Algebra как решение Expression Problem

Expression Problem представляет собой одну из ключевых трудностей в объектно-ориентированном программировании, касающуюся компромисса между расширяемостью структур данных и удобством модификации кода.

Кратко суть проблемы: есть иерархия классов, например:

Expr = Const(a) | Add(Expr a, Expr b) | Sub(Expr a, Expr b)

И некоторое количество методов, которые эту структуру обрабатывают

int eval(Expr e)
string print(Expr e)

Для решения Expression Problem нужно представить подход, который позволяет одновременно добавлять новые кейсы в структуру

Expr += Var(name) | Mult(Expr a, Expr b)

и новые методы-обработчики, напр. byte[] serialize(Expr a), так чтобы это не влияло на уже написанный код.

В статье рассмотрены подходы visitors, object algebra.