5

我目前关注 PSR-2 和 PSR-4。在尝试命名几个类时,我遇到了一个小难题。这是一个例子。

我有一个基本的 REST 客户端,\Vendor\RestClient\AbstractClient. 我有这个抽象客户端的两个实现:

  • \Vendor\GoogleClient\GoogleClient
  • \Vendor\GithubClient\GithubClient

由于命名空间已经指定了域,因此客户端类的命名是否多余?我应该改为命名我的课程:

  • \Vendor\GoogleClient\Client
  • \Vendor\GithubClient\Client

这意味着客户端代码将始终使用以下内容:

use Vendor\GoogleClient\Client;

$client = new Client();

这比:

use Vendor\GoogleClient\GoogleClient;

$client = new GoogleClient();

但是第一个选项允许我们通过仅更改 use 语句轻松地换出实现。

PSR4 指定InterfacesandAbstractClasses应该分别加上后缀Interface和前缀Abstract,但它没有说明域特定的前缀/后缀。有什么意见/建议吗?

4

2 回答 2

12

这完全取决于您,因为 PSR 中对此没有命名约定。但是你必须记住你的决定是如果你决定

  • \Vendor\GoogleClient\Client
  • \Vendor\GithubClient\Client

并且您喜欢同时使用它们(使用use

use Vendor\GoogleClient\Client;
use Vendor\GithubClient\Client;

$client = new Client();

你会遇到一个错误,因为Client它不是唯一的。

当然,您仍然可以像这样立即使用它们

use Vendor\GoogleClient\Client as GoogleClient;
use Vendor\GithubClient\Client as GithubClient;

$client1 = new GoogleClient();
$client2 = new GithubClient();

或没有use喜欢

$client1 = new Vendor\GoogleClient\Client();
$client2 = new Vendor\GithubClient\Client();

但是,如果您计划程序员可以通过更改从

use Vendor\GoogleClient\Client;
$client = new Client();

use Vendor\GithubClient\Client;
$client = new Client();

new GoogleClient()这比将所有语句也更改为要容易得多new GithubClient()

结论
你看到这个决定很大程度上取决于你自己的需要和喜好。自己决定哪一个更适合你。

于 2016-01-08T09:23:09.053 回答
5

请注意,还可以考虑使用以下方法进行重构:

  • \Vendor\Client\Google
  • \Vendor\Client\GitHub

逻辑是:从不太具体到最具体。

话虽如此,这通常是不可能的。

于 2018-02-12T21:53:54.250 回答