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

StackOverflow https://stackoverflow.com/questions/3424458

Вопрос

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

(*) Идеальным я имею в виду небольшие, краткие и четкие имена.

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

  1. есть а. DrawingUtils класс и а. DiagnosticsUtils Класс, но это просто пахнет плохой структурой.
  2. Выберите тезаурус и будьте сделаны с худшим, длительным или неловким именем, которые нередко все еще не взяты.
  3. Напишите названия классов на моем родном языке вместо английского языка.
  4. Попросите умных парней в Stackoverflow.

Я думаю, что варианты 1-3 не перспективны :(

РЕДАКТИРОВАТЬ:

Так как мой выбранный ответ не решает проблему окончательно (ни я не делаю), Что бы я порекомендовал людям, стоящим перед той же ситуацией, состоит в том, чтобы спросить себя: часто используете конфликтующие класс / пространство имен BCL? Если нет, то пусть ваше имя конфликтует (как я сделал с диагностикой). Если да, добавь слово, которое пределы Возможности вашего класса / пространства имен.

На практике это означает:
"Drawing": Что-то, что рисует.
"MyCustomControlDrawing": Что-то, что рисует Только на MyCustomControl. Отказ например: "WidgetDrawing".

Редактировать2:

Другое решение, чтобы посмотреть в следующий раз: Методы расширения (вежливость Газонокосилка).

Это было полезно?

Решение

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

using Type = MyReallyCoolCustomReflector.Type;

Теперь, если вы хотите все еще использовать тип типа из пространства имен системного типа:

System.Type sysType = anObject.GetType();

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

Другие советы

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

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

using MyAlias = My.Custom.Namespace;

Это будет держать ваши занятия отдельными от Microsoft.

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

MyAlias.Diagnostics

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

Для меня это действительно не стоит хлопотворно писать противоречивые названия классов. Вы путаете других разработчиков, которые не знакомы с вашей кодовой базой, потому что они ожидают использовать классы BCL, но в конечном итоге с вашим вместо этого (или наоборот). Тогда вы просто тратите свое время, когда они должны писать конкретные using псевдонимы.

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

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

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


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

Пример:

Если вы создаете математический класс, вы можете назвать ваши 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;
        }
    }
}

Только для записи: .NET Framework не имеет ни Utils ни Diagnostics класс. (Но имеет ли у System.Diagnostics пространство имен.)

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

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

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

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

В целом:

  1. Это то, что мы делаем (эй, мы можем ревертировать его позже)

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top