Соглашение об именах классов пространства имен 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();

Но первый вариант позволяет нам легко менять реализации, только изменяя оператор использования.

PSR4 указывает, что Interfaces а также AbstractClasses должен быть дополнен Interface и с префиксом Abstract соответственно, но ничего не говорит о доменных префиксах / суффиксах. Есть мнения / предложения?

3

Решение

Это полностью зависит от вас, так как в 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() тоже.

Заключение
Вы видите, что это решение во многом зависит от ваших собственных потребностей и симпатий. Решите сами, какой из них лучше для вас.

11

Другие решения

Как примечание, также рассмотрите возможность рефакторинга, используя:

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

Логика такова: от менее конкретной к самой.

3

По вопросам рекламы [email protected]