在设计具有层级关系的系统,我经常碰到的是求多态行为有问题,但有多于一个类型的工作,从这个态实现中受益。
例如,考虑使用抽象语法树来组织编译的解析的源编译器。 它的方便多态组织逻辑,则可能有多于一种类型的ValueProvider,其中的每一个是负责不同的代码的发射加载值压入操作栈。 问题是,你可能也想在AST,在这种情况下,你想要做的完全不同的工作与树进行静态分析,但仍可能有行为依赖于节点的类型进行分析。 换句话说,你想多态行为,但你不想共同夹杂在汇编代码的分析代码。
我现在处理这个问题的方法是将数据存储与其职责是仅仅提供树的对象模型。 树的每个消费者(例如,编译器或静态分析器),然后使用运行时类型信息来执行其逻辑的条件分支。 这不可避免地导致了很多“if / else语句如果”或“开关”编码,基于节点的类型。 这只是这类丑陋的分支是多态性设计来解决,但平行不相交的责任似乎需要它。
有没有更好的方法来组织呢?