В чем преимущество наличия явного указателя/self-указателя?
В чем преимущество this
/self
/me
указатель обязательный явный?
Согласно теории OOP предполагается, что метод должен работать в основном (только?) по переменным-членам и аргументам метода. После этого должно быть проще ссылаться на переменные-члены, чем на внешние (с точки зрения объекта) переменные... Явный this
делает его более подробным, поэтому сложнее для ссылки на переменные-члены, чем на внешние. Это кажется мне интуитивным противником.
Ответы
Ответ 1
В дополнение к переменным-членам и параметрам метода у вас также есть локальные переменные. Одна из самых важных вещей об объекте - его внутреннее состояние. Явное разграничение имен переменных элементов очень четко указывает, где вы ссылаетесь на это состояние и где вы изменяете это состояние.
Например, если у вас есть код:
someMethod(some, parameters) {
... a segment of code
foo = 42;
... another segment of code
}
когда вы быстро просматриваете его, вы должны иметь ментальную модель переменных, определенных в предыдущем сегменте, чтобы знать, является ли она только временной переменной или она мутирует состояние объектов. В то время как this.foo = 42 делает очевидным, что состояние объектов мутировано. И если явное разыменование используется исключительно, вы можете быть уверены, что переменная является временной в противном случае.
Более короткие, хорошо продуманные методы делают его немного менее важным, но, тем не менее, долгосрочная понятность превосходит небольшое удобство при написании кода.
Ответ 2
Если вы говорите об "явном self
" в смысле Python, здесь интересная дискуссия по этой теме. Здесь Guido отвечает на статья Брюса Экеля. Комментарии к статье Брюса также являются просветительскими (некоторые из них, во всяком случае).
Ответ 3
Что делать, если аргументы метода имеют то же имя, что и переменные-члены? Затем вы можете использовать this.x = x
, например. Где this.x
- переменная-член, а x
- аргумент метода.
Это один (тривиальный) пример.
Ответ 4
Вам понадобится передать указатель/ссылку на текущий объект в другом месте или защитить себя от самозадачи в операторе присваивания.
Ответ 5
Обычно я использую это (в С++) только тогда, когда я пишу оператор присваивания или конструктор , поскольку он помогает четко идентифицировать переменные. Другое место, где я могу думать о его использовании, - это то, что ваши имена переменных параметра функции такие же, как имена переменных вашего члена, или я хочу убить свой объект, используя удалить это.
Ответ 6
Например, имена членов будут такими же, как те, которые переданы методу
public void SetScreenTemplate(long screenTemplateID, string screenTemplateName, bool isDefault)
{
this.screenTemplateID = screenTemplateID;
this.screenTemplateName = screenTemplateName;
this.isDefault = isDefault;
}