реклама на сайте
подробности

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> C++ доступ к членам класса через this->, чем чревато злоуотребление?
sigmaN
сообщение May 14 2018, 07:23
Сообщение #1


I WANT TO BELIEVE
******

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



Один мой товарищ( как говорится, не к ночи будет помянут сей язык, бывший PHPшник) в C++ коде для AVR8 везде лепит this->

Вот пример его кода https://pastebin.com/hqyYcQYh

Аргументирует он это тем, что так якобы понятнее, что это член класса.
Хотя, конечно-же, это решается нэймингом.

В общем-то на C++ так никто не пишет, но хотелось бы привести весомые аргументы почему именно.

Первый аргумент, который я привел: this это указатель. Используя его мы подрезаем ноги оптимизатору, который, как я понимаю, на много аккуратнее относится к оптимизации indirect access
И может быть в каких-то простых случаях он этот this и упразднит, но тем не менее.

Может быть у кого-то еще есть аргументы? Мне даже самому стало интересно. Уже который год эта тема у нас с ним регулярно поднимается. Прям холливар Сишника и бывшего ПХПшника biggrin.gif


--------------------
The truth is out there...
Go to the top of the page
 
+Quote Post
AlexRayne
сообщение May 14 2018, 07:45
Сообщение #2


Местный
***

Группа: Участник
Сообщений: 319
Регистрация: 27-09-07
Пользователь №: 30 877



Цитата(sigmaN @ May 14 2018, 10:23) *
Может быть у кого-то еще есть аргументы? Мне даже самому стало интересно. Уже который год эта тема у нас с ним регулярно поднимается. Прям холливар Сишника и бывшего ПХПшника biggrin.gif

тоже встречаю такой код. имхо, это подстелить соломку, дуть на воду после молока - как раз защищает от ошибочного нейминга. если объявить в функции локальное имя, перекрывающее поле класса, то получим непонятку.
если класс большой, то обнаружить что локальная переменная перекрыла поле, может быть не всегда тривиально.
Go to the top of the page
 
+Quote Post
novikovfb
сообщение May 14 2018, 07:47
Сообщение #3


Знающий
****

Группа: Участник
Сообщений: 518
Регистрация: 29-09-11
Пользователь №: 67 450



ИМХО, ставить везде this-> равносильно избыточному написанию скобок в выражениях: не мешает компилятору, но в случае перебора текст становится громоздким.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение May 14 2018, 08:09
Сообщение #4


Гуру
******

Группа: Модераторы
Сообщений: 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)
Go to the top of the page
 
+Quote Post
Kabdim
сообщение May 14 2018, 09:10
Сообщение #5


Знающий
****

Группа: Свой
Сообщений: 558
Регистрация: 26-11-14
Из: Зеленоград
Пользователь №: 83 842



расскажите ему о (*this).something .
Go to the top of the page
 
+Quote Post
k155la3
сообщение May 14 2018, 09:17
Сообщение #6


Профессионал
*****

Группа: Свой
Сообщений: 1 123
Регистрация: 8-03-09
Из: Днепр
Пользователь №: 45 848



Видать человек при переходе на С(++) походил по своим, исконным, граблям и решил их не убирать, а устранять последствия (спец-шлем this->).
Сейчас и граблей уже нет, и забыто зачем это делалось. А привычка осталась.

Возможно связано с тем, что в приведенном коде вся реализация класса находится в h-файле.
А кода в cpp модуле с ф-ми в виде
Код
uint8_t TimeClass::GetSecond(void) {  }
не наблюдается. Соотв-но под вопросом информированность об операторе :: и
определение области видимости вообще. Как с этим делом в PHP - не знаю, не плавал.
Go to the top of the page
 
+Quote Post
tabr
сообщение May 14 2018, 09:50
Сообщение #7





Группа: Участник
Сообщений: 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
Go to the top of the page
 
+Quote Post
Forger
сообщение May 14 2018, 10:49
Сообщение #8


Профессионал
*****

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



© "Масло масляное"

В крайне редких случаях использовал.
Но потом по прошествии некоторого времени когда вижу "this->" в своем старом коде, то стараюсь исправить при первой же возможности.
Другими словами с помощью "this->" я помечал костыли в своем коде.

Поэтому, если весь код в итоге состоит из таких вот "костылей", то стоит задуматься, не пора ли "пациента" в конце концов вылечить и не мучаться wink.gif

