Соглашение об именовании классов пространства имен PHP
В настоящее время я следую 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
соответственно, но в нем ничего не говорится о префиксах/суффиксах, специфичных для домена. Есть какие-нибудь мнения/предложения?
2 answers
Это полностью зависит от вас, так как в 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()
.
Заключение
Вы видите, что это решение во многом зависит от ваших собственных потребностей и предпочтений. Решите сами, какой из них лучше для вас.
В качестве примечания также рассмотрите возможность рефакторинга с использованием:
\Vendor\Client\Google
\Vendor\Client\GitHub
Логика такова: от менее конкретного к наиболее конкретному.