gpt4 book ai didi

java - 如何在 API 设计中引入特殊情况?

转载 作者:行者123 更新时间:2023-12-04 06:59:10 25 4
gpt4 key购买 nike

我正在为客户使用的库开发 API。

该库应提供单一接口(interface)来访问多个远程资源。所以,我应该创建 API 及其几个实现(对应于远程资源的数量)。

我遇到了下一个问题:除一个之外的所有资源都有用于登录的 API。所以,我可以创建方法

void authenticate (String login, String password) throws AuthenticationException;

但是我无法使用这种方法将身份验证传递给那个资源。

要通过该资源的身份验证,我需要执行一些操作并接收用于身份验证的 URL,然后我应该将此 URL 提供给调用者,调用者程序使用一些魔法来通过身份验证,然后它应该给我返回“流程”。

所以现在我需要另外两种方法来获得必要的结果:
String getAuthenticationURL () throws AuthenticationException;
void postAuthentication () throws AuthenticationException;

如果我将这些方法添加到 API,那么我将不得不在所有 API 实现中为“正常”资源创建它们的空实现(或引发 RuntimeException 的实现)。

如果我不将它们添加到 API 中,而仅将它们添加到一个具体的实现中,那么我将打破统一 API 的整个想法。

这两种方法的方法只是至少几种可能的解决方案之一。因此,欢迎任何意见和建议。

最佳答案

您可以有一个带有两个具体子类的抽象基类——每个子类都包含不同的身份验证机制。

然而,另一种(可能更好)方法可能是创建一个具有两个 API(两个具体实现)的抽象“身份验证”对象。一个将拥有您的身份验证方法,另一个将拥有您的 get/post。

这里的优点是您的身份验证类包含特定于身份验证的所有功能。甚至可能在作为两个身份验证对象的抽象父类的类中包含一些代码。

如果您愿意,您仍然可以保留您的身份验证方法,它的实现将简单地委托(delegate)给身份验证对象。

请注意,这也为您的用户提供了一个更“最小”的 api,而扩展您的原始界面为您提供了一个完整的第二个复制和粘贴类来考虑。

此外,考虑将正确构造的身份验证对象传递给原始类的构造函数。打造一个漂亮、干净的系统。

每当我像这样将一个功能分解成它自己的类时,我总是会获得一些很好的重构可能性。

关于java - 如何在 API 设计中引入特殊情况?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2150517/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com