我们正在构建一个 Java SDK 来简化对我们提供 REST API 的服务之一的访问。此 SDK 供第 3 方开发人员使用。
问题之一是找到一种表示每个请求的可选参数的好方法。
假设我们有 rest 端点:GET /photos
它有几个可选参数:sortBy
、pageSize
、pageNumber
等。
一种解决方案是接受 aMap<String,String>
作为代表该休息调用的 api 方法的参数。
interface RestService {
public List<Photo> getPhotos(Map<String,String> parameters);
}
这个解决方案有几个问题:
- 该方法的签名没有向开发人员提供有关此方法可用的可选参数的名称(以及有效值)的信息。他需要查阅 REST api 文档,理想情况下我们希望避免这样做。
- 开发人员最终会为他将调用的方法创建几个带有参数的 Map,并在各处硬编码参数的名称和值。这意味着如果它们发生变化,修复它们将很麻烦。
另一种解决方案是使用包含可选参数信息的 Options 对象。我们甚至可以使用构建器模式来构建这个对象。
这就是方法签名的样子:
interface RestService {
public List<Photo> getPhotos(PhotosOptions options);
}
开发人员现在知道什么是可用的可选参数,并且可以轻松地构建PhotosOptions
这样的:
PhotosOptions options = PhotosOptions.builder().sortBy(DESC).pageSize(200).build();
List<Photo> photos = getPhotos(options);
问题是我们试图用 SDK 覆盖的服务有大量需要我们实现的请求,而且几乎所有请求都有不同的选项列表,它们允许。这可能会导致大量的 Options 类。
这里最好的解决方案是什么?为每个组合构建一个 Options 对象(及其构建器)?继承在这里并没有太大帮助,因为我有各种参数组合。