Должен ли я использовать (в противном случае оптимальные) имена классов, которые конфликтуют с именами .NET BCL?

Эта ситуация, вероятно, не редкость для некоторых из вас: у вас есть некоторые функциональные возможности для добавления в класс, но идеальное имя (*) для этого класса занято одним из классов в пространстве имен System или другом пространстве / классе имен, которое не принадлежит вам, но вы используя / import ing.

(*) Под идеальным я подразумеваю маленькие, краткие и ясные имена.

Например, у меня есть Utils класс, который имеет класс Diagnostics (главным образом, утилиты отладки) и класс Drawing . Я мог бы:

  1. иметь класс DrawingUtils и класс DiagnosticsUtils , но это просто пахнет как плохая структура.
  2. Выберите тезаурус и покончите с более худшим, длинным или неловким именем, которое по-прежнему не принято.
  3. Напишите названия классов на моем родном языке вместо английского. Методы расширения (любезно предоставлено Газонокосилка ).

10
задан Community 23 May 2017 в 12:13
поделиться

7 ответов

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

using Type = MyReallyCoolCustomReflector.Type;

Теперь, если вы хотите использовать класс Type из пространства имен System:

System.Type sysType = anObject.GetType();

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

4
ответ дан 3 December 2019 в 16:08
поделиться

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

8
ответ дан 3 December 2019 в 16:08
поделиться

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

using MyAlias = My.Custom.Namespace;

это позволит отделить ваши классы от классов Microsoft.

вы можете ссылаться на свои классы как

MyAlias.Diagnostics

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

6
ответ дан 3 December 2019 в 16:08
поделиться

Что ж, если вы хотите избежать столкновения пространств имен, вы можете сделать несколько вещей:


  • Не сталкиваться, вместо этого выберите уникальное имя.

Пример:

Если вы создаете математический класс, вы можете назвать свой CamiloMartin.MathHelper


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

Пример:

public class MyClass
{
    public int SomeCalculation(int a, int b)
    {
        return MyNamespace.Math.SomeFunc(a, b);
    }
}

  • Использование псевдонима для различения.

Пример:

using System.Math;
using SuperMath = MyNamespace.Math;

namespace MyNamespace
{
    public class MyClass
    {
        public int SomeCalc(int a, int b)
        {
             int result = Math.abs(a);
             result = SuperMath::SomeFunc(a, b);

             return result;
        }
    }
}
1
ответ дан 3 December 2019 в 16:08
поделиться

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

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

РЕДАКТИРОВАТЬ : Я также не верю, что «маленький» является компонентом «идеального» идентификатора. Лаконично и ясно, конечно, но если требуется более длинное имя, чтобы передать цель конкретной конструкции, пусть будет так. В конце концов, у нас есть intellisense.

5
ответ дан 3 December 2019 в 16:08
поделиться

Часто можно выбрать более конкретное имя. Возьмем, к примеру, Utils. Абсолютно все можно назвать утилитой. Для читателя вашего кода это имя класса ничего не стоит.

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

В общем:

  1. Вот что мы делаем (эй, мы можем рефакторить это позже)

  2. Использовал это один или два раза, но только для важных классов. Особенно полезно, если вы еще не знаете "идеального" имени.

  3. Даже не думайте об этом...

Использование псевдонимов пространств имен - это не весело. Поэтому я избегаю этого, если могу.

1
ответ дан 3 December 2019 в 16:08
поделиться

Для справки: .NET framework не имеет ни Utils , ни Diagnostics класса. (Но имеет пространство имен System.Diagnostics .)

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

В остальном - я согласен с другими в том, что пространства имен удобны. (Хотя я дважды подумал бы назвать класс, если в System уже есть класс с таким же именем, не из-за конфликтов имен, а скорее потому, что я не могу использовать «исходный» класс может означать, что класс, который я собираюсь создать, семантически отличается.)

1
ответ дан 3 December 2019 в 16:08
поделиться
Другие вопросы по тегам:

Похожие вопросы: