Russian Qt Forum

Программирование => С/C++ => Тема начата: YvenTitan от Октябрь 20, 2017, 13:12



Название: Чистый код: как правильно называть члены структур
Отправлено: YvenTitan от Октябрь 20, 2017, 13:12
Здравстуйте,
Есть мнение, что члены классов должны начинаться с m_
Как считаете, к членам структур это правило должно относиться?


Название: Re: Чистый код: как правильно называть члены структур
Отправлено: ViTech от Октябрь 20, 2017, 13:45
Сначала нужно определиться чем структура отличается от класса, в понимании чистого кода :).

Коротко моё мнение: если структура не инвариант, все поля публичные, нет всяких геттеров/сеттеров, то префикс/суффикс не нужен.


Название: Re: Чистый код: как правильно называть члены структур
Отправлено: YvenTitan от Октябрь 20, 2017, 13:53
Я не до конца понимаю, зачем писать префикс в членах класса. Я делаю по 2 причинам: во-первых, принято, признак хорошего тона; во-вторых, если вижу префикс, то сразу понимаю, что член класса и немного удобнее разбирать код.

Не знаю, чем отличаются в понимании чистого кода, может смысл закрытости членов класса...

У меня "геттеров/сеттеров" нет, не инвариант


Название: Re: Чистый код: как правильно называть члены структур
Отправлено: ViTech от Октябрь 20, 2017, 14:04
Я не до конца понимаю, зачем писать префикс в членах класса. Я делаю по 2 причинам: во-первых, принято, признак хорошего тона; во-вторых, если вижу префикс, то сразу понимаю, что член класса и немного удобнее разбирать код.

Пара причин для примера:
1. С префиксами нет конфликтов имён с геттерами.
2. В IDE в автодополнении они сгруппированы, по "m_" можно увидеть список членов класса.


Название: Re: Чистый код: как правильно называть члены структур
Отправлено: Racheengel от Октябрь 20, 2017, 16:58
Я не пишу, т.к. у структуры все мемберы публичны.
Если нужны геттеры - делайте класс тогда.


Название: Re: Чистый код: как правильно называть члены структур
Отправлено: deMax от Октябрь 21, 2017, 13:08
Пара причин для примера:
1. С префиксами нет конфликтов имён с геттерами.
2. В IDE в автодополнении они сгруппированы, по "m_" можно увидеть список членов класса.
имхо, геттеры лучше начинать с get.
автодополнение актуально только внутри методов класса(а там и так не так много методов), т.к. публичные члены для класса лучше не делать.


Название: Re: Чистый код: как правильно называть члены структур
Отправлено: Авварон от Октябрь 21, 2017, 19:19
Здравстуйте,
Есть мнение, что члены классов должны начинаться с m_
Как считаете, к членам структур это правило должно относиться?

Уже написали в принципе - префикс добавляется к мемберам, чтобы избежать коллизии с геттером:
a.value(); // геттер
a.setValue(); // сеттер
a.m_value; // мембер

Я лично предпочитаю писать не m_value (как в венгерской нотации), а _value. Еще есть вариант с постфиксом value_, но мне он кажется безобразным (value_->foo()) - _value->foo()->bar() встречается гораздо чаще, чем a->_foo->_bar (тоже ужасно, но внутрь привата лезешь редко).

Еще есть вариант с d-pointer'ом: T value() const { return d->value; }


Название: Re: Чистый код: как правильно называть члены структур
Отправлено: deMax от Октябрь 22, 2017, 13:24
Уже написали в принципе - префикс добавляется к мемберам, чтобы избежать коллизии с геттером:
a.value(); // геттер
a.setValue(); // сеттер
a.m_value; // мембер
имхо:
a.value; // мембер
a.setValue(); // сеттер
a.getValue(); // геттер
геттер это метод, действие, глагол, а не существительное. И если в классе слишком много member, setMember, getMember - то напрашивается сделать класс структурой, или разделить класс на структуру и класс.

getValue() - сразу видно что это геттер.
value() - это некая функция возвращающая значение, непонятно что делающая(просто взять значение или вычислить).
toValue() - преобразование

m_ подкупает автодополнением, но в принципе IDE сама могла бы подсказывать и фильтровать дополнения(например при автодополнении ctrl+M только методы...).


Название: Re: Чистый код: как правильно называть члены структур
Отправлено: ssoft от Октябрь 23, 2017, 12:37
Последнее время (лет 5) взял за правило обязательно использовать префикс для членов класса m_ и ни капли не жалею. Читабельность кода вырастает, саппорт и дальнейший разбор облегчается.
Кроме коллизий с геттерами могут быть и коллизии и с параметрами методов, и с локальными переменными. Когда требуется анализ кода без подсветки синтаксиса префикс сильно помогает.


Название: Re: Чистый код: как правильно называть члены структур
Отправлено: __Heaven__ от Октябрь 23, 2017, 14:07
Предпочитаю classMember_ и structMember.


Название: Re: Чистый код: как правильно называть члены структур
Отправлено: YvenTitan от Июнь 05, 2018, 10:13
Что можно сделать, чтобы избежать коллизии с параметрами конструктора? Нормально в конец имени члена добавить "_" или правильнее произвольно поменять имя параметра конструктора?
Например,

class Example
{
  int param1_;
  int param2_;

  Example(int param1, int param2)
  {
     param1_ = param1;
     param2_ = param2;
  }
}


Название: Re: Чистый код: как правильно называть члены структур
Отправлено: Авварон от Июнь 05, 2018, 11:08
param1(param1)


Название: Re: Чистый код: как правильно называть члены структур
Отправлено: kambala от Июнь 05, 2018, 11:09
приватные переменные обычно имеют префикс _ или m_. Для публичных можно в параметры конструктора в конец добавить _


Название: Re: Чистый код: как правильно называть члены структур
Отправлено: Пантер от Июнь 05, 2018, 11:16
У меня все мемберы приватные, именуются вот так someName_, коллизии с параметрами не возникает, ибо параметры именуются someName.


Название: Re: Чистый код: как правильно называть члены структур
Отправлено: YvenTitan от Июнь 05, 2018, 11:26
Извините, опечатался. Структура и все параметры публичные

struct Example
{
  int param1_;
  int param2_;

  Example(int param1, int param2)
  {
     param1_ = param1;
     param2_ = param2;
  }
}


Название: Re: Чистый код: как правильно называть члены структур
Отправлено: ViTech от Июнь 05, 2018, 11:32
Код
C++ (Qt)
struct Example
{
   int param1;
   int param2;
 
   Example(int param1, int param2)
       : param1{param1},
         param2{param2}
   {}
};
 


Название: Re: Чистый код: как правильно называть члены структур
Отправлено: YvenTitan от Июнь 05, 2018, 11:33
Спасибо за мнение


Название: Re: Чистый код: как правильно называть члены структур
Отправлено: _Bers от Июнь 06, 2018, 01:27
Здравстуйте,
Есть мнение, что члены классов должны начинаться с m_
Как считаете, к членам структур это правило должно относиться?

Уже написали в принципе - префикс добавляется к мемберам, чтобы избежать коллизии с геттером:
a.value(); // геттер
a.setValue(); // сеттер
a.m_value; // мембер

Я лично предпочитаю писать не m_value (как в венгерской нотации), а _value. Еще есть вариант с постфиксом value_, но мне он кажется безобразным (value_->foo()) - _value->foo()->bar() встречается гораздо чаще, чем a->_foo->_bar (тоже ужасно, но внутрь привата лезешь редко).

Еще есть вариант с d-pointer'ом: T value() const { return d->value; }

подчеркивание в начале имени - дурной тон.
можно нарваться на UB.
грамотные любители подчеркиваний ставят черточки в конце имени.


Название: Re: Чистый код: как правильно называть члены структур
Отправлено: deMax от Июнь 06, 2018, 13:26
поэтому в начале приватных членов "m_" - автодополнение внутри класса легко находит приватные члены и вне класса приватные члены мешаться не будут.


Название: Re: Чистый код: как правильно называть члены структур
Отправлено: Авварон от Июнь 06, 2018, 14:00
подчеркивание в начале имени - дурной тон.
можно нарваться на UB.
грамотные любители подчеркиваний ставят черточки в конце имени.


Пруфы? Черточки в конце имени отвратительны, код вида bar_.foo(); абсолютно нечитаем.
_ и __ зарезервированы для имен стандартных библиотек, но чтобы UB - первый раз слышу.


Название: Re: Чистый код: как правильно называть члены структур
Отправлено: Racheengel от Июнь 07, 2018, 01:35
подчеркивание в начале имени - дурной тон.

Согласен. Лушче m_

можно нарваться на UB.

Скорее на УГ.

Пруфы? Черточки в конце имени отвратительны, код вида bar_.foo(); абсолютно нечитаем.

Согласен. Такое чувство, что человек хотел что-то разумное после bar_ добавить, но... умер, наверное...


Название: Re: Чистый код: как правильно называть члены структур
Отправлено: Igors от Июнь 07, 2018, 07:41
Черточки в конце имени отвратительны, код вида ...
Рассуждаете как чистый гуманитарий :) Все на чувствах, эмоциях, объективности никакой. Да, я бы не стал использовать подчеркивания ни в начале, ни в конце, но если другой так делает - нет оснований его осуждать. Любой разумный стиль неплох. И, кстати, всегда есть исключения. Напр m_  дело хорошее, но иногда (пусть редко) лучше без него, напр здесь
Код
C++ (Qt)
struct Point {
 int x, y;
};


Название: Re: Чистый код: как правильно называть члены структур
Отправлено: deMax от Июнь 07, 2018, 10:17
struct Point
А это структура, они там нафиг не нужны. m_ для закрытых полей, которые не должны вне класса светиться.


Название: Re: Чистый код: как правильно называть члены структур
Отправлено: Пантер от Июнь 07, 2018, 10:22
Я придерживаюсь наименования мемберов в виде someName_. m_ в начале слова только мешает его быстро прочитать, в случае нижнего подчеркивания вконце мы сразу видим слово и в конце понимаем мембер это или не мембер. Как-то так.
Не холивара ради. У каждого может быть свое мнение, не переживайте, важе мнение ошибочно, мое нет. ;)


Название: Re: Чистый код: как правильно называть члены структур
Отправлено: deMax от Июнь 07, 2018, 11:57
Способов много, стандарта тут нет. m_ немного мешает чтению, но зато сразу видно что это закрытый член класса ( а не аргумент или переменная на стеке ).
Выделение цветом, не так наглядно как имя. Ну и автодополнение непонятно как настроить чтобы фильтровать члены класса и переменые.


Название: Re: Чистый код: как правильно называть члены структур
Отправлено: _Bers от Июнь 15, 2018, 01:38
подчеркивание в начале имени - дурной тон.
можно нарваться на UB.
грамотные любители подчеркиваний ставят черточки в конце имени.


Пруфы? Черточки в конце имени отвратительны, код вида bar_.foo(); абсолютно нечитаем.
_ и __ зарезервированы для имен стандартных библиотек, но чтобы UB - первый раз слышу.

зарезервированы для нужд языка.
_ или __ для глобальных идентификаторов
_UpperCase  для любых возможных кейсов использования.

с обычными глобальными переменными можно попутаться в шаблонах:
http://rextester.com/VTE47007

Код:
#include <iostream>
#include <string>

std::string _reserved = "global";

struct base
{
    std::string _reserved = "member";    
};

template<class t> struct sample: t
{
    void set(const std::string& v) { _reserved = v; }
};

int main()
{
    sample<base> s;
    s.set("UB");
    
    std::cout << s._reserved << '\n';
}

кроме того, дефайны препроцессора так же являются глобальными идентификаторами.
а им вапще плевать на области видимости.

итого: подчеркивание в начале имени открывает потенциальную вероятность коллизий.

конретную ссылку на стандарт искать лень.


Название: Re: Чистый код: как правильно называть члены структур
Отправлено: Racheengel от Июнь 22, 2018, 00:57
struct Point
А это структура, они там нафиг не нужны. m_ для закрытых полей, которые не должны вне класса светиться.

А вот если это protected-поле, не моветонъ ли в наследнике его читать-писать без геттеросеттера?


Название: Re: Чистый код: как правильно называть члены структур
Отправлено: ssoft от Июнь 22, 2018, 07:44
А вот если это protected-поле, не моветонъ ли в наследнике его читать-писать без геттеросеттера?

Дак на то оно и protected, чтобы его читать-писать без геттеросеттера. Иначе должно быть private.


Название: Re: Чистый код: как правильно называть члены структур
Отправлено: Racheengel от Декабрь 15, 2018, 03:10
А вот если это protected-поле, не моветонъ ли в наследнике его читать-писать без геттеросеттера?

Дак на то оно и protected, чтобы его читать-писать без геттеросеттера. Иначе должно быть private.

да просто некрасиво немного... а вдруг переименуют его в базовам классе?


Название: Re: Чистый код: как правильно называть члены структур
Отправлено: sergek от Декабрь 15, 2018, 10:25
да просто некрасиво немного... а вдруг переименуют его в базовам классе?
А если геттеры/сеттеры в интерфейсе не нужны? Делать их в защищенной части? ;) Это уже слишком...


Название: Re: Чистый код: как правильно называть члены структур
Отправлено: Racheengel от Декабрь 18, 2018, 12:08
да просто некрасиво немного... а вдруг переименуют его в базовам классе?
А если геттеры/сеттеры в интерфейсе не нужны? Делать их в защищенной части? ;) Это уже слишком...

Это другой конец эстетической палки... с перегибом :)
Не, я не против доступа к протектед-переменной, просто за красоту подумал)