Что мне следует делать, если у меня одно и то же имя класса в разных пространствах имен?
-
03-07-2019 - |
Вопрос
Я работаю над проектом и пришел к следующему проблема с именованием.
Я бы хотел реализовать фабричный шаблон, но я не знаю, какие названия классов лучше всего использовать (я меняю одно на другое, и это отнимает довольно много времени: S).
Обычно я предпочитаю разделять пространства имен Группы классов, но мой проблема именно с этим конкретным фрагментом кода:
class Mesh
{
...
};
namespace Factory
{
class Mesh
{
...
};
}
...
Factory::Mesh meshFactory;
Mesh *mesh = meshFactory.create(...);
Мой проблема заключается в том, что если я использую эту структуру, я могу перепутать классы сетки (будь то фабричный класс или фактический класс сетки).На самом деле, это упрощение, моя проблема связана с еще несколькими пространствами имен, и классы с одинаковыми именами используются в обоих пространствах имен.
Я думал о том, чтобы, возможно, использовать суффиксы для разделения классов и поместить их, например, в одно пространство имен:
class Mesh
{
...
};
class MeshFactory
{
...
};
MeshFactory meshFactory;
Mesh *mesh = meshFactory.create(...);
Так что нет никакой путаницы в том, что делает каждый класс.
Мне не нравится простое решение, которое заключается в использовании разных пространств имен и изобретении разных имен, потому что в конечном итоге я бы использовал имя пространства имен, чтобы дифференцировать их:
class Mesh
{
...
};
namespace Factory
{
class MeshFactory // I can't figure a better different name
{
...
};
}
Я предпочитаю второй вариант.
Есть ли веская причина, почему лучше первый вариант?Или есть другой способ?Что говорят по этому поводу лучшие практики?
Решение
По каким причинам вы назвали класс Mesh "Mesh"?
У класса фабрики, который создает экземпляр Mesh, одни и те же причины?
Если это так, то они должны быть одного класса с одинаковым именем.
Если это не так, то это должны быть разные классы с разными именами.
Поскольку вполне вероятно, что единственной целью фабричного класса будет создание экземпляров класса Mesh, я предлагаю вам назвать его MeshFactory. Р>
Пространство имен не имеет отношения.
Другие советы
Запомните это золотое правило "лучших практик" в ОО-дизайне: наименование ваших классов легко составляет 50% от дизайнерского решения. Если у вас возникают проблемы с именами сущностей, это свидетельствует о том, что у вас нет четкой концептуальной модели.
Вы должны полностью соответствовать требованиям при использовании.Используйте псевдонимы, если ваши полные имена слишком длинные.
a.Сетка b.Сетка
В целом и в .NET (особенно в C #) я бы переназначил класс, если бы не было никакого способа обойти его (а именно, от третьей стороны):
using MyMesh = My.Mesh;
using FooMesh = Foo.Mesh;
За исключением того, что вы явно НЕ говорите на C # (вопрос должен быть помечен c ++), я бы использовал полное пространство имен при обращении к ним. Хотя неудобно набирать его, достаточно одной ошибки, чтобы быть хлопотом.