c# - 多态与职责划分 : how to avoid 'switching on type'

标签 c# .net polymorphism single-responsibility-principle

在设计具有层次关系的系统时,我经常遇到需要多态行为的问题,但有不止一种类型的工作可以从这种多态实现中受益。

例如,考虑一个使用抽象语法树来组织解析源以进行编译的编译器。以多态方式组织逻辑很方便,因为您可能有不止一种类型的 ValueProvider,每种类型负责发出不同的代码以将值加载到操作堆栈上。问题是您可能还想对 AST 执行静态分析,在这种情况下您想对树执行完全不同的工作,但仍然可能具有取决于所分析的节点类型的行为。换句话说,您想要多态行为,但不想将分析代码与编译代码混合在一起。

我目前处理此问题的方法是使用对象模型存储数据,该对象模型的职责只是提供树。然后,树的每个使用者(例如编译器或静态分析器)使用运行时类型信息来执行其逻辑的条件分支。这不可避免地会导致大量基于节点类型的“if/else if”或“switch”编码。多态性正是为了解决这种丑陋的分支,但并行、不相交的职责似乎需要它。

有更好的方法来构建它吗?

最佳答案

您似乎正在寻找 Visitor pattern :

the visitor design pattern is a way of separating an algorithm from an object structure on which it operates. A practical result of this separation is the ability to add new operations to existing object structures without modifying those structures.

(强调我的)

关于c# - 多态与职责划分 : how to avoid 'switching on type' ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10586357/

相关文章:

java - 我应该对简单的 switch 语句使用多态吗?

java - 为什么从父类(super class)调用时会调用子类的方法?

c# - UWP 中的键盘快捷键

C++基类指针调用子虚函数,为什么基类指针能看到子类成员

c# - 根据 Checkbox 选中的数据做 Ajax 调用

c# - 如果可以的话,我们应该总是通过 ref 返回吗?

.net - 随着索引和文档数量不变,elasticsearch 批量索引会随着时间变慢

c# - 如何从 DbProviderFactories 中删除提供者?

c# - 流利的 NHibernate : mapping a dictionary of lists

c# - 在 C# 中,如何检查 List<> 中对象的属性是否包含字符串?