|
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, 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, 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:42
|

Ally
     
Группа: Модераторы
Сообщений: 6 232
Регистрация: 19-01-05
Пользователь №: 2 050

|
Цитата(jcxz @ May 15 2018, 08:28)  Очень опасно сиё. Ибо достаточно потом чуток изменить список аргументов вызова член-метода и забыть в одном из вызовов поправить этот список. И получить неожиданный эффект Стараюсь не делать глобальных функций и член-методов с одинаковыми именами без реальной необходимости. Пральна. Если делать программы на 1000 строк кода то можно не делать одинаковых имен. А если у вас тонны стороннего кода, то вы даже проверить толком не можете какие у вас есть глобальные имена. PHP-шники это хорошо знают потому как имеют дела с монструозными CMS-ами. Дело тут не в языке, а в масштабах. Вторая причина в IDE. Если программист владеет регулярными выражениями и одним кликом может добавить или удалить все this, то он и не заморачавается где у него и что стоит. А если писать в notepad-е, то да, любой знак не в том месте вызывает раздражение.
|
|
|
|
Сообщений в этой теме
sigmaN C++ доступ к членам класса через this-> May 14 2018, 07:23 AlexRayne Цитата(sigmaN @ May 14 2018, 10:23) Может... May 14 2018, 07:45 novikovfb ИМХО, ставить везде this-> равносильно избыточн... May 14 2018, 07:47 Сергей Борщ Согласен со всеми - с одной стороны защищает от со... May 14 2018, 08:09 Kabdim расскажите ему о (*this).something . May 14 2018, 09:10 k155la3 Видать человек при переходе на С(++) походил по с... May 14 2018, 09:17    Forger Цитата(jcxz @ May 15 2018, 08:28) Очень о... May 15 2018, 05:35 Forger © "Масло масляное"
В крайне редких случ... May 14 2018, 10:49 esaulenka Цитата(sigmaN @ May 14 2018, 10:23) Может... May 14 2018, 11:50 Nixon Да какие аргументы, в первой же строчке написано п... May 14 2018, 14:02 jcxz Цитата(sigmaN @ May 14 2018, 10:23) Первы... May 14 2018, 14:06 Сергей Борщ QUOTE (jcxz @ May 15 2018, 08:28) Стараюс... May 15 2018, 07:51 Forger Цитата(Сергей Борщ @ May 15 2018, 10:51) ... May 15 2018, 10:00  Сергей Борщ QUOTE (Forger @ May 15 2018, 13:00) Судя ... May 15 2018, 11:08   Forger Цитата(Сергей Борщ @ May 15 2018, 14:08) ... May 15 2018, 11:19 k155la3 Эт не мы. Все с англичан началось, с ихним This_IS May 15 2018, 11:07 Сергей Борщ QUOTE (k155la3 @ May 15 2018, 14:07) Эт н... May 15 2018, 21:28 sigmaN Никакого троллинга и холливара
У меня с другом сос... May 15 2018, 15:42 Forger Цитата(sigmaN @ May 15 2018, 18:42) Никак... May 15 2018, 16:07
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|