Организация пространства имен PHP, именование - PullRequest
2 голосов
/ 28 апреля 2011

Я столкнулся со следующей проблемой:

  • У меня есть пространство имен Exception\*, которое содержит несколько типов исключений.

  • Iиметь пространство имен Exception\User\*, которое содержит особые виды исключений (Forbidden, LoggedOut ...).

Куда поместить User базовый класс исключений, расширенный на Forbidden и LoggedOut:

  • Exception\User, т. Е. В пространстве имен Exception\* (лучше полное имя)?
  • Exception\User\User, то есть в пространстве имен Exception\User\* (более согласованно)?
  • Exception\User\Exception, т. Е. Я переименую его в "базовое" исключение пространства имен Exception\User\* (странное)?

Примечание: класс исключений User не является абстрактным.

Точность: я использовал пример с исключениями, это всего лишь пример.Мне действительно интересно, куда поместить / как назвать базовый класс в дереве пространства имен.

Спасибо, если вы можете мне помочь!

Ответы [ 2 ]

3 голосов
/ 28 апреля 2011

Как вы разрабатываете свой код, действительно зависит от вас.Однако были некоторые ребята, которые уже подумали об этом и определили стандарт PSR-0 .Вообще ваша концепция кажется не очень полезной.Если что-то пойдет не так в пространстве имен \My\Space (я думаю), все ожидают исключения из этого пространства имен.Соответствующие try-catch -предложения проще конструировать, если между причиной и самим исключением существует логическая связь.

try {
    $x = new \My\Space\Class;
    $x->doSomething();
} catch (\My\Space\SomethingWentWrongException $e) {
    // something went wrong
} catch (\My\Space\Exception $e) {
    // something unexpected from this namespace went wrong
}

Обновление (отражает точность вопроса):

Я думаю, что есть (скажем, 2.5);) Вы можете поместить базовый класс в пространство имен, где он обычно используется / реализован / расширен, например, *\Filter\FilterInterface и *\Filter\ConcreteFilter.Другое решение состоит в том, чтобы поместить его на один уровень вверх (*\Filter) и либо дать имя под-пространству имен после интерфейса / базового класса, либо просто назвать его как-нибудь еще (это половина решения).Я предпочитаю последний, например, интерфейс *\Filter и конкретный класс *\filters\SomeFilter (и да, мои пространства имен в нижнем регистре;)).

Суть в том, что вы остаетесь с вашим решением.Не перепутайте несколько «стилей».

1 голос
/ 08 июня 2011
Exception\User
Exception\User\Forbidden
Exception\User\LoggedOut
...