Oop 一个软件设计问题:路由器类

Oop 一个软件设计问题:路由器类,oop,Oop,在子系统设计中,我有时会看到软件设计有一个高级类,该类只有一个特性:它将调用从使用该类的客户机路由到另一个客户机希望使用的特定类。但是,它本身没有任何功能。以这种情况为例: 假设保龄球馆子系统中有五个类:球馆、球道、保龄球手、控制台和分数。当子系统外的客户机希望向用户显示任何数据时,它将只与控制台(路由器)通信,控制台将调用它持有的任何类以获取客户机请求的数据(例如,分数:客户机使用getScore()调用控制台,它调用Lane的getScore(),它调用Bowler的getScore() 我

在子系统设计中,我有时会看到软件设计有一个高级类,该类只有一个特性:它将调用从使用该类的客户机路由到另一个客户机希望使用的特定类。但是,它本身没有任何功能。以这种情况为例:

假设保龄球馆子系统中有五个类:球馆、球道、保龄球手、控制台和分数。当子系统外的客户机希望向用户显示任何数据时,它将只与控制台(路由器)通信,控制台将调用它持有的任何类以获取客户机请求的数据(例如,分数:客户机使用getScore()调用控制台,它调用Lane的getScore(),它调用Bowler的getScore()


我知道这是一个糟糕的设计决策,但我想听听现实世界的例子,以及你发现的拥有这个路由器类(也可以被称为“中间人”)的后果。随着您所使用的系统的发展,您遇到了哪些问题?为了说服软件设计师避免使用路由器类,您会提出哪些论据?

我不知道路由方法调用总是这样一个坏主意

我不知道路由方法调用总是这样一个坏主意

当子系统之外的客户机希望向用户显示任何数据时,它将只与控制台(路由器)通信,控制台将调用它持有的任何类来获取客户机请求的数据

这听起来像

至于中间人,在下面的例子中,车道不是罪魁祸首吗

分数例如:客户端使用getScore()调用控制台,它调用泳道的getScore(),它调用投球手的getScore()

为了子系统之外的客户的利益,简化子系统的接口可以被认为是良好的设计

当子系统之外的客户机希望向用户显示任何数据时,它将只与控制台(路由器)通信,控制台将调用它持有的任何类来获取客户机请求的数据

这听起来像

至于中间人,在下面的例子中,车道不是罪魁祸首吗

分数例如:客户端使用getScore()调用控制台,它调用泳道的getScore(),它调用投球手的getScore()


为了子系统之外的客户机的利益,简化子系统的接口可以被认为是一个好的设计。

我认为在一些设计中,路由器是首选的设计模式,例如在MVC框架中,为URL委派处理程序。在这种情况下,它非常有用,因为它在客户机“看到”的内容和背后的实际逻辑之间提供了一个非常清晰的分隔

我认为,在某些设计中,路由器是首选的设计模式,例如在MVC框架中,为URL委派处理程序。在这种情况下,它非常有用,因为它在客户机“看到”的内容和背后的实际逻辑之间提供了一个非常清晰的分隔

似乎您只会遇到与任何附加抽象层相关联的问题——抽象可能会中断,或者如果对底层内容进行了更改,那么这又是一件可能会出现错误行为的事情

我从未见过任何调用超过几层的调用,但我只是想象添加额外的调用会使跟踪路径信息变得更加困难,并使故障排除变得更加困难

然而,一个潜在的问题是,如果每一层都实现了自己的错误处理或重试过程,使得在每一层中无关紧要的东西成为一个整体。例如,如果滑道两次尝试检查投球手的得分,而桌面三次尝试检查得分,那么投球手未能返回得分将导致6次查询。在投球手处加上30秒的暂停时间,你会突然等待3分钟,等待30秒


OldNewThing曾在Windows操作系统上发表过一篇关于这个例子的文章,以及它引起的问题,但现在我似乎找不到了。

似乎你只会遇到与任何附加抽象层相关的问题——抽象层可能会破坏,或者这是另一件事,如果对潜在的东西进行了改变,它可能会有潜在的不当行为

我从未见过任何调用超过几层的调用,但我只是想象添加额外的调用会使跟踪路径信息变得更加困难,并使故障排除变得更加困难

然而,一个潜在的问题是,如果每一层都实现了自己的错误处理或重试过程,使得在每一层中无关紧要的东西成为一个整体。例如,如果滑道两次尝试检查投球手的得分,而桌面三次尝试检查得分,那么投球手未能返回得分将导致6次查询。在投球手处加上30秒的暂停时间,你会突然等待3分钟,等待30秒


OldNewThing在一篇文章中提到了Windows操作系统中的一个例子,以及由此引发的问题,但是现在我似乎找不到了。

我认为ASP.NET MVC和MVP模式都利用了这种概念,在这种概念中,您只需要处理从一端到另一端执行的逻辑,或者代表从较低层到较高层执行的逻辑。这当然会使测试更容易执行,因此其本身就是一个主要的好处。这种类型的模式确实会创建一些手动或繁琐的工作,因为您可以单击一个按钮并让它执行任务,而不是单击该按钮,让它执行一些单击的内容,然后调用一些执行某些工作的服务管理类。但是在保持代码干净和可读性方面,分离得越多往往越好

如果你是