Le persone usano const molto durante la programmazione in Obiettivo C?


Risposte:


21

A causa del modo in cui funzionano gli oggetti Objective-C, constsmette di essere un'applicazione e inizia a essere una notazione per il programmatore. Considera questo programma:

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

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

Questo in realtà non verrà compilato qui (sto usando clang): il compilatore può rilevare il tentativo di modificare il tipo C primitivo ed emette un errore. Ma ora confrontalo con questo programma:

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;
}

Anche se alla funzione viene passato un puntatore costante a un oggetto costante, è comunque possibile mutare l'oggetto.

Nella programmazione orientata agli oggetti, il modo migliore per imporre la natura costante di un oggetto è renderlo immutabile, ovvero non fornire alcun metodo che possa modificarne lo stato. Immagina che la funzione sopra abbia preso un NSStringargomento invece di NSMutableStringe che io abbia passato il letterale @"Hello"invece di una copia mutabile. Non c'è ora, ragionevolmente parlando, nessuna possibilità di mutare l'oggetto passato [*]. Objective-C non ha alcun modo di far rispettare che però, a differenza consto finalriferimenti agli oggetti in altri linguaggi OO.

Per fare un confronto, constfunziona in modo completamente diverso in C ++. Se ottengo un constriferimento a un oggetto C ++, posso solo chiamare le constfunzioni membro su quell'oggetto. Queste funzioni preservano il constcarattere dell'oggetto, non apportando alcuna modifica o modificando solo le variabili membro che sono state esplicitamente contrassegnate mutabledal progettista della classe. Quindi immagina di avere un tipo MutableStringin C ++ equivalente a NSMutableStringObjective-C. L'equivalente del mio esempio sopra sarebbe simile a:

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

Questo sicuramente non verrà compilato: oltre a appendString()non essere constun'operazione, la funzione rimuove il constqualificatore dal riferimento di tipo che richiede un const_cast.

[*] Mi aspetto che ci sia un modo contorto di farlo, ma ora siamo nei regni di un programmatore che cerca di sabotare un altro facendo cose "intelligenti".


Grazie. Quindi non c'è modo di impedire la modifica tramite il modificatore const.
user4951

Giusto. Il compilatore considera la constdecorazione come significativa in modo da ottenere contorsioni come alias o cast per sopprimere gli avvisi, ma non vi è alcun cambiamento nel comportamento del programma a seguito di queste contorsioni.

5
Credo che constpotrebbe ancora essere utile nell'Obiettivo C affermare che il puntatore a un oggetto non è mai assegnato a puntare a un oggetto diverso . Cioè con NSString * const xte sai che xsarà sempre la stessa stringa e non una stringa diversa.
tboyce12,

3

Per quanto riguarda l'Obiettivo C, non ci sto programmando, quindi non posso rispondere alla domanda. La domanda a cui posso rispondere è: "Le persone dovrebbero usare constmolto quando programmano nell'Obiettivo C?" - quello è un "Sì" definito.

Constness è essenzialmente una funzionalità di sicurezza del software che viene utilizzata per rendere i programmi più affidabili e gestibili. Molti programmatori crescono senza apprezzare davvero il valore di consts, fino a quando un giorno succede qualcosa di brutto e hanno un momento "Ah ah" - "Oh, questo è quello che constserve". È del tutto possibile scrivere un programma senza costanti, è praticamente impossibile rendere un programma del genere affidabile.

Molti esempi di codice non sono in realtà programmi, ma solo frammenti progettati per mostrare una funzionalità specifica. Non usano constin quanto distrae dal punto che il campione sta cercando di fare. L'altro tipo di codice che vedi è il codice scritto da programmatori inesperti che basano ciò che fanno sugli esempi da cui hanno imparato, o quelli che conoscono le costanti, e sono troppo pigri per usarli.


0

Non uso obiettivi-c da molto tempo.

Tuttavia, mi chiedo perché nessun organismo menzioni questo aspetto.

Objective-c ha già qualcos'altro legato alla costante. Mutabilità

Ad esempio, Nstring * punterà a una stringa costante. Se vuoi una stringa che puoi modificare, usi NMutableString o qualcosa del genere. Che NMutableString fornirà metodi aggiuntivi che consentono alle persone di modificare la stringa.

Ora, che dire se si desidera che il puntatore stesso sia una costante. Non devo mai preoccuparmene mentre sto programmando un progetto molto grande.

Quindi penso sia per questo.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.