Использование self-> ivar при непосредственном доступе к переменным экземпляра - PullRequest
8 голосов
/ 22 августа 2009

Я заметил, что большинство кодировщиков Objective-C никогда не используют синтаксис self->ivar при непосредственном доступе к переменным экземпляра.Большинство примеров кода, которые я вижу, просто ссылаются на переменную экземпляра без self->.Я думаю, что довольно странно ссылаться на переменную экземпляра, не давая понять, что это переменная экземпляра, а не просто переменная текущей области видимости.

Я чувствую, что хочу написать что-то вроде:

- (void)dealloc {
    [self->someVar release];
    [self->anotherVar release];
    [super dealloc];
}

или

- (void)setVar:(Foo *)newVar {
    [self->var autorelease];
    self->var = [newVar retain];
}

Существует не так много случаев, когда мы когда-либо даже должны обращаться к переменным нашего экземпляра без использования метода доступа для инкапсуляции, но иногда нам нужно такое, как в deallocили в пользовательских методах получения и установки.

Я плохой человек / программист для этого?Есть ли действительно хорошая причина не писать такой код?Потому что очень приятно делать это таким образом.

Ответы [ 4 ]

7 голосов
/ 22 августа 2009

Чак прав в том, что нет технической причины, по которой вы не должны писать это таким образом, если только вы не скрываете ивар с локальными переменными, что обычно является плохой идеей. Тем не менее, можно утверждать, что пропуск self-> стилистически чище, и это, конечно, приводит к меньшему количеству подробного кода. Лично я бы обнаружил, что self-> отвлекает (особенно, если код хорошо спроектирован, а переменные имеют правильное имя), но если он делает вещи более понятными для вас, делайте это любыми способами. Просто имейте в виду, что если вы покажете свой код другим программистам Objective-C, у них, скорее всего, будет противоречивое мнение, так что хорошо подумать. Кроме того, большинство программистов обнаруживают, что их восприятие того, что делает код «приятным», меняется со временем и с опытом, и эти мнения часто смягчаются с возрастом. : -)

7 голосов
/ 22 августа 2009

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

4 голосов
/ 03 августа 2010

Краткий ответ: Нет, вы не плохой программист из-за этого :) Нет также веских причин не писать код таким образом; большинство программистов просто ленивы или никогда не писали изнурительный метод за всю свою жизнь.

Длинный ответ: Технически, когда вы обращаетесь к переменной без «self->», компилятор сначала ищет переменную с таким именем в локальной области видимости, и если он не может ее найти, он повторяет этот поиск с переменными экземпляра. Если он найдет там попадание, он фактически сгенерирует код, как если бы там было написано «self -> ...». Если не было совпадения для переменных экземпляра, компилятор попытался бы в глобальной области видимости.

Большинство программистов читают только свой собственный код, и они очень хорошо знают, что такое переменная экземпляра, а что нет. Когда вам когда-либо приходилось работать с кодом, который вы сами не написали, когда метод имеет длину в 4 экрана (а у меня экран bigg), вы очень благодарны, когда программист прояснил это при каждом доступе к переменной: это переменная? параметр, передаваемый в вызов метода, локальная переменная этого метода, переменная экземпляра объекта или, возможно, глобальная переменная (только глобальная для всех экземпляров этого класса или, возможно, глобального приложения). Вы благодарны, потому что, если есть только несколько переменных с похожим именем и без специального имени или шаблона доступа, но различного типа, вы довольно быстро теряете контроль. И полагаться на тот факт, что подсветка синтаксиса XCode выделяет переменные экземпляра не так, как локальные переменные, также глупо, потому что ни один программист не вынужден редактировать код в XCode для начала, и даже если он это делает, он может иметь цветовую схему, где экземпляр переменные имеют тот же цвет, что и локальные.

Доступ к переменным экземпляра через self-> - это прекрасно, но подумайте также о том, чтобы, возможно, использовать префикс / суффикс, который также прояснит, что это переменные экземпляра, а также позволит избежать конфликтов имен с параметрами метода или локальными переменными.

1 голос
/ 01 сентября 2017

Objective C автоматически добавляет подчеркивание к имени i-var, поэтому, когда вы видите «_someVar», оно неявно относится к области видимости класса. Подчеркивание является достаточным для визуального маркера, чтобы его область видимости была понятной без добавления self ->.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...