Чи погана практика називати властивість / члена таким самим, як тип декларування у C #?


25

Наприклад, клас типу:

class Dog { } //never mind that there's nothing in it...

а потім властивість на зразок:

Dog Dog { get; set; }

Мені сказали, що якщо я не можу придумати більш образне ім'я для цього, я повинен використовувати:

Dog DogObject { get; set; }

Будь-які думки про те, як їх краще назвати?


2
Ця вимога, про яку вам сказали, здається загибелою у мозку, можливо, через надмірне виконання хорошого керівництва (не використовуйте лише ім'я типу, коли є краще ім’я).

2
Це навіть не буде компілюватися в C #, оскільки імена членів не можуть бути такими ж, як укладений тип.
Лі

3
@Lee: Я думаю, що контекст полягає в тому, що властивість знаходиться в іншому типі. Наприклад, Personклас, що містить Dogвластивість під назвоюDog
goric

3
Я маю на увазі, якщо вона справді собака, позначте її як таку.
Томас Едінг

1
Підсвічування синтаксису IDE має відрізняти тип та властивість. Якщо ви не використовуєте IDE, ви завжди можете подивитися на контекст.
Cyanfish

Відповіді:


22

Це може бути поганою практикою, якби не той факт, що вже досить очевидно, про що ви говорите у своєму коді, виходячи з контексту.

Dog = new Dog();

Який конструктор типу? Який об’єкт? Не плутаєте? Добре, як щодо

Dog = Dog.Create()?

Який об’єкт? Який статичний заводський метод за типом? Все ще не плутати? Я так не думав.

Єдиний раз, коли я бачив, що це є потенційною проблемою, - коли дерево простору імен стає досить досконалим, і компілятор не може з'ясувати неоднозначність, і в цьому випадку ви виявите щось подібне

Dog = new Some.Namespace.Dog();

У будь-якому випадку, це має відбуватися лише з автоматичними властивостями (а можливо, і перерахунками), оскільки локальні назви змінних завжди є camelCrozen, уникаючи двозначності повністю.

dog = new Dog();

7
+1. А альтернативи все гірше: "TheDog", "AnyDog", "MyDog" і т. Д. Коли немає чого додати, краще нічого не додавати.
кевін клайн

Я думаю, що другий може заплутатися, якби з якихось причин Dogбув названий метод екземпляра Create, але в цей момент ви занурилися б у деякі досить жахливі практики кодування.
KDiTraglia

40

Це не лише розумна практика, мова була спеціально розроблена для того, щоб це допустити. Знайдіть специфікацію C # для "Колір кольорів" для правил та обґрунтування, і див

http://blogs.msdn.com/b/ericlippert/archive/2009/07/06/color-color.aspx

для деяких цікавих кутових випадків, які випливають із цього рішення.

Ні в якому разі не слід називати властивість "DogObject", щоб не називати його таким же, як його тип; що прямо суперечить рамковим настановам проектування.


Якщо тип властивості - це той, чиї екземпляри не мають ідентичності (наприклад Color), таке використання здається розумним. Мені це не дуже подобається, з мутабелями чи IDisposableтипами. Чи "контролі Font" посилаються на ті аспекти стану, які закладені власністю, або на екземпляр, Fontвизначений особою, яка отримує майно?
supercat

7

Це абсолютно чудово називати це, Dogі це насправді те, що Microsoft рекомендує у керівництві щодо іменування Framework :

ВІДПОВІДЬ про надання властивості такою ж назвою, як і його тип.

Наприклад, наступне властивість правильно отримує і встановлює значення enum з назвою Color, тому властивість називається Color.

Ось приклад, який вони використовують у наведеному вище посібнику:

public enum Color {...}
public class Control {
    public Color Color { get {...} set {...} }
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.