Люди часто используют const при программировании в Objective C?


13

Связано: «отправка const NSString *» параметру типа «NSString *» отменяет квалификаторы »предупреждение

Иногда я думаю, что это полезно. Мне может понадобиться передать таблицу и убедиться, что содержимое таблицы не меняется.

Тем не менее, в большинстве примеров программ Objective-C я никогда не вижу const. У меня вопрос почему?

Ответы:


21

Из-за того, как работают объекты Objective-C, он constперестает быть принудительным и становится нотацией для программиста. Рассмотрим эту программу:

int f(const int x) {
    return ++x;
}

int main(int argc, char *argv[]) {
    @autoreleasepool {
        int x = 3;
        NSLog(@"%d", f(x));
    }
    return 0;
}

Это на самом деле не скомпилируется (я использую clang): компилятор может обнаружить попытку изменить тип примитива C и выдает ошибку. Но теперь сравните это с этой программой:

NSMutableString *f2(const NSMutableString * const x) {
    [x appendString: @" world!"];
    return x;
}

int main(int argc, char *argv[]) {
    @autoreleasepool {
        NSMutableString *x = [@"Hello" mutableCopy];
        NSLog(@"%@", f2(x));
    }
    return 0;
}

Несмотря на то, что функции передается постоянный указатель на постоянный объект, все же возможно изменить объект.

В объектно-ориентированном программировании лучший способ обеспечить постоянную природу объекта состоит в том, чтобы сделать этот объект неизменным, то есть не предоставлять никаких методов, которые могут изменить его состояние. Представьте, что функция выше взяла NSStringаргумент вместо NSMutableString, и что я передал литерал @"Hello"вместо изменяемой копии. В настоящее время, по правде говоря, нет никаких шансов поменять переданный объект [*]. Objective-C не имеет никакого способа обеспечить это, в отличие от constили finalссылки на объекты в других языках OO.

Для сравнения, constв C ++ работает совершенно иначе. Если я получаю constссылку на объект C ++, мне разрешено вызывать constфункции-члены только для этого объекта. Эти функции сохраняют const-ность объекта, либо не внося никаких изменений, либо изменяя только переменные-члены, которые были явно помечены mutableконструктором класса. Итак, представьте, что у меня был какой-то тип MutableStringв C ++, который эквивалентен NSMutableStringObjective-C. Эквивалент моего примера выше будет выглядеть примерно так:

MutableString& f3(const MutableString& x) {
  x.appendString(" world!");
  return x;
}

Это определенно не скомпилируется: в дополнение к appendString()тому const, что эта функция не является операцией, она удаляет constклассификатор из ссылки на тип, для которого требуется a const_cast.

[*] Я ожидаю, что есть некоторый искаженный способ сделать это, но теперь мы находимся в сферах одного программиста, пытающегося саботировать другого, делая «умные» вещи.


Благодарю. Таким образом, нет способа предотвратить изменение с помощью модификатора const.
user4951

Правильно. Компилятор все еще рассматривает constоформление как значимое, поэтому вы получаете искажения, такие как псевдонимы или приведения, для подавления предупреждений, но в результате этих искажений поведение программы не изменяется.

5
Я полагаю, constчто все еще может быть полезно в Objective C заявить, что указатель на объект никогда не назначается для указания на другой объект . Т.е. с NSString * const xвами известно, что xвсегда будет одна и та же строка, а не другая строка.
tboyce12

3

Что касается цели C - я не программирую в ней, поэтому не могу ответить на вопрос. Хотя я могу ответить на вопрос: «Должны ли люди constмного использовать при программировании в Objective C?» - это однозначное «Да».

Constness - это, по сути, функция безопасности программного обеспечения, которая используется для повышения надежности и удобства обслуживания программ. Многие программисты растут, не понимая значения consts, пока однажды не случится что-то плохое, и у них появится момент «Ах, ха» - «О, это то, что constиспользуется для». Полностью возможно написать программу без констант, практически невозможно сделать такую ​​программу надежной.

Многие примеры кода на самом деле не являются программами, это просто фрагменты кода, предназначенные для демонстрации определенной функции. Они не используют, constпоскольку это отвлекает от того, что пытается сделать образец. Другой тип кода, который вы видите, - это код, написанный неопытными программистами, которые основывают то, что они делают, на примерах, которые они изучили, или те, которые знают о константах, и слишком ленивы, чтобы их использовать.


0

Я не использовал цель-С в течение очень долгого времени.

Однако мне интересно, почему никто не упомянул этот аспект.

Objective-c уже имеет что-то еще, связанное с константой. переменчивость

Например, Nstring * будет указывать на постоянную строку. Если вам нужна строка, которую вы можете изменить, вы используете NMutableString или что-то в этом роде. Эта NMutableString предоставит дополнительные методы, которые позволяют людям изменять строку.

А что если вы хотите, чтобы сам указатель был константой? Мне никогда не придется беспокоиться об этом при написании очень большого проекта.

Вот и думаю, поэтому.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.