Как бы вы назвали эти связанные свойство, класс, параметр и поле в .NET? - PullRequest
13 голосов
/ 20 января 2009

Я часто нахожу, что хочу написать что-то вроде этого на C #, но мне неудобны имена идентификаторов:

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.

Как бы вы переименовали эти четыре элемента? Почему?

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

Смотри также: Аморально ли я использовать имя переменной, которая отличается от ее типа только регистром?

Ответы [ 9 ]

12 голосов
/ 20 января 2009

В этом случае я бы назвал их точно так же, как в примере.

Это связано с тем, что в названии ясно, какие данные хранит и / или будет использовать каждый элемент.

Единственное, что я хотел бы изменить для C # 3, - это использовать авто-свойство, которое удаляло бы локальную переменную.

5 голосов
/ 20 января 2009

Для частных пользователей я всегда префикс с подчеркиванием:

private Engine engine;

становится:

private Engine _engine;

Всякий раз, когда я вижу m_, это заставляет мой желудок сжаться.

3 голосов
/ 20 января 2009

Как это:

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 удаляет мои пустые строки, что делает ее немного понятнее и легче для чтения. Директивы региона, которые мы используем во всем рабочем коде, помогают избежать путаницы. Префикс подчеркивания - единственный префикс, который я использую (ну, кроме I на интерфейсах, но все так делают), но я использую его неукоснительно, поэтому мы никогда не путаем поля и локальные объекты (как в contstructor). Я не вижу большой проблемы с тем, чтобы имя свойства и имя типа совпадали (в VS выделение будет различаться). Проблема возникает только в том случае, если вы пытаетесь использовать статический член или метод этого типа, и если вы это сделаете, вам придется либо псевдонимить его, либо ссылаться на него явно (то есть MyNamespace.VehicleParts.Engine.StaticMethod()).

Мне кажется читабельным, но все это очень субъективно.

1 голос
/ 20 января 2009
  • Участник: m_engine;
  • Статический член: sm_engine;
  • Параметр: двигатель
  • Локальная переменная: _engine
  • Класс: Двигатель
  • Свойство: Двигатель

Это позволяет по-разному называть параметры и локальные переменные.

0 голосов
/ 20 января 2009
public class Car
{

    public Car(Engine engine)
    {
        Engine = engine;
    }

    public Engine Engine { get; set; }

}

Если у меня было поле, я ставлю перед ним подчеркивание (_). Так Частный Двигатель двигателя; превратится в частный двигатель _engine;

0 голосов
/ 20 января 2009

Можно оставить их, так как они находятся отдельно от одной маленькой вещи. В intellisense не сразу очевидно, является ли элемент параметром, локальным или закрытым элементом, поскольку все они имеют одинаковый символ (синий куб). Однако, если вы переместите курсор к определенному элементу, подсказка сообщит вам, какой из них.

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

0 голосов
/ 20 января 2009

Мне не нравятся венгерские обозначения: m_foo и т. Д. Я использую стиль верблюда: engine, myEngine, myBigEngine.

Я бы написал точно так же, как вы.

В MSDN я увидел одно замечание: используйте public Car(Engine e) - я имею в виду имя входного параметра, что-то еще, как локальную переменную. Но я этого не делаю.

0 голосов
/ 20 января 2009

Обычно я ставлю приватные поля с подчеркиванием, поэтому я бы назвал это _engine. И я часто использую очень короткие (например, начальные буквы) имена параметров, так что это будет Engine e (в конце концов, пользователи intellisense получают типы и name). Я либо оставляю имена классов и объектов одинаковыми, либо (более обычно) придумываю другое имя, даже если это MyEngine или carEngine .

Итак:
Общественный автомобиль класса

{    
    #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
}
0 голосов
/ 20 января 2009

Я предпочитаю использовать какой-то префикс (я использую '_') для личных полей, в противном случае они выглядят так же, как параметры и локальные параметры. Кроме этого, я использую аналогичный подход к именованию, как и здесь, хотя Engine может быть немного общим, в зависимости от того, насколько общая программа.

Я думаю, что я предпочитаю CarEngine, или AutoEngine, или что-то в этом роде, поскольку программисты любят использовать Engine в качестве метафоры для вещей, которые вообще не соответствуют реальным движкам.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...