想象我们要像这样使用以下库:
use GrahamCampbell\GitHub\GitHubManager;
class Foo
{
private GitHubManager $github;
public function __construct(GitHubManager $github)
{
$this->github = $github;
}
public function bar(): array
{
$this->github->issues()->show('GrahamCampbell', 'Laravel-GitHub', 2);
}
}
创建这样的界面是否有意义:
interface GitHubManagerInterface
{
public function showIssues(): array;
}
然后实现它并将实现绑定到接口并在我的代码中使用它,如下所示?
class Foo
{
private GitHubManagerInterface $github;
public function __construct(GitHubManagerInterface $github)
{
$this->github = $github;
}
public function bar(): array
{
$this->github->showIssues('GrahamCampbell', 'Laravel-GitHub', 2);
}
}
或者有更好的方法来防止耦合?还是工程已经过时了? :)
如果是库,比如Redis客户端或者MongoDB客户端库,最好在基础设施层使用它们。将它们包装在接口中将使您的代码解耦,但有时您无法消除依赖关系。
根据我使用 MongoDB 的经验,您的界面可能会受到 MongoDB 驱动程序模型的污染,因为该库有许多模型来表达输出和输入。那么你有两个选择:
有时您知道您不会更改第 3 方库。它可以帮助您接受与库的耦合。是的,您的项目将耦合到外部库,但只要您不想更改它,它就不会伤害您。
但是如果它是外部服务,您应该使用ACL模式来防止您的项目受到第三方服务逻辑的污染。 ACL 模式建议为第 3 方服务定义一个接口,将客户端模型作为输入和输出,并在实现中将客户端模型转换为第 3 方模型。
以下是一些决定是否将第三方库包装在界面中的注意事项: