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

11

Correlati: "invio 'const NSString *' al parametro di tipo 'NSString *' scarta qualificatori "warning

A volte, penso che sia comunque utile. Potrei aver bisogno di passare una tabella e voglio assicurarmi che il contenuto della tabella non cambi.

Tuttavia, nella maggior parte degli esempi di programmi Objective-C, non vedo mai const . La mia domanda è: perché?

    
posta user4951 04.06.2012 - 10:58
fonte

3 risposte

20

A causa del modo in cui gli oggetti Objective-C funzionano, const rinuncia all'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 emettere 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 la funzione passa un puntatore costante a un oggetto costante, è ancora possibile modificare l'oggetto.

Nella programmazione orientata agli oggetti, il modo migliore per far rispettare la natura costante di un oggetto è rendere immutabile quell'oggetto - cioè non fornire alcun metodo che possa cambiare il suo stato. Immagina che la funzione precedente abbia preso un argomento NSString invece di NSMutableString e che io abbia passato il letterale @"Hello" invece di una copia mutabile. Ora, a ragione, non c'è possibilità di mutare l'oggetto passato [*]. Objective-C non ha alcun modo di farle rispettare, a differenza dei riferimenti a const o final in altri linguaggi OO.

Per confronto, const funziona in modo completamente diverso in C ++. Se ottengo un riferimento const a un oggetto C ++, sono autorizzato a chiamare const funzioni membro su quell'oggetto. Queste funzioni preservano const -ness dell'oggetto, non apportando alcuna modifica o modificando solo le variabili membro che sono state esplicitamente contrassegnate mutable dal progettista della classe. Quindi immagina di avere qualche tipo MutableString in C ++ equivalente a NSMutableString in Objective-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 essendo un'operazione const , la funzione rimuove il qualificatore const dal riferimento al tipo che richiede const_cast .

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

    
risposta data 04.06.2012 - 12:16
fonte
3

Per quanto riguarda l'obiettivo C - non lo programma, quindi non posso rispondere alla domanda. La domanda a cui posso rispondere è "Le persone dovrebbero usare molto const durante la programmazione in Objective C?" - quello è un "Sì" definito.

Constness è essenzialmente una funzione di sicurezza del software che viene utilizzata per rendere i programmi più affidabili e manutenibili. Molti programmatori crescono senza apprezzare veramente il valore di const s, finché un giorno non succede qualcosa di brutto e hanno un momento "Ah ah" - "Oh, questo è ciò che const è usato per". È assolutamente possibile scrivere un programma senza costanti, è praticamente impossibile rendere un tale programma affidabile.

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

    
risposta data 04.06.2012 - 11:30
fonte
0

Non ho usato l'obiettivo-c per un tempo molto lungo.

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

L'obiettivo-c ha già qualcos'altro relativo alla costante. Mutevolezza

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

Ora, che dire se vuoi che il puntatore stesso sia una costante. Non mi devo mai preoccupare di ciò mentre codifico un progetto molto grande.

Quindi penso che sia il motivo.

    
risposta data 17.07.2017 - 08:30
fonte

Leggi altre domande sui tag