Я ищу варианты для реализации следующей ситуации:
В системе клиент / сервер я хочу реализовать инфраструктуру, которая оценивает выражения, построенные на стороне клиента. Выражения должны быть представлены деревом выражений, закодированным в нечто вроде XML для связи. На стороне клиента должен быть пользовательский интерфейс для составления дерева и редактирования существующих деревьев. На стороне сервера должна быть инфраструктура для оценки деревьев и для хранения и поиска таких деревьев.
Часть хранения / поиска проста. Это просто хранение части текста внутри БД.
Теперь для пользовательского интерфейса создания / редактирования и логики оценки мне нужна как на стороне клиента, так и на стороне сервера соответствующая иерархия классов классов выражений, которая будет использоваться для представления дерева выражений. Дерево будет построено из текстового представления и будет использовано для создания текстового представления. На стороне сервера, строго, требуется только синтаксический анализ, а не создание текстового представления. Но в принципе эта часть может быть разделена между кодом клиента и сервера. (Парсер использует реестр доступных классов выражений для построения соответствующих узлов.)
На стороне клиента дерево должно быть обработано для обновления оценивающего состояния GUI. На стороне сервера дерево должно быть обработано для оценки выражения.
Итак, один вариант, который я вижу, — это запись отдельных посетителей дерева на стороне клиента и сервера, например для обновления состояния GUI, оценки состояния GUI и для оценки выражения. Недостатком является то, что я не могу использовать виртуальные методы для обработки полиморфизма выражений, но вместо этого мне нужно жестко закодировать различные существующие подклассы выражений в динамически приведенный код в посетителях.
Вариант, который я бы предпочел больше, — это поместить действия выражения (обновление GUI, оценка GUI, оценка выражения) в интерфейс базового класса выражения. Однако на стороне сервера не должно быть кода GUI. И наоборот, оценка выражения зависит от серверной инфраструктуры, так что она явно не может быть скомпилирована с клиентским кодом. Таким образом, не существует общего базового класса для выражений, которые будут совместно использоваться клиентом и сервером, если действия выражений являются частью интерфейса.
В настоящее время я думаю о том, возможно ли сделать иерархию классов выражений шаблоном интерфейса для каждого выражения, но я думаю, что было бы интересно услышать предложения от сообщества stackoverflow одновременно.
Контекст реализации: C ++ / Qt
Задача ещё не решена.
Других решений пока нет …