|
C++ доступ к членам класса через this->, чем чревато злоуотребление? |
|
|
|
May 14 2018, 07:23
|

I WANT TO BELIEVE
     
Группа: Свой
Сообщений: 2 617
Регистрация: 9-03-08
Пользователь №: 35 751

|
Один мой товарищ( как говорится, не к ночи будет помянут сей язык, бывший PHPшник) в C++ коде для AVR8 везде лепит this-> Вот пример его кода https://pastebin.com/hqyYcQYh Аргументирует он это тем, что так якобы понятнее, что это член класса. Хотя, конечно-же, это решается нэймингом. В общем-то на C++ так никто не пишет, но хотелось бы привести весомые аргументы почему именно. Первый аргумент, который я привел: this это указатель. Используя его мы подрезаем ноги оптимизатору, который, как я понимаю, на много аккуратнее относится к оптимизации indirect access И может быть в каких-то простых случаях он этот this и упразднит, но тем не менее. Может быть у кого-то еще есть аргументы? Мне даже самому стало интересно. Уже который год эта тема у нас с ним регулярно поднимается. Прям холливар Сишника и бывшего ПХПшника
--------------------
The truth is out there...
|
|
|
|
|
May 14 2018, 07:45
|
Местный
  
Группа: Участник
Сообщений: 319
Регистрация: 27-09-07
Пользователь №: 30 877

|
Цитата(sigmaN @ May 14 2018, 10:23)  Может быть у кого-то еще есть аргументы? Мне даже самому стало интересно. Уже который год эта тема у нас с ним регулярно поднимается. Прям холливар Сишника и бывшего ПХПшника  тоже встречаю такой код. имхо, это подстелить соломку, дуть на воду после молока - как раз защищает от ошибочного нейминга. если объявить в функции локальное имя, перекрывающее поле класса, то получим непонятку. если класс большой, то обнаружить что локальная переменная перекрыла поле, может быть не всегда тривиально.
|
|
|
|
|
May 14 2018, 08:09
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
Согласен со всеми - с одной стороны защищает от сокрытия имени локальной перемеенй (последние ГЦЦ умеют ругаться по этому поводу), с другой стороны захламляет исходник как скобки в и без того очевидных местах: QUOTE -- Осмелюсь доложить, господин фельдкурат взаправду не ошибся. Когда я был на действительной, меня освободили от военной службы из-за идиотизма, общепризнанного идиотизма. По этой причине отпустили из полка двоих: меня и еще одного, капитана фон Кауница. Тот, господин поручик, идя по улице, одновременно, извините за выражение, ковырял пальцем левой руки в левой ноздре, а пальцем правой руки -- в правой. На учении он каждый раз строил нас, как для церемониального марша, и говорил: "Солдаты... э-э... имейте в виду... э-э... что сегодня... среда, потому что... завтра будет четверг... э-э..."
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
May 14 2018, 09:17
|
Профессионал
    
Группа: Свой
Сообщений: 1 123
Регистрация: 8-03-09
Из: Днепр
Пользователь №: 45 848

|
Видать человек при переходе на С(++) походил по своим, исконным, граблям и решил их не убирать, а устранять последствия (спец-шлем this->). Сейчас и граблей уже нет, и забыто зачем это делалось. А привычка осталась. Возможно связано с тем, что в приведенном коде вся реализация класса находится в h-файле. А кода в cpp модуле с ф-ми в виде Код uint8_t TimeClass::GetSecond(void) { } не наблюдается. Соотв-но под вопросом информированность об операторе :: и определение области видимости вообще. Как с этим делом в PHP - не знаю, не плавал.
|
|
|
|
|
May 14 2018, 09:50
|
Группа: Участник
Сообщений: 8
Регистрация: 4-08-11
Пользователь №: 66 568

