我目前正在关注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指定Interfaces
和AbstractClasses
应以Interface
为后缀,前缀分别为Abstract
,但它没有提及域特定前缀/后缀。有什么意见/建议吗?
答案 0 :(得分:11)
这完全取决于您,因为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()
要容易得多。
<强>结论强>
您会发现这个决定很大程度上取决于您自己的需求和喜好。决定你自己哪一个更适合你。
答案 1 :(得分:4)
作为注释,还要考虑使用以下重构:
\Vendor\Client\Google
\Vendor\Client\GitHub
逻辑是:从不太具体到最不具体。