Идентичные имена классов в разных пространствах имен
Автор вопроса: Ricardo NoldeОтветов: 6
У меня есть два разных пространства имен с множеством классов с одинаковыми именами. Я считаю, что некоторый код облегчит понимание:
namespace Print.Pdl.PostScript.Operators
{
public abstract class BaseOperator : IOperator
{
// ...
}
}
namespace Print.Pdl.Pcl6.Operators
{
public abstract class BaseOperator : IOperator
{
// ...
}
}
Базовая реализация одинакова, поскольку PostScript и PCL имеют схожие конструкции. Таким образом, оба пространства имен имеют одинаковые имена для нескольких классов.
Я склоняюсь к следующему...
namespace Print.Pdl.PostScript.Operators
{
public abstract class BasePsOperator : IPsOperator
{
// ...
}
}
namespace Print.Pdl.Pcl6.Operators
{
public abstract class BasePclOperator : IPclOperator
{
// ...
}
}
... но, ИМХО, это как бы противоречит цели, так как в идентификации есть избыточность. Зачем мне префикс/изменение имен классов, если пространство имен уже создает логический барьер?
Итак, что вы думаете? Должен ли я сохранить идентичные имена, поскольку они находятся в разных пространствах имен, или я должен префикс/изменить имена классов, чтобы упростить идентификацию источника и избежать конфликтов, если кто-то захочет использовать оба пространства имен вместе?
Спасибо!
На этот вопрос действительно есть ответ? Или это дело вкуса? Ricardo Nolde 25.04.2011
Я не думаю, что вы должны жертвовать архитектурой в пользу удобочитаемости. Я считаю, что более интуитивно понятно, если вы сохраняете те же имена классов, поскольку это упрощает переход с PCL на PostScript и наоборот.
Если вам нужно использовать оба класса в одном файле кода, создайте псевдоним для пространства имен. Будет очень ясно читать:
using Pcl = Print.Pdl.Pcl6.Operators;
using PostScript = Print.Pdl.PostScript.Operators;
...
// use PCL
Pcl.BaseOperator.DoSomething();
// Use PostScript
PostScript.BaseOperator.DoSomething();
Спасибо, Лучано Баргманн.
Ответ 2 · рейтинг 10 · Roman Starkov
Имхо сложный вопрос. Чтобы правильно ответить на него, вам нужно знать, как часто люди могут использовать оба пространства имен одновременно и как их раздражает необходимость добавлять ко всему пространству имен префикс.
Лично я склоняюсь к "разным именам". Я думаю о пространствах имен как о механизме ограничения набора имен, видимых в коде, и о защите от маловероятного случая, когда имена конфликтуют даже в этом сокращенном наборе. Так что сохранение столкновения "маловероятно" важно. Поэтому я лично не стал бы специально создавать коллизию.
Тем более, что в вашем случае разница так мала: BaseOperator лишь чуть короче, чем BasePsOperator.
Ответ 3 · рейтинг 6 · MemeDeveloper
Разные пространства имен - это просто... Разные, имя, пространствапоэтому вам вообще не стоит беспокоиться (как правило) о дублировании имена за пределами пространства имен.
Тем не менее, вы должны осознавать использование. например вы создаете многоуровневое приложение со многими разными слоями (в разных пространствах имен), вы не хотели бы дублировать имена классов, которые могут быть общими для разных слоев.
Если вы считаете разумным использовать повторяющиеся имена между пространствами имен, вы всегда можете использовать удобные операторы using для переименования в потребляющих классах, например.
у вас есть два класса пользователей:
Data.Entities.User;
App.Core.User;
И хочу использовать их в одном и том же месте...
Вы можете использовать простой оператор using, такой как
using HttpUser = App.Core.User;
Псевдоним одного из них и, таким образом, избегая полной квалификации и избегая путаницы.
Ответ 4 · рейтинг 3 · Tim Barrass
Если между двумя предложенными базовыми классами нет функциональной или интерфейсной разницы, то, возможно, создайте другое общее пространство имен с BaseOperator в нем - и просто определите его один раз.
Ответ 5 · рейтинг 3 · Matías Fidemraizer
Я считаю, что вы должны использовать схему именования, отражающую специализацию.
Я имею в виду, что вам не нужно думать о том, является ли это префиксом, суффиксом или любым другим. Просто напишите имена, которые могут четко идентифицировать классы.
Честно говоря, я считаю, что пространство имен не заменит правильную схему именования классов, потому что пространства имен - это организационная вещь, а классы - часть того, что делает ваша программа.
Итак, в конце концов, я бы выбрал второй вариант: специализированное именование пространств имен и классов.
Ответ 6 · рейтинг 1 · tster
Разработчики, поддерживающие код после вас, оценят, если вы попытаетесь избежать дублирования имен классов. Это просто затрудняет определение с первого взгляда, какой класс используется.