在设计具有层次关系的系统时,我经常遇到一个需要多态行为的问题,但不止一种类型的工作可以从这种多态实现中受益。
例如,考虑一个编译器,它使用抽象语法树来组织已解析的源代码以进行编译。以多态方式组织逻辑很方便,因为您可能有不止一种类型的 ValueProvider,每种类型负责发射不同的代码以将值加载到操作堆栈上。问题是您可能还想对 AST 执行静态分析,在这种情况下,您想对树进行完全不同的工作,但可能具有取决于所分析节点类型的行为。换句话说,您需要多态行为,但不想将分析代码与编译代码混合在一起。
我目前处理这个的方法是用一个对象模型来存储数据,它的职责只是提供树。树的每个使用者(例如编译器或静态分析器)然后使用运行时类型信息来执行其逻辑的条件分支。根据节点的类型,这不可避免地会导致大量的“if/else if”或“switch”编码。多态性旨在解决的正是这种丑陋的分支,但并行的、不相交的职责似乎需要它。
有没有更好的方法来构建它?