В чем преимущество того, что указатель /self является обязательным в явном виде?

В чем преимущество наличия this / self / me указатель обязательно явный?

Согласно теории ООП метод должен работать в основном (только?) С переменными-членами и аргументами метода. После этого должно быть проще ссылаться на переменные-члены, чем на внешние (со стороны объекта) переменные... Явный this делает его более многословным, поэтому труднее ссылаться на переменные-члены, чем на внешние. Это кажется мне нелогичным.

6 ответов

Решение

Помимо переменных-членов и параметров метода у вас также есть локальные переменные. Одна из самых важных вещей об объекте - это его внутреннее состояние. Явная разыменование переменных-членов делает очень ясным, где вы ссылаетесь на это состояние и где вы изменяете это состояние.

Например, если у вас есть такой код:

someMethod(some, parameters) {
    ... a segment of code
    foo = 42;
    ... another segment of code
}

когда вы быстро просматриваете его, вы должны иметь мысленную модель переменных, определенных в предыдущем сегменте, чтобы знать, является ли она просто временной переменной или она изменяет состояние объектов. Принимая во внимание, что this.foo = 42 делает очевидным, что состояние объектов изменяется. И если явно используется разыменование, вы можете быть уверены, что переменная является временной в противоположном случае.

Более короткие, хорошо продуманные методы делают его немного менее важным, но, тем не менее, долговременная понятность имеет преимущество при написании кода.

Если вы говорите о "явном self"в смысле Python, вот интересная дискуссия на эту тему. Вот Гвидо, отвечающий на статью Брюса Эккеля. Комментарии к статье Брюса также поучительны (некоторые из них, так или иначе).

Что если аргументы метода имеют то же имя, что и переменные-члены? Тогда вы можете использовать this.x = x например. куда this.x является переменной-членом и x это аргумент метода. Это только один (тривиальный) пример.

Он необходим для передачи указателя / ссылки на текущий объект в другом месте или для защиты от самостоятельного назначения в операторе присваивания.

Я обычно использую это (в C++) только тогда, когда пишу оператор присваивания или конструктор копирования, поскольку это помогает четко идентифицировать переменные. Другое место, где я могу подумать об его использовании, это если имена переменных параметров вашей функции совпадают с именами переменных-членов, или я хочу убить свой объект, используя delete this.

Например, где имена членов совпадают с именами, переданными методу

public void SetScreenTemplate(long screenTemplateID, string screenTemplateName, bool isDefault)
        {
            this.screenTemplateID = screenTemplateID;
            this.screenTemplateName = screenTemplateName;
            this.isDefault = isDefault;
        }
Другие вопросы по тегам