Как бы вы назвали эти связанные свойства, класс, параметр и поле в .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;