Les gens utilisent-ils beaucoup const lors de la programmation en objectif C?

Réponses:

21

En raison de la façon dont les objets Objective-C fonctionnent, constcesse 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 NSStringargument 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 constou les finalréférences d'objets dans d' autres langues OO.

À titre de comparaison, constfonctionne entièrement différemment en C ++. Si j'obtiens une constréférence à un objet C ++, je ne suis autorisé qu'à appeler des constfonctions 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 mutablepar le concepteur de classe. Imaginez donc que j'avais un type MutableStringen C ++ équivalent à NSMutableStringObjective-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 constopération, la fonction supprime le constqualificatif 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".


la source
Merci. Il n'y a donc aucun moyen d'empêcher la modification via le modificateur const.
user4951
Droite. Le compilateur considère toujours la constdé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.
5
Je crois que cela constpourrait 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 avec NSString * const xvous que ce xsera toujours la même chaîne et non une chaîne différente.
tboyce12
3

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 constbeaucoup 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 consts, jusqu'à ce qu'un jour quelque chose de mauvais se produise et qu'ils aient un moment "Ah ha" - "Oh, c'est à cela constqu'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 constcar 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.

mattnz
la source
0

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.

user4951
la source