Использует ли "this" для всех функций-членов и атрибутов плохой практики?
Недавно я разместил часть своего кода здесь и получил комментарий (не связанный с исходным вопросом), что с использованием this
для всех функций-членов и атрибутов класса "не просто вопрос стиля персонального кодирования, это плохая практика" . К сожалению, человек отказался уточнить и сказал, чтобы я сам это просмотрел.
Я использовал Google кучу (но это действительно трудно найти что-либо с "this" в качестве ключевого слова), и огляделся здесь, но я нашел несколько. , когда this
должен использоваться.
Я знаю ситуации, когда использование this
неизбежно (параметр/переменная с тем же именем, наследование шаблона и т.д.), но со временем я начал использовать this
везде, где это возможно, потому что я могу найти свой путь вокруг моего кода и быстрее. Мои причины включают в себя:
- быстро проверить, должна ли функция
f
быть функцией-членом вообще: если в коде нет this
, ее можно удалить из класса
- быстрая проверка, если
f
может быть функцией const
: если нет this
с левой стороны, скорее всего, можно сделать const
(не всегда, но я считаю это полезным при скимминге)
- быстрая проверка, если объект "меняет" себя "предопределенным" способом в
f
или если он является составной функцией-членом (метод-член, вызываемый с this
по сравнению с "внешним" алгоритмом, работающим на объект без этого)
- отладки; то есть, если атрибуту элемента присваивается неправильное значение в любой точке, я должен сконцентрироваться на строках, содержащих
this
, чтобы найти проблему, поскольку другие строки не изменяют объект
Честно говоря, комментарий о том, что это "плохая практика", немного меня задрожал. Но один комментарий сам по себе не имеет большого значения, поэтому я бы хотел спросить , что-то по-своему плохое при использовании this
последовательно для всех функций-членов и атрибутов? Если да, то что основные недостатки, которые ставят его (возможно, неуклюжий, непопулярный или не широко распространенный) персональный стиль и помещают его в категорию "плохая практика"?
Ответы
Ответ 1
Этот ответ основан на мнениях (как отмечают другие).
Я думаю, что это плохая практика, потому что:
- он делает код более крупным, без необходимости (самый простой код для поддержки - это тот, который вы не пишете, потому что вам не нужно).
- это неожиданно (в то время как вы можете ожидать этого, другие не будут - так что вы получите увеличенное соотношение WTF/SLOC в коде)
- это увеличивает затраты на обслуживание.
- Это требует дополнительных усилий для обеспечения согласованности кода (с небольшими или никакими дополнительными преимуществами).
- пока он выглядит последовательным, он избыточен (аналогично объявлению всех экземпляров объекта синтаксисом
class <class-name> var;
вместо <class-name> var;
и игнорированию "правила нуля" ).
- он создает привычки кодирования, которые не будут соответствовать большинству команд разработчиков и стандартам кодирования.
- Намного лучше переименовать переменные и функции, чтобы избежать коллизий имен, чем использовать
this->
(потому что имена, которые вы используете для классов, функций и переменных, составляют ментальную модель, которую вы используете для понимания структуры кода).
- после работы в течение нескольких месяцев в базе кода, которая не следует/не принимает эту практику, вы можете обнаружить, что ваш собственный код трудно читать/поддерживать (другими словами, через год или около того он может стать чистый рывок).
Ответ 2
Нет никаких технических причин, почему это невозможно использовать везде.
Если вас интересуют только технические причины, это ваш ответ. Однако я умоляю вас рассмотреть нетехнические причины. Мнения формируются по какой-то причине, некоторые из этих причин могут быть хорошими. Например, я бы предположил, что использование этого во всем случае уменьшит ремонтопригодность вашего кода, и вам будет лучше обслуживать пересмотр ваших схем именования.
Учтите, что обычно this
используется там, где это необходимо, и нигде больше. Есть причины, по которым, как вы говорите, может потребоваться this
, и когда большинство программистов сталкиваются с this
, они будут задаваться вопросом сами: "Это должно быть необходимо здесь для неочевидной причины. Интересно, что это за причина."
Консистенция является важным атрибутом поддерживаемого кода. Одна из основных проблем с использованием this
повсюду - это противоречиво - с большинством других практик программистов. Поскольку большинство других программистов не будут использовать this
везде, когда вы будете использовать его везде, это затруднит их сохранение вашего кода.