Что мне делать, если у меня одинаковое имя класса в разных пространствах имен? - PullRequest
0 голосов
/ 03 мая 2009

Я работаю над проектом и столкнулся со следующей проблемой именования .

Я хотел бы реализовать шаблон фабрики, но я не знаю, какие наименования классов лучше всего использовать (я переключаюсь с одного на другое, и это довольно много времени: S).

Обычно я использую пространства имен для разделения групп классов, но моя проблема заключается в следующем фрагменте кода:

class Mesh
{
    ...
};
namespace Factory
{
    class Mesh
    {
        ...
    };
}
...
Factory::Mesh meshFactory;
Mesh *mesh = meshFactory.create(...);

Моя проблема в том, что, если я использую эту структуру, я могу смешивать классы Mesh (будь то фабричный класс или фактический класс Mesh). На самом деле это упрощение, моя проблема связана с еще несколькими пространствами имен, и классы с одинаковыми именами используются в обоих пространствах имен.

Я думал об использовании суффиксов для разделения классов и помещения их в одно и то же пространство имен, например:

class Mesh
{
     ...
};
class MeshFactory
{
     ...
};
MeshFactory meshFactory;
Mesh *mesh = meshFactory.create(...);

Так что нет никакой путаницы в том, что делают каждый класс.

Мне не нравится простое решение, которое состоит в том, чтобы использовать разные пространства имен и придумывать разные имена, потому что я бы в конечном итоге использовал имя пространства имен, различая их:

class Mesh
{
    ...
};
namespace Factory
{
    class MeshFactory // I can't figure a better different name
    {
        ...
    };
}

Я предпочитаю второй вариант.

Есть ли веская причина, почему лучше первый вариант? Или есть другой способ? Что лучшие практики говорят об этом?

Ответы [ 4 ]

1 голос
/ 03 мая 2009

Запомните это золотое правило «лучших практик» в ОО-дизайне: наименование ваших классов легко составляет 50% от дизайнерского решения. Если у вас возникают проблемы с именами сущностей, это свидетельствует о том, что у вас нет четкой концептуальной модели в уме.

0 голосов
/ 03 мая 2009

Вы должны полностью соответствовать требованиям при использовании. Используйте псевдонимы, если ваши полные имена слишком длинные.

a.Mesh b.Mesh

0 голосов
/ 03 мая 2009

В целом и в .NET (особенно C #) я бы переназначил класс, если бы не было абсолютно никакого способа обойти его (а именно, от третьей стороны):

using MyMesh = My.Mesh;
using FooMesh = Foo.Mesh;

За исключением того, что вы явно НЕ говорите на C # (вопрос должен быть помечен c ++), я бы использовал полное пространство имен при обращении к ним. Хотя это неудобно набирать, нужно всего одна ошибка, чтобы быть хлопотом.

0 голосов
/ 03 мая 2009

По каким причинам вы назвали класс Mesh "Mesh"?

Имеет ли тот же класс фабрики, который создает экземпляр Mesh, одинаковые причины?

Если это так, то они должны быть одного класса с тем же именем.

Если это не так, то это должны быть разные классы с разными именами.

Поскольку вполне вероятно, что единственной целью фабричного класса будет создание экземпляров класса Mesh, я предлагаю вам назвать его MeshFactory.

Пространство имен не имеет значения.

...