假设我们想像这样使用下面的库:
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);
}
}
型
或者有更好的方法来防止耦合?或者是过度工程化?:)
1条答案
按热度按时间kmynzznz1#
如果是一个库,比如Redis客户端或者MongoDB客户端库,最好在基础架构层使用。将它们 Package 在接口中可以使代码解耦,但有时你无法消除依赖。
根据我使用MongoDB的经验,你的接口可能会被MongoDB驱动模型污染,因为库有很多模型来表达输出和输入。那么你有两个选择:
有时候你知道你不会改变第三方库。这有助于你接受与库的耦合。是的,你的项目将耦合到外部库,但只要你不想改变它,它就不会伤害你。
但是如果是外部服务,你应该使用ACL模式来防止你的项目被第三方服务逻辑污染。ACL模式建议为第三方服务定义一个接口,将客户端模型作为输入和输出,并在实现中将客户端模型转换为第三方模型。
这里有一些注意事项来决定是否将第三方库 Package 在接口中: