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

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

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

Ответы [ 6 ]

21 голосов
/ 26 мая 2009

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

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

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

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

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

4 голосов
/ 26 мая 2009

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

3 голосов
/ 26 мая 2009

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

3 голосов
/ 26 мая 2009

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

2 голосов
/ 26 мая 2009

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

1 голос
/ 26 мая 2009

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

public void SetScreenTemplate(long screenTemplateID, string screenTemplateName, bool isDefault)
        {
            this.screenTemplateID = screenTemplateID;
            this.screenTemplateName = screenTemplateName;
            this.isDefault = isDefault;
        }
...