Одинаковые имена классов в разных пространствах имен - PullRequest
10 голосов
/ 19 апреля 2011

У меня есть два разных пространства имен с множеством классов с одинаковыми именами.Я полагаю, что некоторый код облегчит понимание:

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
    {
         // ...
    }
}

... но, ИМХО, это своего рода побеждаетцель, так как существует избыточность в идентификации.Зачем мне префикс / изменение имен классов, если пространство имен уже создает логический барьер?

Итак, что вы, люди, думаете?Должен ли я сохранять одинаковые имена, так как они находятся в разных пространствах имен, или мне следует префиксировать / изменить имена классов, чтобы упростить идентификацию источника и избежать конфликтов, если кто-то хочет использовать оба пространства имен вместе?Спасибо!

Ответы [ 6 ]

16 голосов
/ 19 апреля 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();

Спасибо, Лучано Баргманн

10 голосов
/ 19 апреля 2011

Это сложный вопрос, ИМО.Чтобы ответить на этот вопрос хорошо, вам нужно знать, как часто люди могут использовать оба пространства имен одновременно, и как они раздражаются, когда им приходится ставить префикс перед всем пространством имен.

Я лично склоняюсь к «разным»имена».Я думаю о пространствах имен как о механизме, ограничивающем набор имен, видимых в коде, и о защите от маловероятного события, когда имена конфликтуют даже внутри этого сокращенного набора.Так что держать конфликт "маловероятным" важно.Поэтому я лично не стал бы проектировать с конфликтом нарочно.

Тем более, что в вашем случае разница настолько мала: BaseOperator лишь чуть короче BasePsOperator.

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

Мое мнение, вы должны использовать схему именования, отражающую специализацию.

Я имею в виду, вам не нужно думать о том, является ли это префиксом, суффиксом или любым другим. Просто напишите имена, которые могут четко идентифицировать классы.

Честно говоря, я верю, что пространство имен не заменит правильную схему именования классов, потому что пространства имен - это организационная вещь, а классы - часть того, что делает ваша программа.

Итак, в конце дня я бы выбрал второй вариант: специализированное именование пространств имен и классов.

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

Если между двумя предлагаемыми базовыми классами нет функциональных или интерфейсных различий, возможно, создайте другое общее пространство имен с базовым оператором в нем - и просто определите его один раз.

2 голосов
/ 18 октября 2012

Разные пространства имен - это просто ... Разные , имя , пробелы , так что вам вообще не нужно беспокоиться о дубликате имена через границы пространства имен .

Однако вам следует помнить об использовании. например вы создаете многоуровневое приложение со множеством разных слоев (в разных пространствах имен), вам не нужно дублировать имена классов, которые могут быть общими для всех слоев.

Если вы чувствуете, что целесообразно использовать двойные имена между пространствами имен, вы всегда можете использовать удобные операторы using для переименования в потребляющих классах, например,

у вас есть два пользовательских класса:

Data.Entities.User;
App.Core.User;

И хотите использовать их там же ...

Вы можете использовать простое выражение, например

.
using HttpUser = App.Core.User; 

Для псевдонима одного из них, чтобы избежать полной квалификации и избежать путаницы.

1 голос
/ 19 апреля 2011

Разработчики, поддерживающие код после того, как вы оцените его, если попытаетесь избежать дублирования имен классов. Просто сложно сразу понять, какой класс используется.

...