【发布时间】:2019-12-11 02:05:45
【问题描述】:
我正在编写与第 3 方 API 网关的集成,并且为了使其尽可能解耦(并且能够在将来更改提供程序),我创建了 3 个接口,其中包含用于从网关读取、写入和删除(因为我需要使用很多方法,所以我不想把所有东西都塞进一个大接口中,违反接口隔离原则)。 API Gateway 用于处理应用创建和其他 CRUD 操作。
而且我不确定前进的最佳方式是什么。我可以创建这样的界面
interface Api_Gateway_Create {
public function create_app( string $organization, string $developer_id, string $body );
// other methods.
}
然后,在做具体实现的时候,我会创建一个实现这个的类,当我需要使用它的时候,我需要提供三个参数。
这似乎有点束缚。如果更换提供程序时不再需要$developer_id 怎么办?我可以为所有参数设置一些默认值
interface Api_Gateway_Create {
public function create_app( string $organization,
string $developer_id = 'some-default-value',
string $body = 'some-default-value' );
// other methods.
}
但这意味着我最终会得到我可能不需要的参数,这可能会打乱我的实现。
最后想到的是我可以放一个可变参数,然后让实现处理参数
interface Api_Gateway_Create {
public function create_app( ...$arguments_list );
// other methods.
}
在我的实现中
class Create_App_Implementation1 implements Api_Gateway_Create {
public function create_app( ...$arguments_list ) {
list( $organization, $developer_id, $body ) = $arguments;
// Some business logic.
}
}
或
class Create_App_Implementation2 implements Api_Gateway_Create {
public function create_app( ...$arguments_list ) {
list( $organization, $app_key, $body ) = $arguments;
// Some business logic.
}
}
这样我就不需要关心我的提供者是否提供这些参数,因为我只会实现我需要的那些。
然而,这带来了另一个问题。在消费代码中,比如说一个将通过依赖注入使用create_app() 方法的类,我需要特别注意传递正确的值。这不是未来的证明,因为我还需要更改消费类中的代码(在我看来,这与接口的意图相反)。
使用第一个,我将永远不必更改使用代码,因为如果我期望相同的结果(基于相同的输入参数),我不在乎我正在使用哪个提供程序。但正如我已经提到的,这似乎有点限制。两个提供商可能有不同的处理方式。
是否有人不得不面对这种事情?处理这种事情的行业标准是什么?
我正在使用 PHP 编写代码,但我认为 Java 也可能适合它,因为它具有面向对象的特性。
【问题讨论】:
标签: java php interface implementation