#c# #.net #naming-conventions
#c# #.net #соглашения об именовании
Вопрос:
У меня есть два разных пространства имен с множеством классов с одинаковыми именами. Я полагаю, что некоторый код облегчит понимание:
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
{
// ...
}
}
… но, ИМХО, это отчасти противоречит цели, поскольку в идентификации присутствует избыточность. Зачем мне добавлять префикс / изменять имена классов, если пространство имен уже создает логический барьер?
Итак, что вы, люди, думаете? Должен ли я сохранить идентичные имена, поскольку они находятся в разных пространствах имен, или мне следует добавить префикс / изменить имена классов, чтобы упростить идентификацию источника и избежать конфликтов, если кто-то захочет использовать оба пространства имен вместе?
Спасибо!
Комментарии:
1. Действительно ли на этот вопрос есть ответ? Или это дело вкуса?
Ответ №1:
Nolde,
Я не думаю, что вы должны жертвовать архитектурой в пользу удобочитаемости. Я считаю, что это более интуитивно понятно, если вы сохраняете одни и те же имена классов, поскольку это упрощает переключение с PCL на PostScript и наоборот.
Если вам нужно использовать оба класса в одном файле кода, создайте псевдоним для пространства имен. Это будет очень понятно для чтения:
using Pcl = Print.Pdl.Pcl6.Operators;
using PostScript = Print.Pdl.PostScript.Operators;
...
// use PCL
Pcl.BaseOperator.DoSomething();
// Use PostScript
PostScript.BaseOperator.DoSomething();
Спасибо,
Лучано Баргманн
Комментарии:
1. Мне также нравятся псевдонимы. Может быть, разные разработчики будут использовать разные псевдонимы для этих пространств имен? ДА. Но я не вижу в этом серьезной проблемы с удобочитаемостью. Что касается использования обоих пространств имен в одном файле, это также не должно быть проблемой, поскольку это сгенерировало бы ошибку, сообщающую, что BaseOperator неоднозначен.
2. Я отчасти согласен, но действительно ли это «проблема архитектуры»? Ничего не изменится в том, как работают классы или как они будут соотноситься с другими классами. Меняется только название. Должен ли я действительно беспокоиться об этом?
Ответ №2:
Это сложный вопрос, ИМО. Чтобы правильно ответить на этот вопрос, вам нужно знать, как часто люди, вероятно, будут использовать оба пространства имен одновременно, и как их раздражает необходимость ставить перед всем префиксом пространство имен.
Лично я склоняюсь к «разным именам». Я думаю о пространствах имен как о механизме ограничения набора имен, видимых в коде, и защите от маловероятного события, когда имена конфликтуют даже внутри этого сокращенного набора. Поэтому важно сохранять «маловероятное» столкновение. Поэтому я лично не стал бы специально проектировать с конфликтом.
Тем более, что в вашем случае разница настолько мала: BaseOperator
это всего лишь немного короче, чем BasePsOperator
.
Комментарии:
1. Это действительно зависит от того, как часто классы в пространствах имен будут создаваться в одном классе. Если это случается не часто, то можно присвоить им одинаковые имена. Кроме того, помните, что вы не совсем уверены в своем решении: в Visual Studio есть несколько достойных инструментов рефакторинга, которые помогут вам переименовать ваши классы, если вы позже передумаете.
2. Но с возможностью создания псевдонима пространства имен в C #, разве я не должен предоставить программистам использовать
using Print.Pdl.PostScript.Operators = PsOps
вместо изменения имен? И помните, что выше приведен лишь один пример: существует несколько классов с одинаковыми именами.3. @Charlie Ну, почти — это зависит от того, как часто вы «используете» оба пространства имен одновременно . Даже если вы создаете экземпляр Ps.Operator только один раз, наличие пространств имен Ps и Pcl в «using» вынудит вас выписать «Operator» вместе с пространством имен.
4. @Ricardo да, но это делает код менее читаемым. Программист первый вызывает это
PsOps
, программист второй вызывает этоPs
. Таким образом, в файле 1 естьPsOps.Operator
и в файле 2 естьPs.Operator
. Это плохо сказывается на удобочитаемости.5. @Tim На самом деле, это одно и то же, в разных контекстах. 🙂
Ответ №3:
Разные пространства имен — это просто так… Разные имена, пробелы , поэтому вам вообще не стоит беспокоиться (как правило) о дублирующихся именах через границы пространства имен.
Однако вы должны быть внимательны к использованию. например, вы создаете многоуровневое приложение с множеством разных слоев (в разных пространствах имен), вам не хотелось бы дублировать имена классов, которые могут быть общими для разных слоев.
Если вы считаете разумным использовать повторяющиеся имена между пространствами имен, вы всегда можете использовать удобные инструкции using для переименования в используемых классах, например
у вас есть два пользовательских класса :
Data.Entities.User;
App.Core.User;
И хотите использовать их в одном и том же месте…
Вы можете использовать простой оператор using, такой как
using HttpUser = App.Core.User;
Присвоить псевдоним одному из них и таким образом избежать полной квалификации и избежать любой путаницы.
Ответ №4:
Если между двумя предлагаемыми базовыми классами нет функциональной или интерфейсной разницы, то, возможно, создайте другое, общее пространство имен с BaseOperator в нем — и просто определите его один раз.
Комментарии:
1. Это хороший совет, но здесь это не тот случай — эти классы семантически похожи, поскольку PostScript и PCL6 имеют схожую структуру, но они ведут себя достаточно по-разному, чтобы сделать единый класс непрактичным.
Ответ №5:
Мое мнение таково, что вам следует использовать схему именования, отражающую специализацию.
Я имею в виду, что вам не нужно думать о том, является ли это префиксом, суффиксом или любым другим. Просто напишите имена, которые могут четко идентифицировать классы.
Честно говоря, я считаю, что пространство имен не заменило бы правильную схему именования классов, потому что пространства имен — это организационная вещь, в то время как классы являются частью того, что делает ваша программа.
Итак, в конце концов, я бы выбрал ваш второй вариант: специализированное именование пространств имен и классов.
Ответ №6:
Разработчики, поддерживающие код после вас, будут признательны, если вы попытаетесь избежать дублирования имен классов. Просто с первого взгляда трудно определить, какой класс используется.