Соглашение об именах .NET Collection - PullRequest
16 голосов
/ 14 июля 2009

Мы с коллегой обсуждали, как называть Коллекции.

Например:

Продукт класса - Коллекция - Продукты класса

или

Класс Product - Коллекция - Класс ProductCollection

Я осмотрелся вокруг, чтобы увидеть, вижу ли я какие-либо указания или причины для использования того или иного, но, кажется, ничего не происходит. Каркас, кажется, использует оба варианта, например. Аргумент, который я вижу, состоит в том, что класс, имеющий переменную коллекции products, должен называться Products, но он должен иметь тип ProductCollection.

Что правильно, если есть?

В той же области есть стандарт для именования возвращаемой переменной для функции. например RetVal

Мы в основном пишем код на C #, хотя я не уверен, что это влияет на мой вопрос.

Ответы [ 5 ]

44 голосов
/ 14 июля 2009

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

Тем не менее, рассмотрите возможность использования List<Product> или Collection<Product> или еще лучше IList<Product> или ICollection<Product>.

Редактировать: Это ответ на комментарии господина Эдмундо ниже.

В вашем случае у вас есть два варианта. Наиболее очевидный выбор - использовать наследование следующим образом:

class Ball { }

class BallCollection : List<Ball>
{
    public String Color { get; set; }
    public String Material { get; set; }
}

Я говорю очевидное, потому что кажется на первый взгляд лучшей идеей, но после недолгих размышлений становится ясно, что это не лучший выбор. Что если вы или Microsoft создадите новый SuperAwesomeList<T>, и вы хотите использовать его для повышения производительности вашего BallCollection класса? Это будет трудно, потому что вы связаны с классом List<T> посредством наследования, и изменение базового класса потенциально может нарушить любой код, который использует BallCollection в качестве List<T>.

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

class Ball { }

class BallCollection
{
    public String Color { get; set; }
    public String Material { get; set; }
    public IList<Ball> Balls { get; set; }
}

Обратите внимание, что я объявил свойство Balls типа IList<T>. Это означает, что вы можете свободно реализовывать свойство, используя любой тип по вашему желанию, если этот тип реализует IList<T>. Это означает, что вы можете свободно использовать SuperAwesomeList<T> в любой точке, что делает этот тип значительно более масштабируемым и гораздо менее болезненным для обслуживания.

21 голосов
/ 14 июля 2009

Продукты это конечно не правильно ИМХО. Нестатическое имя класса должно представлять существительное (не множественное число), потому что вы должны быть в состоянии сказать « x - это [имя класса] ».

Очевидно, что Продукты не вписываются в эту схему. ProductCollection делает:

Иллюстрация:

var products = new Products(); // products is a Products

var products = new ProductCollection(); // products is a ProductCollection

Какой из них "звучит правильно"?

Еще одна вещь, касающаяся именования классов коллекции: я обычно пытаюсь назвать классы коллекции так, чтобы было понятно, что это за коллекция.

Например:

  • class ProductCollection : может быть только перечислен и извлечен Count (т.е. реализует только интерфейс (ы) ICollection)
  • class ProductList : список, которым можно манипулировать с помощью Add (), Insert () и т. Д. (Т. Е. Реализует интерфейс (ы) IList)
  • class ProductDictionary : словарь продуктов, доступных по некоторому ключу (т.е. реализует интерфейс (ы) IDictionary)

Последний вариант может быть неоднозначным, если есть сомнения в том, что является ключом словаря, поэтому лучше указать тип ключа (например, ProductDictionaryByString). Но, если честно, я редко называю это так, потому что в большинстве случаев ключ будет строкой.

6 голосов
/ 14 июля 2009

.NET Framework часто использует постфикс «Collection» для своих типов коллекций. StringCollection, ObservableCollection, KeyedCollection и т.д.

5 голосов
/ 14 июля 2009

Заметил, что никто не ответил вам по поводу ретвалов (или я мог просто ослепнуть). Хотя я не эксперт; Что касается вопроса retVal, я не уверен на 100%, что вы подразумеваете под «именованием возвращаемой переменной», но если вы имеете в виду такие вещи:

public void GetSomething(out object retVal) 
{
    retVal = ThingFactory.CreateSomething();
}

Я бы сказал, неважно, что такое конвенция, не делай этого. Это очень раздражает. Просто верните значение. Если вам нужно вернуть более чем одну вещь, то я думаю, что метод либо делает больше, чем одну вещь (чего не должен делать метод), или эти вещи должны быть заключены в некоторый логический класс, который может быть возвращен вместо. 1005 *

Если вместо «именования возвращаемой переменной» вы имеете в виду что-то вроде этого:

var retVal = ThingFactory.CreateSomething();

Тогда я бы сказал, что имя переменной в зависимости от того, что это такое. Для чего это будет использоваться. Если это список автомобилей, назовите его listOfCars, если это кусок хлеба, который нужно съесть позже, назовите его pieceOfBread или pieceOfBreadToBeEatenLater.

Надеюсь, что это помогло и что это не слишком далеко где-то в поле: p

2 голосов
/ 19 декабря 2015

Thesaurus.com

Не смотри дальше. Вы больше не будете размышлять над множественной сингулярностью. Просто прикрепите один из этих множественных протекторов к имени вашего объекта:

  • перемешивать
  • Капля
  • Trove
  • Miscellany
  • Vocab
  • Load
  • Агломерация
  • курган
  • Серия
  • Lexicon
  • Muster
  • Глоссарий
  • Клад
  • Swarm
  • * Группа 1036 *
  • Кластер
  • Convoy
  • Сборка
  • Стадо
  • Mob
  • Пакетная
  • ворс
  • Банк
  • Конгрегация
  • Clump
  • Объем
  • Установить
  • Резерв
  • Компиляция
  • Flock
  • Армия

Сделайте это забавным.

...