Я использую this
по крайней мере по двум причинам:
Причины заблуждения
Мне нравится иметь согласованные стили кода при кодировании на C ++, C, Java, C # или JavaScript. Я продолжаю использовать тот же стиль кодирования, в основном вдохновленный Java, но вдохновленный другими языками.
Мне также нравится сохранять согласованность внутри моего кода на одном языке. Я использую typename
для параметров типа шаблона вместо class
, и я никогда не играю в микшер с этими двумя. Это означает, что я ненавижу это, когда приходится добавлять this
в какой-то момент, но избегаю этого вообще.
Мой код довольно многословен. Мои имена методов могут быть длинными (или нет). Но они всегда используют полные имена и никогда не сжимают имена (то есть getNumber()
, а не getNbr()
).
Эти причины недостаточно хороши с технической точки зрения, но, тем не менее, это мой способ кодирования, и даже если они не приносят (много) добра, они не приносят (много) зла. На самом деле, в кодовой базе, над которой я работаю, более чем достаточно исторических анти-паттернов, написанных другими, чтобы они могли подвергнуть сомнению мой стиль кодирования.
К тому времени, когда они научатся писать "исключение" или "класс", я снова подумаю обо всем этом ...
Реальные причины
Хотя я ценю работу компилятора, есть некоторые двусмысленности, которые я хотел бы сделать ООН-двусмысленности.
Например, я (почти) никогда не использую using namespace MyNamespace
. Я либо использую полное пространство имен, либо использую трехбуквенный псевдоним. Мне не нравятся двусмысленности, и мне не нравится, когда компилятор внезапно говорит мне, что слишком много функций, которые "печатают", сталкиваются друг с другом.
По этой причине я ставлю функции Win32 перед глобальным пространством имен, то есть всегда пишу ::GetLastError()
вместо GetLastError()
.
То же самое относится и к this
. Когда я использую this
, я сознательно ограничиваю свободу компилятора искать альтернативный символ, если он не нашел реального. Это означает методы, а также переменные-члены.
По-видимому, это можно использовать как аргумент против перегрузки метода, возможно. Но это было бы только очевидно. Если я пишу перегруженные методы, я хочу, чтобы компилятор разрешил неоднозначность во время компиляции. Если a не пишите ключевое слово this
, это не потому, что я хочу, чтобы компилятор использовал другой символ, чем тот, который я имел в виду (например, функция вместо метода или что-то еще).
Мое заключение?
В общем, эта проблема в основном из-за стиля и по подлинным техническим причинам. Я не хочу, чтобы кто-то не писал this
.
Что касается цитаты Брюса Эккеля из его «Мыслящей Java» ... Меня не впечатлили предвзятые сравнения Java / C ++, которые он продолжает делать в своей книге (и, как ни странно, отсутствие сравнения с C #), так что его личное точка зрения о this
, сделанная в сноске ... Ну ...