我正在寻找实施以下情况的选项:
在客户端/服务器系统中,我想实现一个基础结构来评估在客户端构建的表达式。表达式应由表达式树表示,以XML之类的形式编码以进行通信。在客户端,应该有一个用于组合树和编辑现有树的UI。在服务器端,应该有一个用于评估树木以及存储和检索这些树木的基础设施。
存储/检索部分很简单。它只是将一段文本存储在数据库中。
现在,对于编写/编辑UI和评估逻辑,我需要在客户端和服务器端都有一个表达式类的相应类层次结构,它将用于表示表达式树。树将根据文本表示构建,并将用于生成文本表示。在服务器端,严格地说,只需要解析部分,而不是文本表示的产生。但原则上,该部分可以在客户端和服务器代码之间共享。 (解析器使用可用表达式类的注册表来构造适当的节点。)
在客户端,需要处理树以更新评估GUI状态。在服务器端,需要处理树以评估表达式。
因此,我看到的一个选项是在客户端和服务器端编写不同的树访问者,例如用于更新GUI状态,评估GUI状态和评估表达式。回顾是我不能使用虚方法来处理表达式的多态性,而是需要将不同的现有表达式子类硬编码为在访问者中动态地转换代码。
我更喜欢的选项是将表达式操作(更新GUI,评估GUI,评估表达式)放入表达式基类的接口中。但是,服务器端不应包含任何GUI代码。相反,表达式评估依赖于服务器基础结构,因此无法使用客户端代码进行编译。因此,如果表达式操作是接口的一部分,则没有用于在客户端和服务器之间共享表达式的公共基类。
我目前正在考虑是否可以使表达式类层次结构成为每个表达式接口的模板,但我认为,同时听取来自stackoverflow社区的建议可能会很有趣。
实施环境:C ++ / Qt