Использует ли суффикс подчеркивания для участников полезными?
class C {
private:
int member_; // here is the underscore I refer to.
}
Это подчеркивание рекомендуется Руководство по стилю Google и Geosoft С++ Руководство по стилю.
Я понимаю, что существуют разные мнения и вкусы.
Я хочу спросить людей, которые его использовали или были вынуждены использовать, независимо от того, считают ли они это выгодным, нейтральным или вредным для них. И почему?
Вот мой ответ:
Я понимаю, что за этим стоит мотивация, но это меня не убеждает.
Я попробовал это, и все, что у меня получилось, было немного беспорядочным по всему классу, но более простая инициализация членов в конструкторе. Я не сталкивался с ситуацией, когда подчеркивание помогало различать переменную частного члена и другую переменную (за исключением упомянутой инициализации).
В этом свете я считаю этот стиль вредным.
Ответы
Ответ 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_ полезен, но для меня это выглядит некрасиво.