此问题与method overloading vs optional parameter类似 但是1)它与服务端点有关,2)可选参数可能表示不同的语义含义:
假设我在我的服务中提供了一个端点,比如“/ messaging / subscribe”,它基本上允许客户端订阅某些主题。因此,订阅请求对象可以包含足够的主题名称和信息的列表,以便当消息被发布到订阅主题之一时服务向订阅客户端发送通知。
同样重要的是要注意,该服务与这些消息的内容无关,并且在发布者和订阅者之间单独通信。该服务只需要将已发布消息的某些编码传递给所有订阅者,并且他们知道如何解码它 假设希望通过此端点订阅的客户端需要SUBSCRIBER角色。
现在让我们说我希望该服务提供一个新的主题监控功能:这个新功能的客户端仍然需要指定一个主题名称列表和通知它的方法,但这种服务:
1)将发送关于感兴趣主题的元数据通知。这些通知将传达关于以下主题的元数据信息:“订户x已与主题y断开连接”或“订阅者v订阅主题q”,或“主题z上的订阅者数量刚刚降至3以下”,或者“在过去一小时内,向主题w发送的通知少于5个”
2)此服务的客户需要MONITOR角色
3)请注意,这些通知中的消息将是系统定义的消息。因此,他们的嫌疑人可以接收代表消息数据的服务定义对象(例如,事件类型,订户ID,主题名称等)。
有两种处理方法:
可以为监控服务创建新的端点,例如, “/ messaging / monitor”,具有与现有订阅端点相同的请求对象信息,以及可能的其他参数。
或者,现有端点可能会过载以处理订阅和监视请求,其中差异在其他参数中传达。例如,客户端可以在请求对象中指定名为“monitor”的布尔属性。因此,如果请求不包含此“可选”请求属性或其值为false,则该请求是主题的正常子查询。或者,如果参数指定monitor == true,则表示客户端仅对与指定主题相关的元数据事件感兴趣。 代码可以根据此“监视器”请求属性的值来检查角色授权。
为了确定两种替代方案中哪一种更易于考虑,应该考虑哪些因素?
并不重要,但实现在Java中使用Vertx ......
答案 0 :(得分:3)
我认为核心问题是它是否仍然是相同的操作(具有不同的参数)。从操作的语义中可以清楚地看出这一点 从我在你的问题中看到的,似乎只是订阅与订阅+监视器完全不同。
添加monitor
参数不仅可以实质性地修改发生的事情,还会改变返回类型等。
因此,从我的投票到新的终点。