Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/spring-boot/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java API设计中的响应/应答模式与方法重载_Java_Design Patterns - Fatal编程技术网

Java API设计中的响应/应答模式与方法重载

Java API设计中的响应/应答模式与方法重载,java,design-patterns,Java,Design Patterns,我最近设计了一个API来包装数据存储实现,并允许其他开发人员使用该API对他们的数据进行索引,并根据关键字查询数据库。我在查询方法中使用了响应/回复模式,因为Jaroslav Tulach提到,当需要添加参数时,它可以避免不断更改API接口(实用API设计第97页)。其他开发人员认为使用方法重载是更好的方法。你能分享你在设计中使用两种不同方法的经验吗?下面是我和其他开发人员之间的对话 我: 响应/回复模式看起来是一种干净的方式,因为随着API的发展,越来越多的参数可以添加到API接口中。在接口中

我最近设计了一个API来包装数据存储实现,并允许其他开发人员使用该API对他们的数据进行索引,并根据关键字查询数据库。我在查询方法中使用了响应/回复模式,因为Jaroslav Tulach提到,当需要添加参数时,它可以避免不断更改API接口(实用API设计第97页)。其他开发人员认为使用方法重载是更好的方法。你能分享你在设计中使用两种不同方法的经验吗?下面是我和其他开发人员之间的对话

我: 响应/回复模式看起来是一种干净的方式,因为随着API的发展,越来越多的参数可以添加到API接口中。在接口中使用超过10种重载方法可能会让其他开发人员感到困惑。他们是如何决定使用哪种方法的

其他开发商的观点: 随着API的发展,您不应该继续添加参数。若您一直在API接口中添加参数,那个么您的API设计就会出现问题。所以,重载方法的数量很少,所以不会打扰开发人员。此外,Java框架中经常会出现大量重载方法实现

我: 很容易管理API早期版本的向后兼容性。您不必更改接口。更改接口将破坏其他开发人员的现有代码

其他开发商的观点:
若我更改了实现并添加了参数,那个么其他开发人员应该基于新的API更新他们的代码。如果新参数是可选的,为什么还要添加它呢

没有本质区别,也不能降低固有的复杂性。当然,我们总能找到支持这两种选择的用例;如果不知道你的具体问题领域,其他人就不能仅仅根据一些抽象的原则选择一个最喜欢的


不过,我建议您选择一个适合今天的简单解决方案。不要担心“未来的变化”

我相信我们正在进行比较

   invoke( int param1, string param2) { ... }

   invoke ( string param3, int param4, int param5) { ... }
对于所有有效的参数组合,依此类推

是这样用的吗

   request.set("param1", value);
   request.set("param2", value);
   invoke(request);
这里有几个交易

请求方法的一个缺点是调用方可以提供无效的参数组合,并且不会收到编译时警告-直到运行时才会发现错误

但是不断增长的接口可能会完全失控,您可以获得所需方法数量的组合爆炸

您可以将SQL视为一个非常丰富的请求的示例—我很清楚,在某些情况下,结构良好的查询语言或请求对象比逐个参数的方法重载更可取

我个人的经验法则是:如果你打算使用10种不同的重载方法,那么应该考虑一个请求对象

其他开发人员的论点:随着API的发展,您不应该继续添加参数。若您一直在API接口中添加参数,那个么您的API设计就会出现问题

这是一个相当幼稚的观点。所有API都在不断发展。这不是我们想要的东西,但告诉我一个客户/客户第一次就把规格做好了

请求/应答类型的参数非常好,因为很容易获得向后可比性。一旦创建了api的第二个版本,我们也不必修改现有代码

考虑这一点:

public class GetUserRequest
{
    string Id;
}

public class GetUserReply
{
  string Id;
  string DisplayName;
}
以及API接口:

public class MyCoolApi
{
    GetUserReply GetUser(GetUserRequest request);
}
(API的结构取决于实现的类型)

现在我们有了一个新的要求:所有用户都应该包括年龄

我们将遵循打开/关闭原则并继承reply类:

public class GetUserReply2 : GetUserReply
{
  string Id;
  string DisplayName;
  int Age;
}
所有版本1用户将反序列化版本1,而版本2用户将其反序列化为版本2

传入参数也是如此。您可以将服务(API)类设置为代理(代理模式),根据请求类的版本在后台调用正确的API实现


结论:相对于方法重载,请求/回复给了我们更多的灵活性。

不确定是否每个人都理解“响应/回复模式”的含义。我不。你能提供一些参考吗?@Sameer:他提供了:
97页的实用API设计
wiki上的响应/回复模式。
public class GetUserReply2 : GetUserReply
{
  string Id;
  string DisplayName;
  int Age;
}