Соглашение об именовании классов пространства имен 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 соответственно, но в нем ничего не говорится о префиксах/суффиксах, специфичных для домена. Есть какие-нибудь мнения/предложения?

Author: Pᴇʜ, 2015-12-18

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().

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

 11
Author: Pᴇʜ, 2016-01-08 09:23:09

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

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

Логика такова: от менее конкретного к наиболее конкретному.

 2
Author: Valerio Bozz, 2018-02-12 21:53:54