Как бы вы назвали эти связанные свойства, класс, параметр и поле в .NET?
Я часто нахожу, что хочу написать код, похожий на это на С#, но мне неудобно с именами идентификаторов:
public class Car
{
private Engine engine;
public Engine Engine
{
get
{
return engine;
}
set
{
engine = value;
}
}
public Car(Engine engine)
{
this.engine = engine;
}
}
Здесь у нас есть четыре разные вещи, называемые "движком":
-
Engine
класс. Двигатель кажется хорошим, естественным именем.
-
Engine
государственная собственность. Кажется глупым называть его MyEngine или TheCarsEngine.
-
Engine
частное поле, поддерживающее свойство. Некоторые схемы именования будут рекомендовать m_engine
или _engine
, но другие говорят, что следует избегать всех префиксов.
-
Engine
имя параметра в конструкторе. Я видел схемы именования, которые рекомендуют префикс подчеркивания по всем параметрам, например, _engine
. Мне это очень не нравится, поскольку параметр видим вызывающим абонентам через Intellisense.
Особые вещи, которые мне не нравятся в написанном коде, заключаются в следующем:
- Если вы изменяете имя параметра в конструкторе, но не используете его в теле конструктора, вы получаете тонкую ошибку, которую компилятор, вероятно, не сможет определить.
- У Intellisense есть плохая привычка к автозаполнению неправильной вещи для вас, и иногда вы не заметите, что это изменило ситуацию. Вы снова получите тонкую ошибку, если тело конструктора случайно закончится
this.engine = Engine;
Кажется, что каждое имя подходит по отдельности, но вместе они плохо. Что-то должно уступить, но что? Я предпочитаю менять частное поле, так как он не отображается пользователям, поэтому обычно я получаю m_engine
, который решает некоторые проблемы, но вводит префикс и не останавливает Intellisense от изменения Engine
до Engine
.
Как бы вы переименовали эти четыре элемента? Почему?
(Примечание. Я понимаю, что свойство в этом примере может быть автоматическим. Я просто не хотел, чтобы этот пример был сложным.)
См. также:
Я безнравственна для использования имени переменной, которое отличается от его типа только в случае?
Ответы
Ответ 1
В этом случае я бы назвал их точно так, как они есть в этом примере.
Это связано с тем, что именование понятно, какие данные хранятся в каждом элементе и/или будут использоваться.
Единственное, что я изменил бы для С# 3, это использовать авто-свойство, которое удалит локальную переменную.
Ответ 2
Для частных членов я всегда префикс подчеркивания:
private Engine engine;
становится:
private Engine _engine;
Всякий раз, когда я вижу m_
, это приводит к отторжению желудка.
Ответ 3
Вот так:
public class Car
{
#region fields
private Engine _engine;
#endregion
#region public properties
public Engine Engine { get { return _engine; } set { _engine = value; } }
#endregion
#region constructors
public Car(Engine engine)
{
_engine = engine;
}
#endregion
}
К сожалению, таблица стилей SO-кода возвращает мои пустые строки, что делает его более понятным и понятным. Региональные директивы, которые мы используем для всего производственного кода, помогают избежать путаницы. Префикс подчеркивания - единственный префикс, который я использую (ну, за исключением я на интерфейсах, но все это делают), но я использую его религиозно, поэтому мы никогда не путаем поля и локальные жители (как в контрструкторе). Я не вижу серьезной проблемы с тем, что имя свойства и имя типа совпадают (в VS выделение будет различать их). Это проблема только в том случае, если вы пытаетесь использовать статический член или метод этого типа, и если вы это сделаете, вам придется либо его псевдоним, либо явно ссылаться на него (т.е. MyNamespace.VehicleParts.Engine.StaticMethod()
).
Кажется читаемым для меня, но все это очень субъективно.
Ответ 4
- Участник: m_engine;
- Статический член: sm_engine;
- Параметр: двигатель
- Локальная переменная: _engine
- Класс: Двигатель
- Недвижимость: Двигатель
Это позволяет по-разному определять параметры и локальные переменные.
Ответ 5
Я предпочитаю использовать некоторый префикс (я использую '_') для частных полей, иначе они выглядят точно так же, как параметры и locals. Кроме этого, я использую аналогичный подход к наименованию, как вы здесь, хотя двигатель может быть немного общим, в зависимости от того, насколько общая программа.
Я думаю, что предпочитаю CarEngine или AutoEngine, или что-то в этом роде, поскольку программисты любят использовать Engine как метафору для вещей, которые вообще не соответствуют реальным моделям.
Ответ 6
Я обычно префишу частные поля с подчеркиванием, поэтому я бы назвал его _engine. И я часто использую очень короткие (например, начальные буквы) имена параметров, поэтому это будет Engine e (в конце концов, пользователи intellisense получают имя типа и). Я либо оставляю имена классов и объектов одинаковыми, либо (чаще) придумал другое имя, даже если оно MyEngine или carEngine.
Итак:
общественный класс Car
{
#region fields
private Engine _engine;
#endregion
#region public properties
public Engine carEngine { get { return _engine; } set { _engine = value; } }
#endregion
#region constructors
public Car(Engine e)
{
_engine = e;
}
#endregion
}
Ответ 7
Мне не нравится венгерская нотация: m_foo
и т.д. Я использую стиль верблюда: engine, myEngine, myBigEngine
.
Я напишу вам, как вы.
В MSDN я увидел одно замечание: use public Car(Engine e)
- я имею в виду параметр ввода имени что-то еще как локальную переменную. Но я этого не делаю.
Ответ 8
Это нормально оставить их, поскольку они отделены от одной маленькой вещи. В intellisense не сразу видно, является ли элемент параметром, локальным или частным, поскольку все они имеют один и тот же символ (синий куб). Если, однако, вы перемещаете курсор к определенному элементу, тогда подсказка подскажет, какой из них он имеет.
В качестве наглядного пособия вам может понадобиться префикс вашего частного участника с подчеркиванием _engine, чтобы сразу стало очевидно, что он является частным членом без перемещения курсора. Это соглашение, которое я использую, и это единственное имя, которое я бы изменил в вашем примере.
Ответ 9
public class Car
{
public Car(Engine engine)
{
Engine = engine;
}
public Engine Engine { get; set; }
}
Если у меня есть поле, я префикс его с подчеркиванием (_).
Так
частный двигатель двигателя;
превратится в
частный движок _engine;