c# - 如果调用方法不知道返回类型,如何避免 switch 语句?

标签 c# oop design-patterns

我一直在读一本书叫Clean Code A Handbook of Agile Software Craftsmanship .书中的作者认为应该避免使用 switch 语句,如果无法避免,则应将其降级为工厂方法。我有一个连接对象,它正在接收各种 PDU(协议(protocol)数据单元)。 PDU 各不相同,可以按任何顺序接收。因此,如果我有一个方法,例如:

public BasePdu ReceiveNext();

因为在完全接收之前我无法判断数据包类型是什么。在 PDU 的 header 中是关于它应该是哪种类型的标识符。这意味着调用方法将确定 PDU 的类型,并根据该类型调用相关方法来处理它。这听起来像是 switch 语句的完美示例。理想情况下,包含连接的对象有两个线程。一个用于接收 PDU,另一个用于服务要发送的 PDU 队列。

现在我知道您无法遵循所有好的建议,并且只有某些情况是规则的异常(exception)。这是其中之一吗?或者有没有我还没有想到的解决方法。

更新:

我听到很多人都在说创建响应处理程序的子类。问题是包含对象有很多上下文和处理程序需要的附加信息,例如查找和限制等。将所有这些信息注入(inject)处理程序的子类将是一件很麻烦的维护工作,并且还会拆分一个当封装在它现在所在的对象中感觉更好时,很多逻辑就会上升。

最佳答案

就个人而言,我不会太担心它;如果它看起来像 switch 语句的好地方,请使用一个。另一方面,如果每个 PDU 类型由类而不是方法处理,这看起来也像是可以使用工厂方法的情况。而且,根据你的书,你可以使用 switch 语句

关于c# - 如果调用方法不知道返回类型,如何避免 switch 语句?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6094343/

相关文章:

c# - 如何错误处理C#中的过点击

c# - 泛型方法的可为空参数类型 <T>?

时间:2019-05-17 标签:c#MVCDropdownlistpost选择值

java - java中的继承(编译错误)

java - 如何用自己类型的成员扩展一个类?

c# - CallNamedPipe & NamedPipeServerStream,访问被拒绝?

java - 如何让对象访问其调用对象的变量并修改它们?

design-patterns - F# - 工厂方法设计模式

c++ - 我可以使用哪些设计模式?

python - 包含只有静态方法的类的模块