En raison de la façon dont les objets Objective-C fonctionnent, const
cesse d'être une application et commence à être une notation pour le programmeur. Considérez ce programme:
int f(const int x) {
return ++x;
}
int main(int argc, char *argv[]) {
@autoreleasepool {
int x = 3;
NSLog(@"%d", f(x));
}
return 0;
}
Cela ne compilera pas ici (j'utilise clang): le compilateur peut détecter la tentative de modification du type C primitif et émet une erreur. Mais maintenant, comparez-le avec ce programme:
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;
}
Même si la fonction reçoit un pointeur constant vers un objet constant, il est toujours possible de muter l'objet.
Dans la programmation orientée objet, la meilleure façon de faire respecter la nature constante d'un objet est de rendre cet objet immuable - c'est-à-dire de ne fournir aucune méthode pouvant changer son état. Imaginez que la fonction ci-dessus prenne un NSString
argument au lieu de NSMutableString
, et que j'avais passé le littéral @"Hello"
au lieu d'une copie mutable. Il n'y a maintenant, raisonnablement, aucune chance de muter l'objet transmis [*]. Objective-C ne dispose d' aucun moyen de faire respecter que si, à la différence const
ou les final
références d'objets dans d' autres langues OO.
À titre de comparaison, const
fonctionne entièrement différemment en C ++. Si j'obtiens une const
référence à un objet C ++, je ne suis autorisé qu'à appeler des const
fonctions membres sur cet objet. Ces fonctions préservent l' const
état de l'objet, soit en n'apportant aucune modification, soit en modifiant uniquement les variables membres qui ont été explicitement marquées mutable
par le concepteur de classe. Imaginez donc que j'avais un type MutableString
en C ++ équivalent à NSMutableString
Objective-C. L'équivalent de mon exemple ci-dessus ressemblerait à quelque chose comme:
MutableString& f3(const MutableString& x) {
x.appendString(" world!");
return x;
}
Cela ne compilera certainement pas: en plus de appendString()
ne pas être une const
opération, la fonction supprime le const
qualificatif de la référence de type qui nécessite un const_cast
.
[*] Je m'attends à ce qu'il y ait une manière déformée de le faire, mais maintenant nous sommes dans le royaume d'un programmeur essayant d'en saboter un autre en faisant des choses "intelligentes".
const
décoration comme significative, de sorte que vous obtenez des contorsions comme des alias ou des transtypages pour supprimer les avertissements, mais il n'y a aucun changement dans le comportement du programme à la suite de ces contorsions.const
pourrait encore être utile dans l'Objectif C pour déclarer que le pointeur vers un objet n'est jamais affecté pour pointer vers un autre objet . C'est à dire avecNSString * const x
vous que cex
sera toujours la même chaîne et non une chaîne différente.En ce qui concerne l'objectif C - je ne le programme pas, je ne peux donc pas répondre à la question. La question à laquelle je peux répondre est cependant: "Les gens devraient-ils utiliser
const
beaucoup lorsqu'ils programment dans l'Objectif C?" - celui-là est un "oui" certain.Constness est essentiellement une fonction de sécurité logicielle utilisée pour rendre les programmes plus fiables et plus faciles à maintenir. De nombreux programmeurs grandissent sans vraiment apprécier la valeur de
const
s, jusqu'à ce qu'un jour quelque chose de mauvais se produise et qu'ils aient un moment "Ah ha" - "Oh, c'est à celaconst
qu'on sert". Il est tout à fait possible d'écrire un programme sans constantes, il est pratiquement impossible de rendre un tel programme fiable.De nombreux exemples de code ne sont pas vraiment des programmes, juste des extraits qui sont conçus pour montrer une fonctionnalité spécifique. Ils n'utilisent pas
const
car cela distrait du point que l'échantillon essaie de faire. L'autre type de code que vous voyez est du code écrit par des programmeurs inexpérimentés qui basent ce qu'ils font sur les exemples qu'ils ont appris ou sur ceux qui connaissent les constantes et sont trop paresseux pour les utiliser.la source
Je n'ai pas utilisé objective-c depuis très longtemps.
Cependant, je me demande pourquoi aucun organisme ne mentionne cet aspect.
Objective-c a déjà quelque chose d'autre lié à constant. Mutabilité
Par exemple, Nstring * pointera vers une chaîne constante. Si vous voulez une chaîne que vous pouvez modifier, vous utilisez NMutableString ou quelque chose comme ça. Cette NMutableString fournira des méthodes supplémentaires qui permettent aux gens de modifier la chaîne.
Maintenant, qu'en est-il si vous voulez que le pointeur lui-même soit une constante. Je n'ai jamais à m'en soucier lors du codage d'un très gros projet.
Je pense que c'est pourquoi.
la source