Подтвердить что ты не робот

Использует ли суффикс подчеркивания для участников полезными?

class C {
 private:
  int member_; // here is the underscore I refer to.
}

Это подчеркивание рекомендуется Руководство по стилю Google и Geosoft С++ Руководство по стилю.

Я понимаю, что существуют разные мнения и вкусы.

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

Вот мой ответ:

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

В этом свете я считаю этот стиль вредным.

4b9b3361

Ответ 1

Ну, так как никто не упомянул об этом: добавление подчеркивания к переменной-члену позволяет вам назвать ваш getter и setter "концептуальным" именем переменной.

Пример:

class MyClass
{
   int someMember_;

public:
   int someMember() const { return someMember_; }
   void someMember( int newValue ) { someMember_ = newValue; }
};

не то, что я использую этот стиль, хотя.

Ответ 2

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

Мне все равно нравится, потому что он часто упрощает именование параметров функции участника:

class person
{
public:
  person(const std::string& first_name, const std::string& last_name)
    : first_name_(first_name), last_name_(last_name) {}

  // .......

private:
  std::string first_name_;
  std::string last_name_;
};

Ответ 3

Я использую "m_" в качестве префикса для обычных переменных-членов и "s_" для статических переменных-членов. Таким образом, область видимости напрямую видна.

Ответ 4

Для меня преимущество этого стиля декорирования переменных-членов - это хорошо работает с автоматической полной функциональностью текстовых редакторов. Если у вас есть префикс, вам нужно набрать больше символов, прежде чем вы поймете, что вы имеете в виду.

Ответ 5

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

class Foo
{
  int mMember;
  int member_;
  int _member;
  int m_Member;
};

Все стили предоставят вам необходимую информацию. Пока вы остаетесь с тем же самым стилем все время, никаких проблем. Иногда другим людям приходится работать с вашим кодом (например, когда вы создаете библиотеку или работаете с сообществом). Тогда может быть хорошей идеей придерживаться наиболее используемого стиля в сообществе С++.

Извините - я не могу ответить на какой стиль.

Ответ 6

Я придумал этот стиль самостоятельно в начале моих дней программирования С++ (конец 80-х, начало 90-х), потому что я столкнулся с несколькими запутывающими ситуациями, в которых мне пришлось продолжать возвращаться к заголовку класса, чтобы выяснить, какая переменная действительно была членом переменная.

Как только я начал видеть код С++ других людей, который сделал то же самое, я был весьма удовлетворен тем, что я заметил проблему, которую имели другие люди, и что решение, которое я принял для себя, было другим, о котором думали и другие люди.

Это не часто полезно, но это довольно безобидно, и когда это полезно, это очень полезно.

Вот почему я действительно ненавижу стиль m_. Это не безобидно, и я думаю, что добавленное уродство не стоит того.

Я использую префикс S_ для статических переменных области файла и статических переменных класса, которые не являются константами. Они вроде как глобальные переменные, и я думаю, что их использование должно звучать громко.

Ответ 7

Это в основном религиозный аргумент, поэтому вы никогда не достигнете консенсуса по этому стилю. FWIW, я использую этот стиль для своих переменных-членов по причинам, уже указанным другими, например:

class Foo
{
public:
  Foo(std::string name, int age) :
    name_(name),
    age_(age)
  {
  }

  std::string name() const { return name_; }
  void name(const std::string& name) { name_ = name; }

  int age() const { return age_; }
  void age(int age) { age_ = age; }
private:
  std::string name_;
  int age_;
};

Просто прими то, что вам нравится, и придерживайтесь его.

Ответ 8

Это появилось в обсуждении, в котором я работал, но с программированием на Java. Но я думаю, что это относится и к С++. Мой ответ заключается в том, что у IDE есть удобная функция переменных класса класса color. В Eclipse они становятся синими. Подчеркивание является излишним. Как сказал другой плакат: "EW, венгерские бородавки!!". 1980 призвал и хочет вернуть венгерскую нотацию.

Ответ 9

Мы следуем chance.com С++ стандарту кодирования, в котором говорится о префиксных переменных-членах с помощью 'm', но я также сделал некоторые из них работают под руководством руководства Google.

Как вы говорите, это не является строго необходимым, особенно если у вас есть среда IDE, которая назначает различную подсветку синтаксиса для переменных-членов. Тем не менее, я думаю, что some тип последовательной схемы именования, позволяющий вам сразу определить, является ли переменная переменной-членом, очень полезно:

  • Упрощенное именование параметров, как и в ответе sbi, является одним из преимуществ.
  • A согласованный стиль кодирования важен, независимо от того, какой стиль вы выбираете. В идеале, все в команде будут использовать один и тот же стиль кодирования, чтобы вы не могли сразу сказать, кто написал данный раздел кода. Это помогает при внедрении новых разработчиков в команду и с гибкой практикой, такой как отсутствие права собственности на код, и еще более важно с проектами с открытым исходным кодом, которые могут привлечь различные вклады.
  • Самое главное, удобочитаемость может в значительной степени выиграть от того, что весь код соответствует довольно строгим стилям, что позволяет очистить типы идентификаторов, подобных этому. Разница между возможностью сказать с первого взгляда, что переменная является членом, и возможность рассказать, глядя на объявления локальных переменных, может быть небольшим, но после хорошего стандарта кодирования будут сделаны многочисленные небольшие различия как это происходит во всем теле кода, и это может существенно повлиять на то, насколько легко будет следовать код и как легко начать работу в незнакомом разделе кода.

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

Все это в моем опыте, ваш пробег может отличаться и т.д.

Ответ 10

существует еще один "стиль", который предлагает объявить членов класса следующим образом:

class Foo{
    int m_value;
public:
     //...
};

я нашел его полезным. но это только моя точка зрения.

Ответ 11

Я согласен с Тобиасом в том, что есть преимущество в отношении какого-либо соглашения - каким бы оно ни было, - для выделения переменных класса. С другой стороны, я неизменно обнаруживаю, что такие соглашения делают код "поток" менее хорошим. Это просто проще читать "totalPrice = productPrice + salesTax", затем "m_totalPrice = l_productPrice + l_salesTax" или что-то еще.

В конце концов, я предпочитаю просто оставить все имена полей unecorated и иметь достаточно несколько переменных класса, которые отслеживают их, не проблема. В конструкторах и сеттерах я помещаю префикс или суффикс в параметр, или в Java я обычно различаю переменную класса с "этим", например:

public Foo(int bar)
{
  this.bar=bar;
}

(Можете ли вы сделать это на С++? Это было так долго, что я не помню.)

Ответ 12

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

На днях я взглянул на один из моих старых проектов Java, где я применил суффикс подчёркивания к именам переменных, и обнаружил, что это затрудняет чтение кода. С этим было не слишком сложно привыкнуть, но я обнаружил, что это немного отвлекает, не добавляя никакой реальной выгоды.

Ответ 13

Я всегда хочу отличить членов класса от переменных. Я использую _ как префикс для членов, и, лично говоря, это делает код чистым и читаемым. Префиксы отлично работают с редактором intellisense. Префикс с m_ или s_ полезен, но для меня это выглядит некрасиво.