Domanda

Il singolo di sottolineatura in Objective-C è apparentemente riservato per uso "interno" di Apple (ed era disponibile per l'uso con le variabili di istanza private precedenti la rivendicazione di Apple). Ma perché avrebbero dovuto usare un doppia -underscore nella loro SQLiteBooks esempio per l'iPhone? Vedere questo frammento tratto da MasterViewController.m:

+ (EditingViewController *)editingViewController {
    // Instantiate the editing view controller if necessary.
    if (__editingViewController == nil) {
        __editingViewController = [[EditingViewController alloc] initWithNibName:@"EditingView" bundle:nil];
    }
    return __editingViewController;
}

Non c'è menzione di uso doppia sottolineatura su questo forum quanto si riferisce alla C - è per il "uso interno di compier." Credo che non vedo come questo è applicabile in questa situazione.

Ho bisogno di un ViewController nella mia app che si comportano molto simile a quella del progetto SQLiteBooks esempio, ma questo doppio-sottolineatura mi ha perplesso.

È stato utile?

Soluzione

Né il compilatore C, né il compilatore Objective-C tratta i nomi delle variabili con leader sottolinea in modo diverso rispetto a qualsiasi altro nome di variabile. Una singola o doppia sottolineatura è semplicemente un convegno e forma in modo efficace uno spazio dei nomi, proprio come il prefisso NS utilizzato nelle classi Cocoa come NSString.

Guardando il codice SQLiteBooks, MasterViewController.m definisce questa variabile globale statica:

// Manage the editing view controller from this class so it can be easily accessed from both the detail and add controllers.
static EditingViewController *__editingViewController = nil;

Quindi la mia ipotesi è che l'autore di SQLiteBooks utilizza una doppia sottolineatura per indicare una variabile globale.

compilatori C (e per estensione Objective-C) i nomi di riserva che iniziano con due underscore e una lettera maiuscola per l'utilizzo da parte del produttore del compilatore, dando loro uno spazio dei nomi riservato da utilizzare per le variabili globali e le funzioni utilizzate per implementare librerie standard, o per introdurre nuove parole chiave non-standard come __block.

Mentre il codice SQLiteBooks è tecnicamente valida, è troppo facilmente confuso con lo spazio dei nomi riservato a mio parere. Se lo fai riutilizzare quel codice, io consiglierei di rinominare quella variabile (Xcode ha un bel refactoring di ridenominazione che lo farà automaticamente per voi).

Altri suggerimenti

Per il compilatore, sottolineature sono trattati come qualsiasi carattere alfabetico. Più in generale, però, sottolineature sono di solito utilizzati da estensioni del linguaggio o librerie di grandi dimensioni per evitare conflitti con il codice utente.

Utilizzo di sottolineatura è problematico perché un sacco di gruppi cercano di riservare ogni nome con una combinazione specifica di sottolineatura.

Apple ha usato tradizionalmente un unico prefisso di sottolineatura per indicare una variabile di istanza privata (uno stile comune in linguaggi orientati agli oggetti). Questa è stata scattata implicare che tutti dovrebbero anteporre i loro ivars di sottolineatura fino a quando Apple ha sottolineato che l'uso di una sottolineatura nel codice potrebbe creare conflitti con cacao se Apple decide di cambiare le loro intestazioni e forse non si dovrebbe. Così sottolineano prefissi sono diventati un "non consigliato" pratica di codifica.

in C e C lingue derivati, qualsiasi parola con doppia sottolineatura che precede e che segue è un'estensione del linguaggio non standard. Vedere le estensioni di Apple come __attribute __

sottolineature Trailing vengono spesso aggiunti come compilatore o il nome debugger versioni straziati di nomi originali (soprattutto quando il compilatore è multi-pass) e sono tipicamente evitato in modo che questi nomi rimangono chiaramente distinta dagli originali. Google suffisso loro variabili di istanza locale Objective-C di sottolineatura per evitare conflitti con sottolineature di Apple.

Il mio consiglio: non usare sottolineature. Non si dovrebbe usare le variabili locali con lo stesso nome di variabili di istanza (questo è solo confusione). L'unico potenziale conflitto è tra i parametri in metodi setter e le corrispondenti variabili di istanza - e probabilmente si deve anteporre il parametro con una "a" minuscola, "nuovo" (o simili) in quanto questo indica chiaramente che il parametro è il valore in arrivo ma non è ancora "il" valore.

E 'solo una convenzione di denominazione variabile. Non do nulla. E 'un modo per il programma-scrittori per ricordare se stessi, "Questa è una variabile privata".

Non è raro per i venditori di compilatore / libreria per indicare alcuni pre / suffissi come "riservato" per loro. Ciò è in gran parte al fine di evitare eventuali conflitti involontarie tra tipi / definisce / variabili ereditato.

Il post si fa riferimento è per quanto riguarda definisce, non variabili. Molti compilatori utilizzano doppio underscore per le definisce che forniscono e si basano su.

Per quanto riguarda il motivo per cui il codice di esempio utilizza questo stile -. L'autore originale ha usato lo stesso stile di codifica che probabilmente impiega nel suo lavoro quotidiano e il conflitto potenziale è stato mai evidenziato

Si dovrebbe andare bene mantenendo l'esempio di codice così com'è, ma se ti fa sentire a disagio, allora è possibile rinominare la variabile.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top