Были времена, когда поля класса помечал префиксом "_" подчеркивание. Но, к счастью, своевременно отказался, поскольку читать такой код сложно - глаза "спотыкаются" на ровном месте.


--------------------
Кругозор некоторых людей - круг с нулевым радиусом. Они называют его "точкой зрения".
Go to the top of the page
 
+Quote Post
esaulenka
сообщение May 14 2018, 11:50
Сообщение #9


Профессионал
*****

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



Цитата(sigmaN @ May 14 2018, 10:23) *
Может быть у кого-то еще есть аргументы?


У меня два предложения.
1) поменьше думать за оптимизатор. this, не this.. Пока не доказано, что оно заметно влияет на производительность, заморачиваться не стоит.
2) Давать членам класса (да вообще, всему!) осмысленные имена, чтобы было понятно, что это, и откуда.

Сам пишу без всяких this->, и очень страдаю, когда пишу self.бла-бла() :-)


--------------------
Тут обсуждается творческий порыв, а не соответствие каким-либо стандартам ©
Go to the top of the page
 
+Quote Post
Nixon
сообщение May 14 2018, 14:02
Сообщение #10


Гуру
******

Группа: Админы
Сообщений: 2 736
Регистрация: 17-06-04
Из: Киев
Пользователь №: 48



Да какие аргументы, в первой же строчке написано почему - человек пришел из php. Вы еще кода перешедших с питона не видели sm.gif


--------------------
Вам помочь или не мешать?
Go to the top of the page
 
+Quote Post
jcxz
сообщение May 14 2018, 14:06
Сообщение #11


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(sigmaN @ May 14 2018, 10:23) *
Первый аргумент, который я привел: this это указатель. Используя его мы подрезаем ноги оптимизатору, который, как я понимаю, на много аккуратнее относится к оптимизации indirect access
И может быть в каких-то простых случаях он этот this и упразднит, но тем не менее.

А какая разница оптимизатору: явное указание this или его неявное подразумевание? Один фиг это косвенное обращение через указатель. Ему должно быть одинаково.
Go to the top of the page
 
+Quote Post
k155la3
сообщение May 14 2018, 17:33
Сообщение #12


Профессионал
*****

Группа: Свой
Сообщений: 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 ?
Go to the top of the page
 
+Quote Post
Forger
сообщение May 14 2018, 19:35
Сообщение #13


Профессионал
*****

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



Если не ошибаюсь, то локальные методы/поля имеют приоритет над глобальными методами (функциями)/переменными.
Другими словами: чем уже область видимости, тем больше преимущество (если тут можно применить такой термин).
Речь про одинаковые названия.
Но дабы не гадать как себя поведет тот или иной компилятор, стоит вообще избегать таких ситуаций.
Поскольку найти потом подобные ошибки будет крайне сложно!


--------------------
Кругозор некоторых людей - круг с нулевым радиусом. Они называют его "точкой зрения".
Go to the top of the page
 
+Quote Post
jcxz
сообщение May 15 2018, 05:28
Сообщение #14


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(Forger @ May 14 2018, 22:35) *
Если не ошибаюсь, то локальные методы/поля имеют приоритет над глобальными методами (функциями)/переменными.
Другими словами: чем уже область видимости, тем больше преимущество (если тут можно применить такой термин).

Очень опасно сиё. Ибо достаточно потом чуток изменить список аргументов вызова член-метода и забыть в одном из вызовов поправить этот список. И получить неожиданный эффект biggrin.gif
Стараюсь не делать глобальных функций и член-методов с одинаковыми именами без реальной необходимости.
Go to the top of the page
 
+Quote Post
Forger
сообщение May 15 2018, 05:35
Сообщение #15


Профессионал
*****

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



Цитата(jcxz @ May 15 2018, 08:28) *
Очень опасно сиё.

А я с этим и не спорю. И потому нигде не применяю.

Цитата
Стараюсь не делать глобальных функций и член-методов с одинаковыми именами без реальной необходимости.

А я вообще не использую ничего глобального. Одна из причин - как раз именно эта путаница в именах и никому не нужные сложности с именованием.


--------------------
Кругозор некоторых людей - круг с нулевым радиусом. Они называют его "точкой зрения".
Go to the top of the page
 
+Quote Post

2 страниц V   1 2 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 7th July 2025 - 04:05
Рейтинг@Mail.ru


Страница сгенерированна за 0.01486 секунд с 7
ELECTRONIX ©2004-2016