Java API设计中的响应/应答模式与方法重载
我最近设计了一个API来包装数据存储实现,并允许其他开发人员使用该API对他们的数据进行索引,并根据关键字查询数据库。我在查询方法中使用了响应/回复模式,因为Jaroslav Tulach提到,当需要添加参数时,它可以避免不断更改API接口(实用API设计第97页)。其他开发人员认为使用方法重载是更好的方法。你能分享你在设计中使用两种不同方法的经验吗?下面是我和其他开发人员之间的对话 我: 响应/回复模式看起来是一种干净的方式,因为随着API的发展,越来越多的参数可以添加到API接口中。在接口中使用超过10种重载方法可能会让其他开发人员感到困惑。他们是如何决定使用哪种方法的 其他开发商的观点: 随着API的发展,您不应该继续添加参数。若您一直在API接口中添加参数,那个么您的API设计就会出现问题。所以,重载方法的数量很少,所以不会打扰开发人员。此外,Java框架中经常会出现大量重载方法实现 我: 很容易管理API早期版本的向后兼容性。您不必更改接口。更改接口将破坏其他开发人员的现有代码 其他开发商的观点:Java API设计中的响应/应答模式与方法重载,java,design-patterns,Java,Design Patterns,我最近设计了一个API来包装数据存储实现,并允许其他开发人员使用该API对他们的数据进行索引,并根据关键字查询数据库。我在查询方法中使用了响应/回复模式,因为Jaroslav Tulach提到,当需要添加参数时,它可以避免不断更改API接口(实用API设计第97页)。其他开发人员认为使用方法重载是更好的方法。你能分享你在设计中使用两种不同方法的经验吗?下面是我和其他开发人员之间的对话 我: 响应/回复模式看起来是一种干净的方式,因为随着API的发展,越来越多的参数可以添加到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;
}