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

StackOverflow https://stackoverflow.com/questions/910020

Вопрос

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

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

Это было полезно?

Решение

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

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

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++) только тогда, когда пишу оператор присваивания или конструктор копирования поскольку это помогает четко идентифицировать переменные.Другое место, где я могу подумать об его использовании, - это если имена переменных параметров вашей функции совпадают с именами переменных-членов, или я хочу убить свой объект, используя удалить это.

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

public void SetScreenTemplate(long screenTemplateID, string screenTemplateName, bool isDefault)
        {
            this.screenTemplateID = screenTemplateID;
            this.screenTemplateName = screenTemplateName;
            this.isDefault = isDefault;
        }
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top