|
Объясню, почему я так делаю... Код: Код class ClassA { public: void Set(uint8_t some_var) { //some actions } } class ClassB { public: void Set(uint8_t some_var) { //some actions } void BlaBlaBla(*ClassA var, uint8_t some_var) { if (/*something*/) { var->Set(some_var); this->Set(some_var);//вот тут правильнее в целом смотрится именно this, а не "Set(some_var);" } } } Так же если в методе я буду всё-таки вынужден использовать this для доступа к членам текущего класса, то комбинация Код void SomeFunction(void) { //some code } class SomeClass { void SomeFunction(void) { //some another code } void SomemethodA(void) { } void SomemethodB(void) { } void SomemethodC(void) { this->SomeFunction(); SomemethodA(); SomemethodB(); SomeFunction();//чё происходит? } } выглядит не очень. Как-то не читаемо, т.к. оно означает что где-то (НАВЕРНОЕ) есть функция с таким же названием, но это не точно. Такая ситуация может возникнуть, если оспользуешь какие-нить сишные либы, к примеру (мне неизвестные), и имя твоего метода ВНЕЗАПНО совпало с именем... ну вы поняли... ИМХО чем использовать ИНОГДА this (что я и делал сначала), я принял волевое xD решение использовать его ВСЕГДА - именно для повышения удобочитаемости кода.
Сообщение отредактировал tabr - May 14 2018, 10:08
|
|
|
|
|
May 14 2018, 10:49
|

Профессионал
    
Группа: Свой
Сообщений: 1 215
Регистрация: 22-02-05
Пользователь №: 2 831

|
© "Масло масляное" В крайне редких случаях использовал. Но потом по прошествии некоторого времени когда вижу "this->" в своем старом коде, то стараюсь исправить при первой же возможности. Другими словами с помощью "this->" я помечал костыли в своем коде. Поэтому, если весь код в итоге состоит из таких вот "костылей", то стоит задуматься, не пора ли "пациента" в конце концов вылечить и не мучаться  Были времена, когда поля класса помечал префиксом "_" подчеркивание. Но, к счастью, своевременно отказался, поскольку читать такой код сложно - глаза "спотыкаются" на ровном месте.
--------------------
Кругозор некоторых людей - круг с нулевым радиусом. Они называют его "точкой зрения".
|
|
|
|
|
May 14 2018, 11:50
|

Профессионал
    
Группа: Свой
Сообщений: 1 032
Регистрация: 13-03-08
Из: Маськва
Пользователь №: 35 877

|
Цитата(sigmaN @ May 14 2018, 10:23)  Может быть у кого-то еще есть аргументы? У меня два предложения. 1) поменьше думать за оптимизатор. this, не this.. Пока не доказано, что оно заметно влияет на производительность, заморачиваться не стоит. 2) Давать членам класса (да вообще, всему!) осмысленные имена, чтобы было понятно, что это, и откуда. Сам пишу без всяких this->, и очень страдаю, когда пишу self.бла-бла() :-)
--------------------
Тут обсуждается творческий порыв, а не соответствие каким-либо стандартам ©
|
|
|
|
|
May 14 2018, 17:33
|
Профессионал
    
Группа: Свой
Сообщений: 1 123
Регистрация: 8-03-09
Из: Днепр
Пользователь №: 45 848

|
Цитата(tabr @ May 14 2018, 12:50)  Код: . . . Код void SomeFunction(void) { ..//some code AAAA }
class SomeClass { ...void SomeFunction(void) ...{ ...//some another code BBBB ...} ...void SomemethodA(void) ...{ ...} ...void SomemethodB(void) ...{ ...} ...void SomemethodC(void) ...{ .....this->SomeFunction(); .....SomemethodA(); .....SomemethodB(); .....SomeFunction();//чё происходит? - тоже, что и this->SomeFunction(); some code BBBB --------------- ::SomeFunction(); // +++ some code AAAA --------------- ...}
} Y/N ?
|
|
|
|
|
May 15 2018, 05:35
|

Профессионал
    
Группа: Свой
Сообщений: 1 215
Регистрация: 22-02-05
Пользователь №: 2 831

|
Цитата(jcxz @ May 15 2018, 08:28)  Очень опасно сиё. А я с этим и не спорю. И потому нигде не применяю. Цитата Стараюсь не делать глобальных функций и член-методов с одинаковыми именами без реальной необходимости. А я вообще не использую ничего глобального. Одна из причин - как раз именно эта путаница в именах и никому не нужные сложности с именованием.
--------------------
Кругозор некоторых людей - круг с нулевым радиусом. Они называют его "точкой зрения".
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|